def _local_search(problem, fringe_expander, iterations_limit=0, fringe_size=1, random_initial_states=False, stop_when_no_better=True): ''' Basic algorithm for all local search algorithms. ''' fringe = BoundedPriorityQueue(fringe_size) if random_initial_states: for _ in xrange(fringe_size): s = problem.generate_random_state() fringe.append(SearchNodeValueOrdered(state=s, problem=problem)) else: fringe.append(SearchNodeValueOrdered(state=problem.initial_state, problem=problem)) iteration = 0 run = True best = None while run: old_best = fringe[0] fringe_expander(fringe, iteration) best = fringe[0] iteration += 1 if iterations_limit and iteration >= iterations_limit: run = False elif old_best.value >= best.value and stop_when_no_better: run = False return best
def _local_search(problem, fringe_expander, iterations_limit=0, fringe_size=1, random_initial_states=False): ''' Basic algorithm for all local search algorithms. ''' fringe = BoundedPriorityQueue(fringe_size) if random_initial_states: for _ in xrange(fringe_size): s = problem.generate_random_state() fringe.append(SearchNodeValueOrdered(state=s, problem=problem)) else: fringe.append( SearchNodeValueOrdered(state=problem.initial_state, problem=problem)) iteration = 0 run = True best = None while run: old_best = fringe[0] fringe_expander(fringe, iteration) best = fringe[0] iteration += 1 if iterations_limit and iteration >= iterations_limit: run = False elif old_best.value() >= best.value(): run = False return best
def test_remove(self): q = BoundedPriorityQueue(2) a = DummyNode(1) b = DummyNode(2) q.append(a) q.append(b) q.remove(a) self.assertEqual(len(q), 1) self.assertIs(q[0], b)
def _local_search(problem, fringe_expander, iterations_limit=0, fringe_size=1, random_initial_states=False, stop_when_no_better=True, viewer=None): ''' Basic algorithm for all local search algorithms. ''' if viewer: viewer.event('started') fringe = BoundedPriorityQueue(fringe_size) if random_initial_states: for _ in range(fringe_size): s = problem.generate_random_state() fringe.append(SearchNodeValueOrdered(state=s, problem=problem)) else: fringe.append( SearchNodeValueOrdered(state=problem.initial_state, problem=problem)) finish_reason = '' iteration = 0 run = True best = None while run: if viewer: viewer.event('new_iteration', list(fringe)) old_best = fringe[0] fringe_expander(fringe, iteration, viewer) best = fringe[0] iteration += 1 if iterations_limit and iteration >= iterations_limit: run = False finish_reason = 'reaching iteration limit' elif old_best.value >= best.value and stop_when_no_better: run = False finish_reason = 'not being able to improve solution' if viewer: viewer.event('finished', fringe, best, 'returned after %s' % finish_reason) return best
def _local_search(problem, fringe_expander, iterations_limit=0, fringe_size=1, random_initial_states=False, stop_when_no_better=True, viewer=None): ''' Basic algorithm for all local search algorithms. ''' if viewer: viewer.event('started') fringe = BoundedPriorityQueue(fringe_size) if random_initial_states: for _ in range(fringe_size): s = problem.generate_random_state() fringe.append(SearchNodeValueOrdered(state=s, problem=problem)) else: fringe.append(SearchNodeValueOrdered(state=problem.initial_state, problem=problem)) finish_reason = '' iteration = 0 run = True best = None while run: if viewer: viewer.event('new_iteration', list(fringe)) old_best = fringe[0] fringe_expander(fringe, iteration, viewer) best = fringe[0] iteration += 1 if iterations_limit and iteration >= iterations_limit: run = False finish_reason = 'reaching iteration limit' elif old_best.value >= best.value and stop_when_no_better: run = False finish_reason = 'not being able to improve solution' if viewer: viewer.event('finished', fringe, best, 'returned after %s' % finish_reason) return best
def genetic_search_iteration(problem, mutation_chance=0.1, population_size=1, initial_population= None): ''' Basic algorithm for all local search algorithms. ''' fringe_expander = _create_genetic_expander(problem, mutation_chance) fringe_size = population_size fringe = BoundedPriorityQueue(fringe_size) if initial_population is None: for _ in xrange(fringe_size): s = problem.generate_random_state() fringe.append(SearchNodeValueOrdered(state=s, problem=problem)) else: for instance in initial_population: fringe.append(SearchNodeValueOrdered(state=instance, problem=problem)) old_best = fringe[0] fringe_expander(fringe, 0) best = fringe[0] return best
def test_sorted_priority(self): q = BoundedPriorityQueue() q.append(DummyNode(3)) q.append(DummyNode(1)) q.append(DummyNode(2)) self.assertTrue(sorted_equals_pop(q))
def test_limit_works_on_append(self): q = BoundedPriorityQueue(2) q.append(DummyNode(1)) q.append(DummyNode(1)) q.append(DummyNode(1)) self.assertEqual(len(q), 2)
def test_pop_works_with_order(self): q = BoundedPriorityQueue() q.append(DummyNode(3)) q.append(DummyNode(1)) q.append(DummyNode(2)) self.assertEqual(q.pop().value, 1)
def test_append_works(self): q = BoundedPriorityQueue() q.append(DummyNode(1)) q.append(DummyNode(1)) self.assertEqual(len(q), 2)