Esempio n. 1
0
 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
     ])
Esempio n. 2
0
    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
        ])
Esempio n. 3
0
    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
Esempio n. 4
0
    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))
Esempio n. 5
0
    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
        ])
Esempio n. 6
0
    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
        ])
Esempio n. 7
0
    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
Esempio n. 10
0
    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
        ])