def test_group_only_if_all_parameters_match(self): # Given first_train_1 = TrainRoute('', '', '', '', '0', '', '') first_train_2 = TrainRoute('', '', '', '', '0', '', '') first_train_3 = TrainRoute('', '', '', '', '0', '', '') second_train_1 = TrainRoute('', '', '', '', '1', '', '') second_train_2 = TrainRoute('', '', '', '', '1', '', '') second_train_3 = TrainRoute('', '', '', '', '1', '', '') route_1 = Route(first_train_1, second_train_1, '4') route_2 = Route(first_train_2, second_train_2, '5') route_3 = Route(first_train_3, second_train_3, '6') routes = [route_1, route_2, route_3] # When grouped = Route.group_routes(routes) # Then self.assertEqual(3, len(grouped)) self.assertEqual(['0', '1', '4'], [ grouped[0].first_train.number_train, grouped[0].second_train.number_train, grouped[0].total_time ]) self.assertEqual(['0', '1', '5'], [ grouped[1].first_train.number_train, grouped[1].second_train.number_train, grouped[1].total_time ]) self.assertEqual(['0', '1', '6'], [ grouped[2].first_train.number_train, grouped[2].second_train.number_train, grouped[2].total_time ])
def test_group_all_routes_same(self): first_train = TrainRoute('', '', '', '', '3310', '', '') second_train = TrainRoute('', '', '', '', '3310', '', '') route_1 = Route(first_train, second_train, '12') route_2 = Route(first_train, second_train, '12') route_3 = Route(first_train, second_train, '12') routes = [route_1, route_2, route_3] grouped = Route.group_routes(routes) self.assertEqual(1, len(grouped)) self.assertEqual(['3310', '3310', '12'], [ grouped[0].first_train.number_train, grouped[0].second_train.number_train, grouped[0].total_time ])
def parse_json_route(self, route_file_path): try: with open(route_file_path, "r") as read_file: route_dict = json.load(read_file) except json.decoder.JSONDecodeError: return None game_name = self._read_key(route_dict, 'Game name') route_name = self._read_key(route_dict, 'Route name') splits = self._read_key(route_dict, 'Splits') fade_nums = self._read_key(route_dict, 'Fadeout counts') # Converts json input (string) to a list of integers try: splits = [int(s) for s in splits.split(',')] except (ValueError, AttributeError): splits = None try: fade_nums = [int(s) for s in fade_nums.split(',')] except (ValueError, AttributeError): fade_nums = None # is_ordered = self._read_key(route_dict, 'Ordered') if splits == None or fade_nums == None: return None route = Route(game_name, route_name, splits, fade_nums) return route
def test_expand_returns_empty_list_when_routes_has_no_matches(self): # Given first_train_selected = TrainRoute('', '', '', '', '14', '', '') second_train_selected = TrainRoute('', '', '', '', '18', '', '') selected_route = Route(first_train_selected, second_train_selected, '1') first_train_2 = TrainRoute('', '', '', '', '13', '', '') second_train_2 = TrainRoute('', '', '', '', '17', '', '') route_2 = Route(first_train_2, second_train_2, '1') routes = [route_2] # When unfolded = Route.unfold_routes(selected_route, routes) # Then self.assertEqual(0, len(unfolded))
def test_expand_returns_only_selected_when_no_other_matches(self): # Given first_train_selected = TrainRoute('', '', '', '', '11', '', '') second_train_selected = TrainRoute('', '', '', '', '15', '', '') selected_route = Route(first_train_selected, second_train_selected, '1') first_train_2 = TrainRoute('', '', '', '', '12', '', '') second_train_2 = TrainRoute('', '', '', '', '16', '', '') route_2 = Route(first_train_2, second_train_2, '1') routes = [selected_route, route_2] # When unfolded = Route.unfold_routes(selected_route, routes) # Then self.assertEqual(1, len(unfolded)) self.assertEqual(['11', '15', '1'], [ unfolded[0].first_train.number_train, unfolded[0].second_train.number_train, unfolded[0].total_time ])
def test_expand_routes_only_if_all_parameters_match(self): # Given first_train_selected = TrainRoute('', '', '', '', '11', '', '') second_train_selected = TrainRoute('', '', '', '', '12', '', '') selected_route = Route(first_train_selected, second_train_selected, '1') first_train_2 = TrainRoute('', '', '', '', '11', '', '') first_train_3 = TrainRoute('', '', '', '', '11', '', '') first_train_4 = TrainRoute('', '', '', '', '11', '', '') first_train_5 = TrainRoute('', '', '', '', '14', '', '') second_train_2 = TrainRoute('', '', '', '', '12', '', '') second_train_3 = TrainRoute('', '', '', '', '12', '', '') second_train_4 = TrainRoute('', '', '', '', '13', '', '') second_train_5 = TrainRoute('', '', '', '', '12', '', '') route_2 = Route(first_train_2, second_train_2, '1') route_3 = Route(first_train_3, second_train_3, '2') route_4 = Route(first_train_4, second_train_4, '1') route_5 = Route(first_train_4, second_train_4, '1') routes = [selected_route, route_2, route_3, route_4, route_5] # When unfolded = Route.unfold_routes(selected_route, routes) # Then self.assertEqual(2, len(unfolded)) self.assertEqual(['11', '12', '1'], [ unfolded[0].first_train.number_train, unfolded[0].second_train.number_train, unfolded[0].total_time ]) self.assertEqual(['11', '12', '1'], [ unfolded[1].first_train.number_train, unfolded[1].second_train.number_train, unfolded[1].total_time ])
def test_constructor(self): first_train = TrainRoute('КРАКІВ (ПОЛЬЩА)', '20:52', 'Мушкетове', '07:15', '3310', 'ВРОЦЛАВ ЛЬВІВ', '14/09-16/10/2015 ЩОДЕННО') second_train = TrainRoute('ЛЬВІВ', '09:40', 'Hillerod', '16:02', '74', 'ЛЬВІВ МОСКВА', 'З 29/03/2015 ЩОДЕННО (КРІМ 2/09/2015)') total_time_route = '19' route = Route(first_train, second_train, total_time_route) self.assertEqual(first_train, route.first_train) self.assertEqual(second_train, route.second_train) self.assertEqual(total_time_route, route.total_time)
def fit(self, map_matrix, start, finish, iterations=100, n_paths=3): self._map = map_matrix self._initialize() a = datetime.datetime.now() for i in range(iterations): paths = [] for ant in range(self._n_ants): current_city = self._unvisited_cities[start] route = Route([current_city]) while current_city != finish and len( self._unvisited_cities) > 1 and route.get_length( ) < self._nth_best: self._unvisited_cities.remove(current_city) current_node_index = self._choose_next_city(current_city) current_city = self._unvisited_cities[current_node_index] route.add_city( current_city, self._get_distance(route.get_last_city(), current_city)) paths.append(route) self._add_pheromone(route, route.get_length(), 1) self._unvisited_cities = list(range(len(self._map.graph))) self._paths[route.get_length()] = route best_path, min_length = self._evaluate(paths) if min_length < self._alltime_min: self._alltime_min = min_length self._best_path = best_path self._update(self._best_path, self._elitist_weight) b = datetime.datetime.now() delta = b - a best_n_distances = [] best_n_paths = [] distances_sorted = sorted(self._paths.keys()) if len(distances_sorted) < n_paths: n_paths = len(distances_sorted) for i in range(n_paths): key = distances_sorted[i] best_n_distances.append(key) best_n_paths.append(self._paths[key]) return best_n_distances, best_n_paths, delta.total_seconds() * 1000
def read_from_file(filename): """ Reads the lines from the file and returns an the matrix dimensions, the integer matrix, the number of routes and a list of routes from the read data :param filename: The path of the data file """ no_rows = 0 no_cols = 0 matrix = [] no_routes = 0 routes = [] with open(filename, "r") as file: for line in file: elements = line.strip("\n").split(" ") # Save the number of routes if len(elements) == 1: no_routes = int(elements[0]) # Save the number of rows and cols elif len(elements) == 2: no_rows, no_cols = int(elements[0]), int(elements[1]) # Save the route elif len(elements) == 5: routes.append(Route(*elements)) # Replace any non-zero values with negative one, all zero values with maximum possible value # and save the line in the matrix else: matrix.append([ -1 if int(number) != 0 and int(number) != 2 else no_rows * no_cols for number in elements ]) return no_rows, no_cols, matrix, no_routes, routes
def test_group_some_routes_same(self): # Given first_train_1 = TrainRoute('', '', '', '', '0', '', '') first_train_2 = TrainRoute('', '', '', '', '1', '', '') first_train_3 = TrainRoute('', '', '', '', '2', '', '') first_train_4 = TrainRoute('', '', '', '', '1', '', '') first_train_5 = TrainRoute('', '', '', '', '0', '', '') second_train_1 = TrainRoute('', '', '', '', '0', '', '') second_train_2 = TrainRoute('', '', '', '', '1', '', '') second_train_3 = TrainRoute('', '', '', '', '2', '', '') second_train_4 = TrainRoute('', '', '', '', '1', '', '') second_train_5 = TrainRoute('', '', '', '', '0', '', '') route_1 = Route(first_train_1, second_train_1, '1') route_2 = Route(first_train_2, second_train_2, '2') route_3 = Route(first_train_3, second_train_3, '3') route_4 = Route(first_train_4, second_train_4, '2') route_5 = Route(first_train_5, second_train_5, '1') routes = [route_1, route_2, route_3, route_4, route_5] # When grouped = Route.group_routes(routes) # Then self.assertEqual(3, len(grouped)) self.assertEqual(['0', '0', '1'], [ grouped[0].first_train.number_train, grouped[0].second_train.number_train, grouped[0].total_time ]) self.assertEqual(['1', '1', '2'], [ grouped[1].first_train.number_train, grouped[1].second_train.number_train, grouped[1].total_time ]) self.assertEqual(['2', '2', '3'], [ grouped[2].first_train.number_train, grouped[2].second_train.number_train, grouped[2].total_time ])