Exemplo n.º 1
0
    def check_solution(self):
        # metoda sprawdzająca czy rozwiązanie jest prawidłowe
        if self.salesman_max_time is None:
            # wyświetlenie komunikatu o błędzie jeśli czas pracy komiwojażera nie został wczytany
            self.info_message('Wczytaj najpierw czas pracy Komiwojażera')
            return

        if not self.solution:
            # wyświetlenie komunikatu o błędzie jeśli rozwiązanie nie zostało wczytane lub wyznaczone
            self.error_message('Brak wczytanego lub obliczonego rozwiązania')
            return

        if not self.cities or not self.connections:
            # do weryfikacji poprawności trasy potrzebujemy listy miast i połączeń między nimi
            self.info_message(
                'Do weryfikacji poprawności trasy niezbędne są: lista miast oraz połączeń między nimi'
            )
            return

        # przekształcamy trasę rozwiązania do postaci obiektu Route
        cities = GeneticAlgorithm.construct_cities(
            self.cities, self.connections)  # najpierw tworzymy miasta
        solution_cities = [city[0] for city in self.solution
                           ]  # wybieramy tylko id miast trasy rozwiązania
        route = Route(solution_cities, cities)  # tworzymy obiekt Route

        if route.is_valid(self.salesman_max_time):
            # jeżeli rozwiązanie jest poprawne to poinformowanie o tym użytkownika
            self.info_message('Trasa jest poprawna')
        elif route.invalid_cause == 'less than 2 cities':
            # poinformowanie użytkownika, że rozwiązanie jest błędne, bo ma mniej niż 2 miasta
            self.info_message('Trasa składa się z mniej niż dwóch miast')
        elif route.invalid_cause == 'cities not connected':
            # poinformowanie użytkownika, że rozwiązanie jest błędne, bo nie jest możliwe połączenie miast na trasie
            self.info_message(
                'Na trasie sąsiadują ze sobą miasta, które nie są ze sobą połączone'
            )
        elif route.invalid_cause == 'too long':
            # poinformowanie użytkownika, że rozwiązanie jest błędne, bo pokonanie trasy przekracza czas pracy
            # komiwojażera
            self.info_message(
                'Długość trasy przekracza ograniczenie Komiwojażera')
        else:
            # poinformowanie, że trasa nie jest poprawna z innego powodu
            self.info_message('Trasa nie jest poprawna')
Exemplo n.º 2
0
    def save_solution(self, filename):
        # metoda zapisująca rozwiązanie do pliku filename jeśli rozwiązanie istnieje
        # w przeciwnym razie poinformowanie użytkownika, że rozwiązanie nie zostało wyznaczone lub wczytane
        if not self.solution:
            self.error_message('Brak rozwiązania, które można zapisać')
            return

        if not self.connections:
            self.error_message(
                'W celu zapisania rozwiązania niezbędne są dane miast')
            return

        if not self.cities:
            self.error_message(
                'W celu zapisania rozwiązania niezbędne są dane połączeń między miastami'
            )
            return

        # przekształcenie do wymaganego formatu
        solution = [[str(element) for element in city]
                    for city in self.solution]
        route_string = [','.join(city) for city in solution]
        route_string = [f'({city})' for city in route_string]
        route_string = ','.join(route_string)
        route_string = f'[{route_string}]'

        cities = GeneticAlgorithm.construct_cities(self.cities,
                                                   self.connections)
        solution_cities = [city[0] for city in self.solution
                           ]  # wybieramy tylko id miast
        route = Route(solution_cities, cities)
        data = '\r\n'.join(
            [route_string,
             str(route.fitness),
             str(route.distance)])

        # upewniamy się, że nazwa pliku, który zapisujemy ma rozszerzenie .txt i dodajemy jeśli nie ma
        if not filename.endswith('.txt'):
            filename += '.txt'
        IO.save_solution(data, filename)
Exemplo n.º 3
0
	def test_valid5(self):
		test_route = Route([], self.cities)
		assert test_route.is_valid(5) is False, 'Źle sprawdza poprawność trasy'
		assert test_route.invalid_cause == 'too long', 'Zła przyczyna niepoprawności trasy'
Exemplo n.º 4
0
	def test_valid4(self):
		test_route = Route(['Miasto1'], self.cities)
		assert test_route.is_valid(5) is False, 'Źle sprawdza poprawność trasy'
		assert test_route.invalid_cause == 'less than 2 cities', 'Zła przyczyna niepoprawności trasy'
Exemplo n.º 5
0
	def test_valid3(self):
		test_route = Route(['Miasto1', 'Miasto3'], self.cities)
		assert test_route.is_valid(5) is False, 'Źle sprawdza poprawność trasy'
		assert test_route.invalid_cause == 'cities not connected', 'Zła przyczyna niepoprawności trasy'
Exemplo n.º 6
0
	def test_valid1(self):
		test_route = Route(['Miasto1', 'Miasto2'], self.cities)
		assert test_route.is_valid(5) is True, 'Źle sprawdza poprawność trasy'
Exemplo n.º 7
0
	def test_fitness3(self):
		test_route = Route([], self.cities)
		assert test_route.fitness == 0, 'Źle oblicza zysk na trasie'
Exemplo n.º 8
0
	def test_fitness2(self):
		test_route = Route(['Miasto1'], self.cities)
		assert test_route.fitness == 5, 'Źle oblicza zysk na trasie'
Exemplo n.º 9
0
	def test_distance3(self):
		test_route = Route([], self.cities)
		assert test_route.distance == 0, 'Źle oblicza odległość trasy'
Exemplo n.º 10
0
	def test_distance1(self):
		test_route = Route(['Miasto1', 'Miasto2'], self.cities)
		assert test_route.distance == 2, 'Źle oblicza odległość trasy'