165 lines
5.4 KiB
Python
165 lines
5.4 KiB
Python
from genetyczny.funkcje import *
|
|
from easygui import *
|
|
from genetyczny.Data import Data
|
|
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
import matplotlib.animation as animation
|
|
|
|
def start(data, wheel):
|
|
|
|
ileGeneracji = 500
|
|
ileWPopulacji = 16
|
|
fragment = 0.5
|
|
mutacja = 0.05
|
|
unbox = 1
|
|
|
|
|
|
data.kordyWozka = (wheel.ns, wheel.we)
|
|
data.jakLiczycKoszt = unbox
|
|
|
|
randomPopulation = genRandomPopulation(data, ileWPopulacji)
|
|
for i in range(ileGeneracji):
|
|
if i == 0:
|
|
best2 = dwieNajlepsze(randomPopulation, data)
|
|
else:
|
|
x = genPopulacje(data,best2[0], best2[1], ileWPopulacji, fragment, mutacja)
|
|
best2 = dwieNajlepsze(x, data)
|
|
del x
|
|
|
|
data.histZmian.append(data.best[1])
|
|
|
|
|
|
rysujWykres(data, ileGeneracji, 0, 2000)
|
|
|
|
|
|
|
|
def zbierzBox(gen,data, moves, kordStartowy):
|
|
regalKordy = gen.kordy
|
|
star = AStar()
|
|
mapForAStar = data.astarMap[:]
|
|
mapForAStar[regalKordy[0]][regalKordy[1]] = 0
|
|
path = star.search([kordStartowy[0], kordStartowy[1]], regalKordy, mapForAStar, 1, 1)
|
|
cns = kordStartowy[0]
|
|
cwe = kordStartowy[1]
|
|
value = path[cns][cwe]
|
|
|
|
while True:
|
|
if cns > 0 and path[cns - 1][cwe] == (value + 1):
|
|
cns = cns - 1
|
|
moves.append(1)
|
|
value = value + 1
|
|
continue
|
|
if cns < (len(mapForAStar) - 1) and path[cns + 1][cwe] == (value + 1):
|
|
cns = cns + 1
|
|
moves.append(2)
|
|
value = value + 1
|
|
continue
|
|
if cwe > 0 and path[cns][cwe - 1] == (value + 1):
|
|
cwe = cwe - 1
|
|
moves.append(3)
|
|
value = value + 1
|
|
continue
|
|
if cwe < (len(mapForAStar[0]) - 1) and path[cns][cwe + 1] == (value + 1):
|
|
cwe = cwe + 1
|
|
moves.append(4)
|
|
value = value + 1
|
|
continue
|
|
break
|
|
mapForAStar[regalKordy[0]][regalKordy[1]] = 1
|
|
# wyszukiwanie ścieżki z miejsca podjęcia paczki do regału
|
|
# zmienna path posiada macierz oraz kroki podjęte przez wózek
|
|
path = star.search([regalKordy[0], regalKordy[1]], gen.kordyUnboxa, mapForAStar, 1, 1)
|
|
#mapForAStar[where[0]][where[1]] = 1
|
|
value = path[cns][cwe]
|
|
while True:
|
|
if(value == 0):
|
|
if(path[cns - 1][cwe] == 1):
|
|
cns = cns - 1
|
|
elif(path[cns + 1][cwe] == 1):
|
|
cns = cns + 1
|
|
elif(path[cns][cwe - 1] == 1):
|
|
cwe = cwe - 1
|
|
elif(path[cns][cwe + 1] == 1):
|
|
cwe = cwe + 1
|
|
value = path[cns][cwe]
|
|
continue
|
|
if cns > 0 and path[cns - 1][cwe] == (value + 1):
|
|
cns = cns - 1
|
|
moves.append(1)
|
|
value = value + 1
|
|
continue
|
|
if cns < (len(mapForAStar) - 1) and path[cns + 1][cwe] == (value + 1):
|
|
cns = cns + 1
|
|
moves.append(2)
|
|
value = value + 1
|
|
continue
|
|
if cwe > 0 and path[cns][cwe - 1] == (value + 1):
|
|
cwe = cwe - 1
|
|
moves.append(3)
|
|
value = value + 1
|
|
continue
|
|
if cwe < (len(mapForAStar[0]) - 1) and path[cns][cwe + 1] == (value + 1):
|
|
cwe = cwe + 1
|
|
moves.append(4)
|
|
value = value + 1
|
|
continue
|
|
break
|
|
|
|
def rysujWykres(data, x, yStart, yEnd):
|
|
|
|
plt.axis([0, x,yStart, yEnd])
|
|
|
|
for i in range(0, len(data.doWykresu) - 1):
|
|
y = data.doWykresu[i]
|
|
x = i
|
|
plt.scatter(x, y)
|
|
plt.pause(0.0001)
|
|
|
|
plt.show()
|
|
|
|
|
|
def okno():
|
|
good = True
|
|
fieldValues = multenterbox("Wprowadź warunki początkowe", "Start algorytmu genetycznego", ["Ile chrom. w generacji", "Wielkosc dziedziczonego fragmentu (x>0 and x<1)", "Wartosc mutacji (x>0 and x<1)", "Unbox: (0or 1 or 2 or 2)", "Ile generacji"])
|
|
if(fieldValues[0].isnumeric() and (fieldValues[0]!="")):
|
|
good = False
|
|
elif(good==True):
|
|
msgbox("Wartość nie jest liczbą", "Błąd")
|
|
good = False
|
|
if(fieldValues[1].isnumeric() and (fieldValues[1]!="")):
|
|
if((int(fieldValues[1])<=0) and (good==True) and (int(fieldValues[1])>= 1)):
|
|
msgbox("Zla wartosc fragmentu")
|
|
good = False
|
|
elif (good == True):
|
|
msgbox("Wartość nie jest liczbą", "Błąd")
|
|
good = False
|
|
if(fieldValues[2].isnumeric() and (fieldValues[2]!="")):
|
|
if((int(fieldValues[1])<=0) and (good==True) and (int(fieldValues[1])>= 1)):
|
|
msgbox("Zla wartosc mutacji")
|
|
good = False
|
|
elif (good == True):
|
|
msgbox("Wartość nie jest liczbą", "Błąd")
|
|
good = False
|
|
if(fieldValues[3].isnumeric() and (fieldValues[3]!="")):
|
|
if(((int(fieldValues[3]) != 0) or (int(fieldValues[3]) != 1) or (int(fieldValues[3]) != 2) or (int(fieldValues[3]) != 3)) and (good==True)):
|
|
msgbox("Zla wartosc unboxa")
|
|
good = False
|
|
elif (good == True):
|
|
msgbox("Wartość nie jest liczbą", "Błąd")
|
|
good = False
|
|
if(fieldValues[4].isnumeric() and (fieldValues[4]!="")):
|
|
pass
|
|
else:
|
|
msgbox("Wartość nie jest liczbą", "Błąd")
|
|
good = False
|
|
if(good == True):
|
|
return [fieldValues[0], fieldValues[1], fieldValues[2],fieldValues[3]]
|
|
|
|
|
|
def zwolnijPamiec(generacja, dwieNajlepsze):
|
|
|
|
for i in generacja:
|
|
if( i != dwieNajlepsze[0] and i != dwieNajlepsze[1]):
|
|
generacja.remove(i)
|
|
return generacja
|