forked from s444399/AI
234 lines
6.9 KiB
Python
234 lines
6.9 KiB
Python
from unboxOnTheFloor import UnboxOnTheFloor
|
|
from box import Box
|
|
from AStar import AStar
|
|
import random
|
|
from easygui import *
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
|
|
|
|
|
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 znajdzUnbox(data,mapa):
|
|
unboxy = []
|
|
iterator = 0
|
|
ostatniWiersz = len(mapa) -1
|
|
for x in mapa[ostatniWiersz]:
|
|
if (isinstance(x, UnboxOnTheFloor)):
|
|
unboxy.append((ostatniWiersz, iterator))
|
|
iterator += 1
|
|
|
|
data.unbox = unboxy
|
|
|
|
|
|
|
|
def policzCost(mapaBoxy, poczatek, koniec):
|
|
astar = AStar()
|
|
koszt = astar.search(poczatek, koniec, mapaBoxy, 1, 0)
|
|
return koszt
|
|
|
|
|
|
|
|
def wybierzUnbox(gen, jakLiczycKoszt): #funkcja ustawiajaca jaki unbox
|
|
if(jakLiczycKoszt == 0):
|
|
x = random.choice([gen.unbox1, gen.unbox2])
|
|
if(x == gen.unbox1):
|
|
y = 0
|
|
else:
|
|
y= 1
|
|
return (x,y)
|
|
elif(jakLiczycKoszt == 1):
|
|
return (gen.unbox1,0)
|
|
elif(jakLiczycKoszt == 2):
|
|
return (gen.unbox2,1)
|
|
elif(jakLiczycKoszt == 3):
|
|
x = min(gen.unbox1,gen.unbox2)
|
|
if(x == gen.unbox1):
|
|
y = 0
|
|
else:
|
|
y = 1
|
|
return (x,y)
|
|
|
|
def randomBox(mapa, regals, ile):
|
|
|
|
regals = regals
|
|
mapa = mapa
|
|
tupleList = []
|
|
ileRegalow = len(regals)
|
|
iteration = 0
|
|
|
|
while iteration < ileRegalow and iteration < ile:
|
|
regal = random.choice(regals)
|
|
if regal in tupleList:
|
|
continue
|
|
else:
|
|
tupleList.append(regal)
|
|
iteration+=1
|
|
|
|
for (i,j,x) in tupleList:
|
|
box = Box()
|
|
mapa[i][j].put(box)
|
|
"""
|
|
for t in tupleList:
|
|
listaRegalow.append((t[0],t[1]))
|
|
data.zajeteRegaly = listaRegalow
|
|
"""
|
|
return mapa
|
|
|
|
def znajdzBox(mapa, regals):
|
|
zajeteRegaly = []
|
|
|
|
for (x,y,z) in regals:
|
|
shelf = mapa[x][y]
|
|
tmp = shelf.occupied
|
|
if(tmp == True):
|
|
zajeteRegaly.append((x,y))
|
|
return zajeteRegaly
|
|
|
|
#wybiera z populacji dwa najlepsze chromosomy
|
|
|
|
|
|
|
|
def updateMap(data, map, mapForAstar, regals):
|
|
data.mapa = map
|
|
|
|
znajdzUnbox(data, map)
|
|
data.zajeteRegaly = znajdzBox(map, regals)
|
|
data.astarMap = data.genMap(mapForAstar)
|
|
|
|
def mutate(wspMutacji, chrom): #w zaleznosci od tego jak wiele mutwac wybierz pary i zamien miejscami
|
|
ileWChrom = len(chrom)
|
|
ileZmian = round(ileWChrom * wspMutacji)
|
|
for i in range(ileZmian):
|
|
pom = None
|
|
pierw = random.randint(0,ileWChrom - 1)
|
|
drug = random.randint(0,ileWChrom - 1)
|
|
pom = chrom[pierw]
|
|
chrom[pierw] = chrom[drug]
|
|
chrom[drug] = pom
|
|
return chrom
|
|
|
|
|
|
|
|
|
|
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]] |