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')
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)
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'
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'
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'
def test_valid1(self): test_route = Route(['Miasto1', 'Miasto2'], self.cities) assert test_route.is_valid(5) is True, 'Źle sprawdza poprawność trasy'
def test_fitness3(self): test_route = Route([], self.cities) assert test_route.fitness == 0, 'Źle oblicza zysk na trasie'
def test_fitness2(self): test_route = Route(['Miasto1'], self.cities) assert test_route.fitness == 5, 'Źle oblicza zysk na trasie'
def test_distance3(self): test_route = Route([], self.cities) assert test_route.distance == 0, 'Źle oblicza odległość trasy'
def test_distance1(self): test_route = Route(['Miasto1', 'Miasto2'], self.cities) assert test_route.distance == 2, 'Źle oblicza odległość trasy'