2020-05-19 13:59:22 +02:00
from unboxOnTheFloor import UnboxOnTheFloor
from box import Box
from AStar import AStar
import random
2020-05-18 18:55:18 +02:00
from easygui import *
import matplotlib . pyplot as plt
2020-05-19 13:01:21 +02:00
def zbierzBox ( gen , data , moves , kordStartowy ) :
2020-05-18 18:55:18 +02:00
regalKordy = gen . kordy
star = AStar ( )
mapForAStar = data . astarMap [ : ]
mapForAStar [ regalKordy [ 0 ] ] [ regalKordy [ 1 ] ] = 0
2020-05-19 13:01:21 +02:00
path = star . search ( [ kordStartowy [ 0 ] , kordStartowy [ 1 ] ] , regalKordy , mapForAStar , 1 , 1 )
cns = kordStartowy [ 0 ]
cwe = kordStartowy [ 1 ]
2020-05-18 18:55:18 +02:00
value = path [ cns ] [ cwe ]
2020-05-19 13:01:21 +02:00
2020-05-18 18:55:18 +02:00
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 ) :
2020-05-19 13:01:21 +02:00
cwe = cwe + 1
2020-05-18 18:55:18 +02:00
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
2020-05-19 13:01:21 +02:00
path = star . search ( [ regalKordy [ 0 ] , regalKordy [ 1 ] ] , gen . kordyUnboxa , mapForAStar , 1 , 1 )
2020-05-18 18:55:18 +02:00
#mapForAStar[where[0]][where[1]] = 1
value = path [ cns ] [ cwe ]
while True :
2020-05-19 13:01:21 +02:00
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
2020-05-18 18:55:18 +02:00
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
2020-05-19 13:59:22 +02:00
2020-05-18 18:55:18 +02:00
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 ( )
2020-05-19 13:59:22 +02:00
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 )
2020-05-19 19:26:12 +02:00
2020-05-19 13:59:22 +02:00
2020-05-18 18:55:18 +02:00
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 ) :
2020-05-19 13:59:22 +02:00
return [ fieldValues [ 0 ] , fieldValues [ 1 ] , fieldValues [ 2 ] , fieldValues [ 3 ] ]