class TestTabuSearch(unittest.TestCase): def setUp(self): self.flow = [ [0, 1, 2], [4, 0, 5], [7, 2, 0]] self.distance = [ [0, 5, 2], [1, 0, 1], [6, 2, 0]] self.i = Instance(None, self.distance, self.flow) self.e = E(self.i) self.ts = TabuSearch() self.startpoint = Solution((0, 1, 2)) def test_filter_moves(self): moves = [(1, 2), (1, 3), (2, 3)] tabu = defaultdict(int, {(1, 2): 1, (2, 3): 1}) expected = [(1, 3)] actual = list(self.ts._get_filtered_moves(moves, tabu=tabu)) self.assertEqual(expected, actual) def test_filter_moves_with_aspiration(self): self.i = Instance(None, self.distance, self.flow) self.e = E(self.i) self.startpoint = Solution((2, 1, 0)) moves = [(0, 1), (0, 2), (1, 2)] tabu = defaultdict(int, {(0, 1): 1, (1, 2): 2, (0, 2): 3}) expected = [(0, 1), (0, 2), (1, 2)] actual = list(self.ts._get_filtered_moves(moves, e=self.e, current=(self.startpoint, self.e.evaluate(self.startpoint)), tabu=tabu)) self.assertEqual(expected, actual) def test_decrease_tabu_penalty(self): tabu = defaultdict(int, {(1, 2): 2, (2, 3): 1}) expected = [(1, 2)] self.ts._decrease_tabu_penalty(tabu) actual = tabu.keys() self.assertEqual(expected, actual) def test_select_best_move(self): current = self.startpoint moves = [(0, 1), (0, 2), (1, 2)] expected = (0, 2) actual = self.ts._select_best_move(current, moves, self.e) self.assertEqual(expected, actual) def test_select_best_moves(self): current = self.startpoint moves = [(0, 1), (0, 2), (1, 2)] expected = [(0, 2), (1, 2)] actual = self.ts._select_best_moves(current, moves, self.e, 2) self.assertEqual(expected, actual) def test_with_startpoint(self): expected = (2, 1, 0) actual = self.ts.solve(self.i, self.startpoint).sequence self.assertEqual(expected, actual)