pełen algorytm genetyczny
Algorytm genetyczny szukający dla naszego agenta optymalnej trasy przejazdu przez wszystkie pola danego typu
This commit is contained in:
parent
677cd02e6f
commit
80efe4d800
180
Piotrek.py
180
Piotrek.py
@ -35,7 +35,7 @@ class main():
|
|||||||
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]
|
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 pól buraczanych: " + str(pola_buraczane))
|
||||||
return pola_buraczane
|
return pola_buraczane
|
||||||
@ -44,11 +44,13 @@ class main():
|
|||||||
self.liczba_pol = len(pola_buraczane)
|
self.liczba_pol = len(pola_buraczane)
|
||||||
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)))
|
||||||
total_cost = total_cost + self.pathfinding.pathfinding_tractorless(self.field,pola_buraczane,i)
|
total_cost = total_cost + self.pathfinding.pathfinding_tractorless(self.field,pola_buraczane,i)
|
||||||
|
# print(str(total_cost))
|
||||||
i = i + 1
|
i = i + 1
|
||||||
#print("Koszt przejścia przez pola buraczane rzędami: " + str(total_cost))
|
# print("Koszt przejścia przez pola buraczane w zadanej kolejności: " + str(total_cost))
|
||||||
#print("###################")
|
# print("###################")
|
||||||
return total_cost
|
return total_cost
|
||||||
|
|
||||||
def tworzenie_pokolenia(self,pola_buraczane,i):
|
def tworzenie_pokolenia(self,pola_buraczane,i):
|
||||||
@ -65,17 +67,27 @@ 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_osobnikow)
|
print("Lista osobników: " + str(lista_osobnikow))
|
||||||
return lista_osobnikow
|
return lista_osobnikow
|
||||||
|
|
||||||
def ocena_przystosowania(self,pokolenia):
|
def ocena_przystosowania(self,pokolenia):
|
||||||
suma_kosztow_tras = 0
|
suma_kosztow_tras = 0
|
||||||
ile_osobnikow = 0
|
ile_osobnikow = 0
|
||||||
koszty_tras_osobnikow = []
|
koszty_tras_osobnikow = []
|
||||||
|
y = 0
|
||||||
|
pierwszy_koszt = self.trasa_buraczana(pokolenia[y])
|
||||||
|
najnizszy_koszt = pierwszy_koszt
|
||||||
|
najwyzszy_koszt = pierwszy_koszt
|
||||||
for i in pokolenia:
|
for i in pokolenia:
|
||||||
koszty_tras_osobnikow.append(self.trasa_buraczana(i))
|
koszty_tras_osobnikow.append(self.trasa_buraczana(i))
|
||||||
suma_kosztow_tras = suma_kosztow_tras + self.trasa_buraczana(i)
|
suma_kosztow_tras = suma_kosztow_tras + self.trasa_buraczana(i)
|
||||||
ile_osobnikow = ile_osobnikow + 1
|
ile_osobnikow = ile_osobnikow + 1
|
||||||
|
if self.trasa_buraczana(i) < najnizszy_koszt:
|
||||||
|
najnizszy_koszt = self.trasa_buraczana(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))
|
||||||
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
|
||||||
@ -84,11 +96,11 @@ class main():
|
|||||||
przystosowanie_osobnikow.append(round(((srednie_przystosowanie/koszty_tras_osobnikow[l])*10),2))
|
przystosowanie_osobnikow.append(round(((srednie_przystosowanie/koszty_tras_osobnikow[l])*10),2))
|
||||||
sumaryczne_przystosowanie_osobnikow += round(((srednie_przystosowanie/koszty_tras_osobnikow[l])*10),2)
|
sumaryczne_przystosowanie_osobnikow += round(((srednie_przystosowanie/koszty_tras_osobnikow[l])*10),2)
|
||||||
l = l + 1
|
l = l + 1
|
||||||
print(str(round(sumaryczne_przystosowanie_osobnikow,2)))
|
# print(str(round(sumaryczne_przystosowanie_osobnikow,2)))
|
||||||
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)
|
return(przystosowanie_osobnikow, najnizszy_koszt, najwyzszy_koszt, srednie_przystosowanie)
|
||||||
|
|
||||||
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)
|
||||||
@ -101,7 +113,7 @@ class main():
|
|||||||
tabela_ruletki.append(round(przedzial,2))
|
tabela_ruletki.append(round(przedzial,2))
|
||||||
x = x - 1
|
x = x - 1
|
||||||
i = i + 1
|
i = i + 1
|
||||||
print(str(tabela_ruletki))
|
#print("Tabela ruletki do losowania z przedziałami dla każdego osobnika: " + str(tabela_ruletki))
|
||||||
x = len(przystosowanie_osobnikow)/2 #losowanie połowy liczby osobników populacji początkowej do populacji pośredniej
|
x = len(przystosowanie_osobnikow)/2 #losowanie połowy liczby osobników populacji początkowej do populacji pośredniej
|
||||||
maks = tabela_ruletki[i-1]
|
maks = tabela_ruletki[i-1]
|
||||||
while x > 0:
|
while x > 0:
|
||||||
@ -111,24 +123,22 @@ class main():
|
|||||||
i = i + 1
|
i = i + 1
|
||||||
populacja_posrednia.append(pierwsze_pokolenie[i])
|
populacja_posrednia.append(pierwsze_pokolenie[i])
|
||||||
x = x - 1
|
x = x - 1
|
||||||
print(str(populacja_posrednia)) #populacja posrednia, z której zostanie utworzona populacja potomków
|
# print("Populacja pośrednia (rodziców): " + str(populacja_posrednia)) #populacja posrednia, z której zostanie utworzona populacja potomków
|
||||||
return populacja_posrednia
|
return populacja_posrednia
|
||||||
|
|
||||||
def krzyzowanie(self,populacja_posrednia):
|
def krzyzowanie(self,populacja_posrednia):
|
||||||
|
populacja_po_krzyzowaniu = []
|
||||||
x = len(populacja_posrednia) - 1
|
x = len(populacja_posrednia) - 1
|
||||||
while x > 0:
|
while x > 0:
|
||||||
rodzic_1 = populacja_posrednia[x]
|
rodzic_1 = populacja_posrednia[x]
|
||||||
print("Rodzic nr 1: " + str(rodzic_1))
|
#print("Rodzic nr 1: " + str(rodzic_1))
|
||||||
rodzic_2 = populacja_posrednia[x-1]
|
rodzic_2 = populacja_posrednia[x-1]
|
||||||
print("Rodzic nr 2: " + str(rodzic_2))
|
#print("Rodzic nr 2: " + str(rodzic_2))
|
||||||
dziecko_1 = []
|
dziecko_1 = []
|
||||||
dziecko_2 = []
|
dziecko_2 = []
|
||||||
czy_krzyzowac = random.randint(1,100) #losowanie czy krzyzowac rodzicow, czy nie
|
czy_krzyzowac = random.randint(1,100) #losowanie czy krzyzowac rodzicow, czy nie (szanse 10%)
|
||||||
if (czy_krzyzowac < 78) and (rodzic_1 != rodzic_2): #jesli krzyzowanie nastepuje
|
if (czy_krzyzowac < 10) and (rodzic_1 != rodzic_2): #jesli krzyzowanie nastepuje
|
||||||
print("Nastąpiło krzyżowanie")
|
|
||||||
miejsce_krzyzowania = random.randint(1,(len(populacja_posrednia[x])-3)) #wybor miejsca krzyzowania
|
miejsce_krzyzowania = random.randint(1,(len(populacja_posrednia[x])-3)) #wybor miejsca krzyzowania
|
||||||
print(str(miejsce_krzyzowania))
|
|
||||||
print(str(rodzic_1[miejsce_krzyzowania]))
|
|
||||||
l = 0
|
l = 0
|
||||||
k = miejsce_krzyzowania
|
k = miejsce_krzyzowania
|
||||||
while k >= 0: #dodawanie do dziecka pierwszej połowy z pierwszego rodzica
|
while k >= 0: #dodawanie do dziecka pierwszej połowy z pierwszego rodzica
|
||||||
@ -156,24 +166,25 @@ class main():
|
|||||||
dziecko_1.append(0)
|
dziecko_1.append(0)
|
||||||
dziecko_2.append(0)
|
dziecko_2.append(0)
|
||||||
else: #jesli krzyzowanie nie nastepuje, wowczas potencjalni rodzice staja sie dziecmi
|
else: #jesli krzyzowanie nie nastepuje, wowczas potencjalni rodzice staja sie dziecmi
|
||||||
print("Krzyżowanie nie nastąpiło")
|
|
||||||
dziecko_1 = rodzic_1
|
dziecko_1 = rodzic_1
|
||||||
dziecko_2 = rodzic_2
|
dziecko_2 = rodzic_2
|
||||||
print("Dziecko nr 1: " + str(dziecko_1))
|
populacja_po_krzyzowaniu.append(dziecko_1)
|
||||||
print("Dziecko nr 2: " + str(dziecko_2))
|
populacja_po_krzyzowaniu.append(dziecko_2)
|
||||||
|
#print("Dziecko nr 1: " + str(dziecko_1))
|
||||||
|
#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
|
||||||
|
|
||||||
rodzic_1 = populacja_posrednia[0]
|
rodzic_1 = populacja_posrednia[0]
|
||||||
print("Rodzic nr 1: " + str(rodzic_1))
|
#print("Rodzic nr 1: " + str(rodzic_1))
|
||||||
rodzic_2 = populacja_posrednia[(len(populacja_posrednia)-1)]
|
rodzic_2 = populacja_posrednia[(len(populacja_posrednia)-1)]
|
||||||
print("Rodzic nr 2: " + str(rodzic_2))
|
#print("Rodzic nr 2: " + str(rodzic_2))
|
||||||
dziecko_1 = []
|
dziecko_1 = []
|
||||||
dziecko_2 = []
|
dziecko_2 = []
|
||||||
czy_krzyzowac = random.randint(1,100) #losowanie czy krzyzowac rodzicow, czy nie
|
czy_krzyzowac = random.randint(1,100) #losowanie czy krzyzowac rodzicow, czy nie (szanse 10%)
|
||||||
if (czy_krzyzowac < 78) and (rodzic_1 != rodzic_2): #jesli krzyzowanie nastepuje
|
if (czy_krzyzowac < 10) and (rodzic_1 != rodzic_2): #jesli krzyzowanie nastepuje
|
||||||
print("Nastąpiło krzyżowanie")
|
|
||||||
miejsce_krzyzowania = random.randint(1,(len(populacja_posrednia[x])-3)) #wybor miejsca krzyzowania
|
miejsce_krzyzowania = random.randint(1,(len(populacja_posrednia[x])-3)) #wybor miejsca krzyzowania
|
||||||
print(str(miejsce_krzyzowania))
|
|
||||||
print(str(rodzic_1[miejsce_krzyzowania]))
|
|
||||||
l = 0
|
l = 0
|
||||||
k = miejsce_krzyzowania
|
k = miejsce_krzyzowania
|
||||||
while k >= 0: #dodawanie do dziecka pierwszej połowy z pierwszego rodzica
|
while k >= 0: #dodawanie do dziecka pierwszej połowy z pierwszego rodzica
|
||||||
@ -201,17 +212,116 @@ class main():
|
|||||||
dziecko_1.append(0)
|
dziecko_1.append(0)
|
||||||
dziecko_2.append(0)
|
dziecko_2.append(0)
|
||||||
else: #jesli krzyzowanie nie nastepuje, wowczas potencjalni rodzice staja sie dziecmi
|
else: #jesli krzyzowanie nie nastepuje, wowczas potencjalni rodzice staja sie dziecmi
|
||||||
print("Krzyżowanie nie nastąpiło")
|
|
||||||
dziecko_1 = rodzic_1
|
dziecko_1 = rodzic_1
|
||||||
dziecko_2 = rodzic_2
|
dziecko_2 = rodzic_2
|
||||||
print("Dziecko nr 1: " + str(dziecko_1))
|
populacja_po_krzyzowaniu.append(dziecko_1)
|
||||||
print("Dziecko nr 2: " + str(dziecko_2))
|
populacja_po_krzyzowaniu.append(dziecko_2)
|
||||||
|
#print("Dziecko nr 1: " + str(dziecko_1))
|
||||||
|
#print("Dziecko nr 2: " + str(dziecko_2))
|
||||||
|
return populacja_po_krzyzowaniu
|
||||||
|
|
||||||
def main(self):
|
def mutacja(self,populacja_po_krzyzowaniu):
|
||||||
|
k = len(populacja_po_krzyzowaniu) - 1
|
||||||
|
while k >= 0:
|
||||||
|
czy_mutacja = random.randint(0,100)
|
||||||
|
if czy_mutacja < 3: # Szanse 2%
|
||||||
|
kogo_mutujemy = populacja_po_krzyzowaniu[k]
|
||||||
|
populacja_po_krzyzowaniu.remove(kogo_mutujemy)
|
||||||
|
l = len(kogo_mutujemy) - 1
|
||||||
|
#print("Osobnik przed mutacją: " + str(kogo_mutujemy))
|
||||||
|
x = random.randint(1,l)
|
||||||
|
y = random.randint(1,l)
|
||||||
|
while x == y:
|
||||||
|
y = random.randint(1,l)
|
||||||
|
zamiennik = kogo_mutujemy[x]
|
||||||
|
kogo_mutujemy[x] = kogo_mutujemy[y]
|
||||||
|
kogo_mutujemy[y] = zamiennik
|
||||||
|
#print("Osobnik po mutacji: " + str(kogo_mutujemy))
|
||||||
|
populacja_po_krzyzowaniu.insert(k,kogo_mutujemy)
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
k = k - 1
|
||||||
|
populacja_po_mutacji = populacja_po_krzyzowaniu
|
||||||
|
return populacja_po_mutacji
|
||||||
|
|
||||||
|
def optymalizacja(self,populacja_po_mutacji,pola_buraczane): #polega na eliminacji powtarzających się tras
|
||||||
|
populacja_po_optymalizacji = populacja_po_mutacji
|
||||||
|
i = len(populacja_po_mutacji)
|
||||||
|
l = 1
|
||||||
|
while l < i:
|
||||||
|
k = l
|
||||||
|
while k >= 0:
|
||||||
|
if populacja_po_mutacji[l] == populacja_po_mutacji[k-1]:
|
||||||
|
populacja_po_optymalizacji.remove(populacja_po_mutacji[k-1])
|
||||||
|
x = len(pola_buraczane) - 2
|
||||||
|
wspolrzedne_shuffle = []
|
||||||
|
while x > 1:
|
||||||
|
wspolrzedne_shuffle.append(pola_buraczane[x])
|
||||||
|
x = x - 1
|
||||||
|
x = len(pola_buraczane) - 2
|
||||||
|
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)
|
||||||
|
populacja_po_optymalizacji.append(nowy_osobnik)
|
||||||
|
# print("Nastąpiła optymalizacja")
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
k = k - 1
|
||||||
|
l = l + 1
|
||||||
|
# print("Populacja po optymalizacji: " + str(populacja_po_optymalizacji))
|
||||||
|
return populacja_po_optymalizacji
|
||||||
|
|
||||||
|
def algorytm_genetyczny(self):
|
||||||
self.zliczanie_wystapien()
|
self.zliczanie_wystapien()
|
||||||
self.pola_buraczane = self.wspolrzedne()
|
self.pola_buraczane = self.wspolrzedne()
|
||||||
self.koszt_trasy = self.trasa_buraczana(self.pola_buraczane)
|
self.koszt_trasy = self.trasa_buraczana(self.pola_buraczane)
|
||||||
|
# Utworzenie pokolenia
|
||||||
self.pierwsze_pokolenie = self.tworzenie_pokolenia(self.pola_buraczane,10)
|
self.pierwsze_pokolenie = self.tworzenie_pokolenia(self.pola_buraczane,10)
|
||||||
self.przystosowanie = self.ocena_przystosowania(self.pierwsze_pokolenie)
|
# Funkcja przystosowania
|
||||||
|
self.przystosowanie, self.najnizszy_koszt, self.najwyzszy_koszt, self.srednie_przystosowanie_pierwszego_pokolenia = self.ocena_przystosowania(self.pierwsze_pokolenie)
|
||||||
|
# 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)
|
||||||
self.krzyzowanie(self.populacja_posrednia)
|
# Krzyżowanie populacji pośredniej
|
||||||
|
self.populacja_po_krzyzowaniu = self.krzyzowanie(self.populacja_posrednia)
|
||||||
|
# Mutacja populacji pośredniej
|
||||||
|
self.populacja_po_mutacji = self.mutacja(self.populacja_po_krzyzowaniu)
|
||||||
|
# Optymalizacja populacji pośredniej
|
||||||
|
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
|
||||||
|
i = 2
|
||||||
|
self.ktore_pokolenie = 1
|
||||||
|
while i < 41:
|
||||||
|
print(" ")
|
||||||
|
print("*********************")
|
||||||
|
print("Pokolenie " + str(i))
|
||||||
|
print("*********************")
|
||||||
|
print(" ")
|
||||||
|
# Funkcja przystosowania
|
||||||
|
self.przystosowanie, self.najnizszy_koszt, self.najwyzszy_koszt, self.srednie_przystosowanie = 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.ktore_pokolenie = i
|
||||||
|
print("Nowy najnizszy koszt: " + str(self.min_koszt))
|
||||||
|
# Populacja pośrednia wybrana metodą ruletki
|
||||||
|
self.populacja_posrednia = self.wybor_populacji_posredniej(self.populacja_po_mutacji, self.przystosowanie)
|
||||||
|
# Krzyżowanie populacji pośredniej
|
||||||
|
self.populacja_po_krzyzowaniu = self.krzyzowanie(self.populacja_posrednia)
|
||||||
|
# Mutacja populacji pośredniej
|
||||||
|
self.populacja_po_mutacji = self.mutacja(self.populacja_po_krzyzowaniu)
|
||||||
|
# Optymalizacja populacji pośredniej
|
||||||
|
self.populacja_po_optymalizacji = self.optymalizacja(self.populacja_po_mutacji,self.pola_buraczane)
|
||||||
|
i = i + 1
|
||||||
|
if (self.min_koszt)/(self.srednie_przystosowanie_pierwszego_pokolenia) < (0.69):
|
||||||
|
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("Najnizszy znaleziony koszt to " + str(self.min_koszt) + " znaleziony w pokoleniu nr " + str(self.ktore_pokolenie))
|
||||||
|
|
||||||
|
def main(self):
|
||||||
|
self.algorytm_genetyczny()
|
Loading…
Reference in New Issue
Block a user