From c87c4a06f2fc8ae04e272401ede2643561659be4 Mon Sep 17 00:00:00 2001 From: Piotr Rychlicki Date: Tue, 12 May 2020 22:09:46 +0000 Subject: [PATCH] =?UTF-8?q?pe=C5=82en=20algorytm=20genetyczny=20wraz=20z?= =?UTF-8?q?=20integracj=C4=85=20z=20ca=C5=82ym=20projektem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Piotrek.py | 65 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/Piotrek.py b/Piotrek.py index 3d8b14f..789e2dc 100644 --- a/Piotrek.py +++ b/Piotrek.py @@ -1,4 +1,4 @@ -import field, pathfinding_tractorless +import field, pathfinding_tractorless, pathfinding_tractor import random class main(): @@ -8,7 +8,8 @@ class main(): self.field = field self.ui = ui self.path = path - self.pathfinding = pathfinding_tractorless.pathfinding_tractorless() + self.pathfinding_tractorless = pathfinding_tractorless.pathfinding_tractorless() + self.pathfinding_tractor = pathfinding_tractor.pathfinding_tractor() def zliczanie_wystapien(self): #zlicza wystepowanie kazdego z rodzajow pol na planszy tabela_wystapien = [0,0,0,0] @@ -28,16 +29,17 @@ class main(): def wspolrzedne(self): #wyznacza wspolrzedne pol danego rodzaju na planszy pola_buraczane = [] k = 0 + ktore_pole = self.traktor.get_modes_values() for i in self.field.field_matrix: l = 0 for j in i: - if j == 8: #w tym przypadku pol z burakami + if j in ktore_pole: #w tym przypadku pol z burakami, stąd 8 pola_buraczane.append(k*10+l) l = l + 1 k = k + 1 pierwsze_szukane_pole = pola_buraczane[0] #początkowa współrzędna, w każdym przypadku pole startowe [0,0] pola_buraczane.append(pierwsze_szukane_pole) - print("Współrzędne pól buraczanych: " + str(pola_buraczane)) + print("Współrzędne szukanych pól: " + str(pola_buraczane)) return pola_buraczane def trasa_buraczana(self,pola_buraczane): #wyznacza koszt trasy przez pola danego rodzaju w zadanej kolejnosci @@ -45,8 +47,8 @@ class main(): total_cost = 0 i = 0 while i < (self.liczba_pol - 1): - # print(str(self.pathfinding.pathfinding_tractorless(self.field,pola_buraczane,i))) - total_cost = total_cost + self.pathfinding.pathfinding_tractorless(self.field,pola_buraczane,i) + # print(str(self.pathfinding_tractorless.pathfinding_tractorless(self.field,pola_buraczane,i))) + total_cost = total_cost + self.pathfinding_tractorless.pathfinding_tractorless(self.field,pola_buraczane,i) # print(str(total_cost)) i = i + 1 # print("Koszt przejścia przez pola buraczane w zadanej kolejności: " + str(total_cost)) @@ -56,10 +58,10 @@ class main(): def tworzenie_pokolenia(self,pola_buraczane,i): x = len(pola_buraczane) - 2 wspolrzedne_shuffle = [] - while x > 1: + while x > 0: wspolrzedne_shuffle.append(pola_buraczane[x]) x = x - 1 - x = len(pola_buraczane) - 2 + x = len(pola_buraczane) - 1 lista_osobnikow = [] while i > 0: #liczebność pierwszego pokolenia (domyślnie 10) nowy_osobnik = random.sample(wspolrzedne_shuffle, len(wspolrzedne_shuffle)) @@ -67,7 +69,7 @@ class main(): nowy_osobnik.insert(x,0) #dodanie na koniec listy 0, jako współrzenej końcowej lista_osobnikow.append(nowy_osobnik) i = i - 1 - print("Lista osobników: " + str(lista_osobnikow)) + # print("Lista osobników: " + str(lista_osobnikow)) return lista_osobnikow def ocena_przystosowania(self,pokolenia): @@ -76,6 +78,7 @@ class main(): koszty_tras_osobnikow = [] y = 0 pierwszy_koszt = self.trasa_buraczana(pokolenia[y]) + najtanszy_osobnik = pokolenia[y] najnizszy_koszt = pierwszy_koszt najwyzszy_koszt = pierwszy_koszt for i in pokolenia: @@ -84,10 +87,11 @@ class main(): ile_osobnikow = ile_osobnikow + 1 if self.trasa_buraczana(i) < najnizszy_koszt: najnizszy_koszt = self.trasa_buraczana(i) + najtanszy_osobnik = i if self.trasa_buraczana(i) > najwyzszy_koszt: najwyzszy_koszt = self.trasa_buraczana(i) - print("Najtansza trasa w danym pokoleniu: " + str(najnizszy_koszt)) - print("Najdrozsza trasa w danym pokoleniu: " + str(najwyzszy_koszt)) + # print("Najtansza trasa w danym pokoleniu: " + str(najnizszy_koszt)) + # print("Najdrozsza trasa w danym pokoleniu: " + str(najwyzszy_koszt)) srednie_przystosowanie = suma_kosztow_tras/ile_osobnikow #parametr potrzebny do oceny przystosowania osobnikow przystosowanie_osobnikow = [] sumaryczne_przystosowanie_osobnikow = 0 @@ -100,7 +104,7 @@ class main(): # print("Ocena przystosowania każdego z osobników: " + str(przystosowanie_osobnikow)) # print("Koszty tras każdego z osobników: " + str(koszty_tras_osobnikow)) # print("Średnie przystosowanie wszystkich osobników: " + str(srednie_przystosowanie)) - return(przystosowanie_osobnikow, najnizszy_koszt, najwyzszy_koszt, srednie_przystosowanie) + return(przystosowanie_osobnikow, najnizszy_koszt, najwyzszy_koszt, srednie_przystosowanie, najtanszy_osobnik) def wybor_populacji_posredniej(self,pierwsze_pokolenie,przystosowanie_osobnikow): x = len(przystosowanie_osobnikow) @@ -170,8 +174,8 @@ class main(): dziecko_2 = rodzic_2 populacja_po_krzyzowaniu.append(dziecko_1) populacja_po_krzyzowaniu.append(dziecko_2) - #print("Dziecko nr 1: " + str(dziecko_1)) - #print("Dziecko nr 2: " + str(dziecko_2)) + # print("Dziecko nr 1: " + str(dziecko_1)) + # print("Dziecko nr 2: " + str(dziecko_2)) x = x - 1 #ostatnie krzyżowanie, pomiędzy pierwszym a ostatnim rodzicem z listy osobnikow nalezacych do populacji posredniej @@ -216,8 +220,8 @@ class main(): dziecko_2 = rodzic_2 populacja_po_krzyzowaniu.append(dziecko_1) populacja_po_krzyzowaniu.append(dziecko_2) - #print("Dziecko nr 1: " + str(dziecko_1)) - #print("Dziecko nr 2: " + str(dziecko_2)) + # print("Dziecko nr 1: " + str(dziecko_1)) + # print("Dziecko nr 2: " + str(dziecko_2)) return populacja_po_krzyzowaniu def mutacja(self,populacja_po_krzyzowaniu): @@ -242,6 +246,7 @@ class main(): pass k = k - 1 populacja_po_mutacji = populacja_po_krzyzowaniu + # print("Populacja po mutacji: " + str(populacja_po_mutacji)) return populacja_po_mutacji def optymalizacja(self,populacja_po_mutacji,pola_buraczane): #polega na eliminacji powtarzających się tras @@ -255,10 +260,10 @@ class main(): populacja_po_optymalizacji.remove(populacja_po_mutacji[k-1]) x = len(pola_buraczane) - 2 wspolrzedne_shuffle = [] - while x > 1: + while x > 0: wspolrzedne_shuffle.append(pola_buraczane[x]) x = x - 1 - x = len(pola_buraczane) - 2 + x = len(pola_buraczane) - 1 nowy_osobnik = random.sample(wspolrzedne_shuffle, len(wspolrzedne_shuffle)) nowy_osobnik.insert(0,0) #dodanie na początek listy 0, jako współrzenej startowej nowy_osobnik.insert(x,0) @@ -278,7 +283,7 @@ class main(): # Utworzenie pokolenia self.pierwsze_pokolenie = self.tworzenie_pokolenia(self.pola_buraczane,10) # Funkcja przystosowania - self.przystosowanie, self.najnizszy_koszt, self.najwyzszy_koszt, self.srednie_przystosowanie_pierwszego_pokolenia = self.ocena_przystosowania(self.pierwsze_pokolenie) + self.przystosowanie, self.najnizszy_koszt, self.najwyzszy_koszt, self.srednie_przystosowanie_pierwszego_pokolenia, self.najtanszy_osobnik = self.ocena_przystosowania(self.pierwsze_pokolenie) # Populacja pośrednia wybrana metodą ruletki self.populacja_posrednia = self.wybor_populacji_posredniej(self.pierwsze_pokolenie, self.przystosowanie) # Krzyżowanie populacji pośredniej @@ -289,23 +294,27 @@ class main(): self.populacja_po_optymalizacji = self.optymalizacja(self.populacja_po_mutacji,self.pola_buraczane) self.maks_koszt = self.najwyzszy_koszt self.min_koszt = self.najnizszy_koszt + self.najtansza_trasa = self.najtanszy_osobnik i = 2 self.ktore_pokolenie = 1 while i < 41: print(" ") print("*********************") + print(" ") print("Pokolenie " + str(i)) + print(" ") print("*********************") print(" ") # Funkcja przystosowania - self.przystosowanie, self.najnizszy_koszt, self.najwyzszy_koszt, self.srednie_przystosowanie = self.ocena_przystosowania(self.populacja_po_optymalizacji) + self.przystosowanie, self.najnizszy_koszt, self.najwyzszy_koszt, self.srednie_przystosowanie, self.najtanszy_osobnik = self.ocena_przystosowania(self.populacja_po_optymalizacji) if self.najwyzszy_koszt > self.maks_koszt: self.maks_koszt = self.najwyzszy_koszt - print("Nowy maksymalny koszt: " + str(self.maks_koszt)) if self.najnizszy_koszt < self.min_koszt: - self.min_koszt = self.najnizszy_koszt + self.min_koszt = self.najnizszy_koszt + self.najtansza_trasa = self.najtanszy_osobnik self.ktore_pokolenie = i print("Nowy najnizszy koszt: " + str(self.min_koszt)) + print("Nowa najtansza trasa: " + str(self.najtansza_trasa)) # Populacja pośrednia wybrana metodą ruletki self.populacja_posrednia = self.wybor_populacji_posredniej(self.populacja_po_mutacji, self.przystosowanie) # Krzyżowanie populacji pośredniej @@ -319,9 +328,15 @@ class main(): print("Zakończono wykonywanie algorytmu po " + str(i) + " pokoleniach") break print("Średnie przygotowanie pierwszego pokolenia: " + str(self.srednie_przystosowanie_pierwszego_pokolenia)) - print(str((self.min_koszt)/(self.srednie_przystosowanie_pierwszego_pokolenia))) - print("Najwyzszy znaleziony koszt: " + str(self.maks_koszt)) + print("Stosunek poprawienia kosztu trasy względem początku: " + str((self.min_koszt)/(self.srednie_przystosowanie_pierwszego_pokolenia))) print("Najnizszy znaleziony koszt to " + str(self.min_koszt) + " znaleziony w pokoleniu nr " + str(self.ktore_pokolenie)) + print("Najtansza znaleziona trasa to " + str(self.najtansza_trasa)) + # print("Najwyzszy znaleziony koszt: " + str(self.maks_koszt)) def main(self): - self.algorytm_genetyczny() \ No newline at end of file + self.algorytm_genetyczny() + i = len(self.najtansza_trasa) - 1 + l = 0 + while l < i: + self.pathfinding_tractor.pathfinding_tractor(self.field, self.traktor, self.ui, self.najtansza_trasa, l) + l = l + 1 \ No newline at end of file