pełen algorytm genetyczny wraz z integracją z całym projektem

This commit is contained in:
Piotr Rychlicki 2020-05-12 22:09:46 +00:00
parent 80efe4d800
commit c87c4a06f2

View File

@ -1,4 +1,4 @@
import field, pathfinding_tractorless import field, pathfinding_tractorless, pathfinding_tractor
import random import random
class main(): class main():
@ -8,7 +8,8 @@ class main():
self.field = field self.field = field
self.ui = ui self.ui = ui
self.path = path 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 def zliczanie_wystapien(self): #zlicza wystepowanie kazdego z rodzajow pol na planszy
tabela_wystapien = [0,0,0,0] tabela_wystapien = [0,0,0,0]
@ -28,16 +29,17 @@ class main():
def wspolrzedne(self): #wyznacza wspolrzedne pol danego rodzaju na planszy def wspolrzedne(self): #wyznacza wspolrzedne pol danego rodzaju na planszy
pola_buraczane = [] pola_buraczane = []
k = 0 k = 0
ktore_pole = self.traktor.get_modes_values()
for i in self.field.field_matrix: for i in self.field.field_matrix:
l = 0 l = 0
for j in i: 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) pola_buraczane.append(k*10+l)
l = l + 1 l = l + 1
k = k + 1 k = k + 1
pierwsze_szukane_pole = pola_buraczane[0] #początkowa współrzędna, w każdym przypadku pole startowe [0,0] 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) 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 return pola_buraczane
def trasa_buraczana(self,pola_buraczane): #wyznacza koszt trasy przez pola danego rodzaju w zadanej kolejnosci 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 total_cost = 0
i = 0 i = 0
while i < (self.liczba_pol - 1): while i < (self.liczba_pol - 1):
# print(str(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.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)) # print(str(total_cost))
i = i + 1 i = i + 1
# print("Koszt przejścia przez pola buraczane w zadanej kolejności: " + str(total_cost)) # 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): def tworzenie_pokolenia(self,pola_buraczane,i):
x = len(pola_buraczane) - 2 x = len(pola_buraczane) - 2
wspolrzedne_shuffle = [] wspolrzedne_shuffle = []
while x > 1: while x > 0:
wspolrzedne_shuffle.append(pola_buraczane[x]) wspolrzedne_shuffle.append(pola_buraczane[x])
x = x - 1 x = x - 1
x = len(pola_buraczane) - 2 x = len(pola_buraczane) - 1
lista_osobnikow = [] lista_osobnikow = []
while i > 0: #liczebność pierwszego pokolenia (domyślnie 10) while i > 0: #liczebność pierwszego pokolenia (domyślnie 10)
nowy_osobnik = random.sample(wspolrzedne_shuffle, len(wspolrzedne_shuffle)) 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 nowy_osobnik.insert(x,0) #dodanie na koniec listy 0, jako współrzenej końcowej
lista_osobnikow.append(nowy_osobnik) lista_osobnikow.append(nowy_osobnik)
i = i - 1 i = i - 1
print("Lista osobników: " + str(lista_osobnikow)) # print("Lista osobników: " + str(lista_osobnikow))
return lista_osobnikow return lista_osobnikow
def ocena_przystosowania(self,pokolenia): def ocena_przystosowania(self,pokolenia):
@ -76,6 +78,7 @@ class main():
koszty_tras_osobnikow = [] koszty_tras_osobnikow = []
y = 0 y = 0
pierwszy_koszt = self.trasa_buraczana(pokolenia[y]) pierwszy_koszt = self.trasa_buraczana(pokolenia[y])
najtanszy_osobnik = pokolenia[y]
najnizszy_koszt = pierwszy_koszt najnizszy_koszt = pierwszy_koszt
najwyzszy_koszt = pierwszy_koszt najwyzszy_koszt = pierwszy_koszt
for i in pokolenia: for i in pokolenia:
@ -84,10 +87,11 @@ class main():
ile_osobnikow = ile_osobnikow + 1 ile_osobnikow = ile_osobnikow + 1
if self.trasa_buraczana(i) < najnizszy_koszt: if self.trasa_buraczana(i) < najnizszy_koszt:
najnizszy_koszt = self.trasa_buraczana(i) najnizszy_koszt = self.trasa_buraczana(i)
najtanszy_osobnik = i
if self.trasa_buraczana(i) > najwyzszy_koszt: if self.trasa_buraczana(i) > najwyzszy_koszt:
najwyzszy_koszt = self.trasa_buraczana(i) najwyzszy_koszt = self.trasa_buraczana(i)
print("Najtansza trasa w danym pokoleniu: " + str(najnizszy_koszt)) # print("Najtansza trasa w danym pokoleniu: " + str(najnizszy_koszt))
print("Najdrozsza trasa w danym pokoleniu: " + str(najwyzszy_koszt)) # print("Najdrozsza trasa w danym pokoleniu: " + str(najwyzszy_koszt))
srednie_przystosowanie = suma_kosztow_tras/ile_osobnikow #parametr potrzebny do oceny przystosowania osobnikow srednie_przystosowanie = suma_kosztow_tras/ile_osobnikow #parametr potrzebny do oceny przystosowania osobnikow
przystosowanie_osobnikow = [] przystosowanie_osobnikow = []
sumaryczne_przystosowanie_osobnikow = 0 sumaryczne_przystosowanie_osobnikow = 0
@ -100,7 +104,7 @@ class main():
# print("Ocena przystosowania każdego z osobników: " + str(przystosowanie_osobnikow)) # print("Ocena przystosowania każdego z osobników: " + str(przystosowanie_osobnikow))
# print("Koszty tras każdego z osobników: " + str(koszty_tras_osobnikow)) # print("Koszty tras każdego z osobników: " + str(koszty_tras_osobnikow))
# print("Średnie przystosowanie wszystkich osobników: " + str(srednie_przystosowanie)) # 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): def wybor_populacji_posredniej(self,pierwsze_pokolenie,przystosowanie_osobnikow):
x = len(przystosowanie_osobnikow) x = len(przystosowanie_osobnikow)
@ -170,8 +174,8 @@ class main():
dziecko_2 = rodzic_2 dziecko_2 = rodzic_2
populacja_po_krzyzowaniu.append(dziecko_1) populacja_po_krzyzowaniu.append(dziecko_1)
populacja_po_krzyzowaniu.append(dziecko_2) populacja_po_krzyzowaniu.append(dziecko_2)
#print("Dziecko nr 1: " + str(dziecko_1)) # print("Dziecko nr 1: " + str(dziecko_1))
#print("Dziecko nr 2: " + str(dziecko_2)) # print("Dziecko nr 2: " + str(dziecko_2))
x = x - 1 x = x - 1
#ostatnie krzyżowanie, pomiędzy pierwszym a ostatnim rodzicem z listy osobnikow nalezacych do populacji posredniej #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 dziecko_2 = rodzic_2
populacja_po_krzyzowaniu.append(dziecko_1) populacja_po_krzyzowaniu.append(dziecko_1)
populacja_po_krzyzowaniu.append(dziecko_2) populacja_po_krzyzowaniu.append(dziecko_2)
#print("Dziecko nr 1: " + str(dziecko_1)) # print("Dziecko nr 1: " + str(dziecko_1))
#print("Dziecko nr 2: " + str(dziecko_2)) # print("Dziecko nr 2: " + str(dziecko_2))
return populacja_po_krzyzowaniu return populacja_po_krzyzowaniu
def mutacja(self,populacja_po_krzyzowaniu): def mutacja(self,populacja_po_krzyzowaniu):
@ -242,6 +246,7 @@ class main():
pass pass
k = k - 1 k = k - 1
populacja_po_mutacji = populacja_po_krzyzowaniu populacja_po_mutacji = populacja_po_krzyzowaniu
# print("Populacja po mutacji: " + str(populacja_po_mutacji))
return populacja_po_mutacji return populacja_po_mutacji
def optymalizacja(self,populacja_po_mutacji,pola_buraczane): #polega na eliminacji powtarzających się tras 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]) populacja_po_optymalizacji.remove(populacja_po_mutacji[k-1])
x = len(pola_buraczane) - 2 x = len(pola_buraczane) - 2
wspolrzedne_shuffle = [] wspolrzedne_shuffle = []
while x > 1: while x > 0:
wspolrzedne_shuffle.append(pola_buraczane[x]) wspolrzedne_shuffle.append(pola_buraczane[x])
x = x - 1 x = x - 1
x = len(pola_buraczane) - 2 x = len(pola_buraczane) - 1
nowy_osobnik = random.sample(wspolrzedne_shuffle, len(wspolrzedne_shuffle)) 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(0,0) #dodanie na początek listy 0, jako współrzenej startowej
nowy_osobnik.insert(x,0) nowy_osobnik.insert(x,0)
@ -278,7 +283,7 @@ class main():
# Utworzenie pokolenia # Utworzenie pokolenia
self.pierwsze_pokolenie = self.tworzenie_pokolenia(self.pola_buraczane,10) self.pierwsze_pokolenie = self.tworzenie_pokolenia(self.pola_buraczane,10)
# Funkcja przystosowania # 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 # Populacja pośrednia wybrana metodą ruletki
self.populacja_posrednia = self.wybor_populacji_posredniej(self.pierwsze_pokolenie, self.przystosowanie) self.populacja_posrednia = self.wybor_populacji_posredniej(self.pierwsze_pokolenie, self.przystosowanie)
# Krzyżowanie populacji pośredniej # 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.populacja_po_optymalizacji = self.optymalizacja(self.populacja_po_mutacji,self.pola_buraczane)
self.maks_koszt = self.najwyzszy_koszt self.maks_koszt = self.najwyzszy_koszt
self.min_koszt = self.najnizszy_koszt self.min_koszt = self.najnizszy_koszt
self.najtansza_trasa = self.najtanszy_osobnik
i = 2 i = 2
self.ktore_pokolenie = 1 self.ktore_pokolenie = 1
while i < 41: while i < 41:
print(" ") print(" ")
print("*********************") print("*********************")
print(" ")
print("Pokolenie " + str(i)) print("Pokolenie " + str(i))
print(" ")
print("*********************") print("*********************")
print(" ") print(" ")
# Funkcja przystosowania # 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: if self.najwyzszy_koszt > self.maks_koszt:
self.maks_koszt = self.najwyzszy_koszt self.maks_koszt = self.najwyzszy_koszt
print("Nowy maksymalny koszt: " + str(self.maks_koszt))
if self.najnizszy_koszt < self.min_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 self.ktore_pokolenie = i
print("Nowy najnizszy koszt: " + str(self.min_koszt)) print("Nowy najnizszy koszt: " + str(self.min_koszt))
print("Nowa najtansza trasa: " + str(self.najtansza_trasa))
# Populacja pośrednia wybrana metodą ruletki # Populacja pośrednia wybrana metodą ruletki
self.populacja_posrednia = self.wybor_populacji_posredniej(self.populacja_po_mutacji, self.przystosowanie) self.populacja_posrednia = self.wybor_populacji_posredniej(self.populacja_po_mutacji, self.przystosowanie)
# Krzyżowanie populacji pośredniej # Krzyżowanie populacji pośredniej
@ -319,9 +328,15 @@ class main():
print("Zakończono wykonywanie algorytmu po " + str(i) + " pokoleniach") print("Zakończono wykonywanie algorytmu po " + str(i) + " pokoleniach")
break break
print("Średnie przygotowanie pierwszego pokolenia: " + str(self.srednie_przystosowanie_pierwszego_pokolenia)) print("Średnie przygotowanie pierwszego pokolenia: " + str(self.srednie_przystosowanie_pierwszego_pokolenia))
print(str((self.min_koszt)/(self.srednie_przystosowanie_pierwszego_pokolenia))) print("Stosunek poprawienia kosztu trasy względem początku: " + str((self.min_koszt)/(self.srednie_przystosowanie_pierwszego_pokolenia)))
print("Najwyzszy znaleziony koszt: " + str(self.maks_koszt))
print("Najnizszy znaleziony koszt to " + str(self.min_koszt) + " znaleziony w pokoleniu nr " + str(self.ktore_pokolenie)) 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): def main(self):
self.algorytm_genetyczny() 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