diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 72c409c..f2c0a1b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,12 +2,10 @@ - - - + + - - + - - + + @@ -36,8 +34,8 @@ - - + + @@ -54,8 +52,8 @@ - - + + @@ -64,10 +62,13 @@ - + - - + + + + + @@ -81,11 +82,11 @@ - + - - + + @@ -96,8 +97,8 @@ - - + + @@ -116,23 +117,10 @@ - 10 - regalsik - # - put - randomB - search - sear - rando - chi - genera - return - occupied astarstate grid whereDecision genMa - random mapfor tmp global @@ -142,10 +130,23 @@ eve doW self - moves gen - wybierz + data.gen + data.geny + crosso fitness + wybierzUnbox + genRandomPop + cro + moves + genPop + wybierzUn + cros + cross + cr + genpo + random + wybierz @@ -171,22 +172,22 @@ - @@ -383,16 +384,17 @@ + - - + + - + @@ -431,18 +433,8 @@ file://$PROJECT_DIR$/genetyczny/eee.py - 24 - - - file://$PROJECT_DIR$/genetyczny/funkcje.py - 197 - - - file://$PROJECT_DIR$/genetyczny/funkcje.py - 40 - @@ -585,6 +577,13 @@ + + + + + + + @@ -592,54 +591,34 @@ - + - - + + - + - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - + + @@ -650,10 +629,20 @@ + + + + + + + + + + - - + + @@ -662,13 +651,23 @@ - - + + + + + + + + + + + + \ No newline at end of file diff --git a/__pycache__/program.cpython-37.pyc b/__pycache__/program.cpython-37.pyc index dd8f3c3..6d62a98 100644 Binary files a/__pycache__/program.cpython-37.pyc and b/__pycache__/program.cpython-37.pyc differ diff --git a/genetyczny/Gene.py b/genetyczny/Gene.py index bc01c41..4950105 100644 --- a/genetyczny/Gene.py +++ b/genetyczny/Gene.py @@ -1,8 +1,9 @@ class Gene: - def __init__(self, kordydnaty): - self.kordy = kordydnaty + def __init__(self): + self.kordy = None self.unbox1 = None self.unbox2 = None - self.ktoryUnbox = None \ No newline at end of file + self.unboxWczesniejszegoGenu = None + self.kordyUnboxa = None \ No newline at end of file diff --git a/genetyczny/__pycache__/Gene.cpython-37.pyc b/genetyczny/__pycache__/Gene.cpython-37.pyc index e54eea9..427659b 100644 Binary files a/genetyczny/__pycache__/Gene.cpython-37.pyc and b/genetyczny/__pycache__/Gene.cpython-37.pyc differ diff --git a/genetyczny/__pycache__/eee.cpython-37.pyc b/genetyczny/__pycache__/eee.cpython-37.pyc index 1e7516d..4418120 100644 Binary files a/genetyczny/__pycache__/eee.cpython-37.pyc and b/genetyczny/__pycache__/eee.cpython-37.pyc differ diff --git a/genetyczny/__pycache__/funkcje.cpython-37.pyc b/genetyczny/__pycache__/funkcje.cpython-37.pyc index 9e69849..f60dffc 100644 Binary files a/genetyczny/__pycache__/funkcje.cpython-37.pyc and b/genetyczny/__pycache__/funkcje.cpython-37.pyc differ diff --git a/genetyczny/eee.py b/genetyczny/eee.py index 481f1eb..8fed831 100644 --- a/genetyczny/eee.py +++ b/genetyczny/eee.py @@ -7,11 +7,11 @@ import matplotlib.animation as animation def start(data, wheel): - ileGeneracji = 200 + ileGeneracji = 500 ileWPopulacji = 16 - fragment = 0.2 + fragment = 0.5 mutacja = 0.05 - unbox = 3 + unbox = 1 data.kordyWozka = (wheel.ns, wheel.we) @@ -22,24 +22,27 @@ def start(data, wheel): if i == 0: best2 = dwieNajlepsze(randomPopulation, data) else: - x = genPopulacje(best2[0], best2[1], ileWPopulacji, fragment, mutacja) + x = genPopulacje(data,best2[0], best2[1], ileWPopulacji, fragment, mutacja) best2 = dwieNajlepsze(x, data) + del x + data.histZmian.append(data.best[1]) - break - #rysujWykres(data, ileGeneracji, 1000, 2000) + + + rysujWykres(data, ileGeneracji, 0, 2000) -def ruszWozek(gen,data, moves, wheel): +def zbierzBox(gen,data, moves, kordStartowy): regalKordy = gen.kordy - unbox = data.unbox[gen.ktoryUnbox] star = AStar() mapForAStar = data.astarMap[:] mapForAStar[regalKordy[0]][regalKordy[1]] = 0 - path = star.search([wheel.ns, wheel.we], regalKordy, mapForAStar, 1, 1) - cns = wheel.ns - cwe = wheel.we + 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 @@ -57,7 +60,7 @@ def ruszWozek(gen,data, moves, wheel): value = value + 1 continue if cwe < (len(mapForAStar[0]) - 1) and path[cns][cwe + 1] == (value + 1): - cns = cns + 1 + cwe = cwe + 1 moves.append(4) value = value + 1 continue @@ -65,10 +68,21 @@ def ruszWozek(gen,data, moves, wheel): 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]], unbox, mapForAStar, 1, 1) + 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) @@ -140,3 +154,11 @@ def okno(): 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 diff --git a/genetyczny/funkcje.py b/genetyczny/funkcje.py index fd0d297..614b3be 100644 --- a/genetyczny/funkcje.py +++ b/genetyczny/funkcje.py @@ -10,14 +10,16 @@ import numpy def generateGeny(data): + geny = [] zajeteRegaly = data.zajeteRegaly[:] for r in zajeteRegaly: - g = Gene(r) + g = Gene() + g.kordy = r g.unbox1 = policzCost(data.astarMap,r,data.unbox[0]) if(len(data.unbox) > 1): g.unbox2 = policzCost(data.astarMap,r,data.unbox[1]) - data.geny.append(g) - + geny.append(g) + return geny def znajdzUnbox(data,mapa): unboxy = [] @@ -38,15 +40,15 @@ def policzCost(mapaBoxy, poczatek, koniec): return koszt def genRandomChromosome(data): - chromosome = data.geny[:] + chromosome = generateGeny(data) random.shuffle(chromosome) - krotkaKosztJakiUnbox = None unboxLastGen = None for gen in chromosome: - gen.ktoryUnbox = unboxLastGen + gen.unboxWczesniejszegoGenu = unboxLastGen krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt) unboxLastGen = krotkaKosztJakiUnbox[1] + gen.kordyUnboxa = data.unbox[krotkaKosztJakiUnbox[1]] return chromosome def genRandomPopulation(data, ileWPopulacji): @@ -80,7 +82,7 @@ def fitness(chromosome, data): return koszt -def wybierzUnbox(gen, jakLiczycKoszt): +def wybierzUnbox(gen, jakLiczycKoszt): #funkcja ustawiajaca jaki unbox if(jakLiczycKoszt == 0): x = random.choice([gen.unbox1, gen.unbox2]) if(x == gen.unbox1): @@ -136,6 +138,7 @@ def znajdzBox(mapa, regals): zajeteRegaly.append((x,y)) return zajeteRegaly +#wybiera z populacji dwa najlepsze chromosomy def dwieNajlepsze(populacja, data): tmpPopulacja = populacja[:] chromFitness = [] @@ -164,37 +167,56 @@ def dwieNajlepsze(populacja, data): return (pierwsza, druga) -def genPopulacje(pierwszy, drugi, ileWPopulacji, fragmentLiczba, wspMutacji): +def genPopulacje(data,pierwszy, drugi, ileWPopulacji, fragmentLiczba, wspMutacji): ileWChrom = len(pierwszy) fragment = round(fragmentLiczba*ileWChrom) + if(fragment == 1): + fragment +=1 nowaPopulacja = [] for i in range(ileWPopulacji): - nowaPopulacja.append(crossover(pierwszy,drugi,fragment, wspMutacji)) + nowaPopulacja.append(crossover(data,pierwszy,drugi,fragment, wspMutacji)) return nowaPopulacja -def crossover(pierwszy, drugi, fragmentLiczba, wspMutacji): +def crossover(data,pierwszy, drugi, fragmentLiczba, wspMutacji): ileWChrom = len(pierwszy) tmp = random.randint(0, ileWChrom-fragmentLiczba) kordyFragment = (tmp,tmp+fragmentLiczba) - nowyChrom = [None] * ileWChrom + nowyChrom = [Gene() for q in range(ileWChrom)] iterator = kordyFragment[1] pomIterator = kordyFragment[1] - nowyChrom[kordyFragment[0]:kordyFragment[1]] = pierwszy[kordyFragment[0]:kordyFragment[1]] + usedKordy = [] + for i in range(kordyFragment[0],kordyFragment[1]): + nowyChrom[i].kordy = pierwszy[i].kordy + nowyChrom[i].unbox1 = pierwszy[i].unbox1 + nowyChrom[i].unbox2 = pierwszy[i].unbox2 + usedKordy.append(pierwszy[i].kordy) - while(None in nowyChrom): + for x in range(ileWChrom): if(iterator > ileWChrom - 1): iterator = 0 if(pomIterator > ileWChrom - 1): pomIterator = 0 - if(nowyChrom[iterator] == None and drugi[pomIterator] not in nowyChrom): - nowyChrom[iterator] = drugi[pomIterator] + if(nowyChrom[iterator].kordy == None and drugi[pomIterator].kordy not in usedKordy): + nowyChrom[iterator].kordy = drugi[pomIterator].kordy + nowyChrom[iterator].kordy = drugi[pomIterator].kordy + nowyChrom[iterator].unbox1 = drugi[pomIterator].unbox1 + nowyChrom[iterator].unbox2 = drugi[pomIterator].unbox2 iterator += 1 pomIterator += 1 - elif(nowyChrom[iterator] == None and drugi[pomIterator] in nowyChrom): + else: pomIterator +=1 + nowyChrom = mutate(wspMutacji, nowyChrom) + unboxLastGen = None + + for gen in nowyChrom: + gen.unboxWczesniejszegoGenu = unboxLastGen + krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt) + unboxLastGen = krotkaKosztJakiUnbox[1] + gen.kordyUnboxa = data.unbox[krotkaKosztJakiUnbox[1]] + return nowyChrom @@ -205,7 +227,7 @@ def updateMap(data, map, mapForAstar, regals): data.zajeteRegaly = znajdzBox(map, regals) data.astarMap = data.genMap(mapForAstar) -def mutate(wspMutacji, chrom): +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): diff --git a/program.py b/program.py index 12859b6..ceeb9da 100644 --- a/program.py +++ b/program.py @@ -59,7 +59,7 @@ class MainWindow: self.map[i][j] = Shelf(self.screen, self.cell, i, j, (self.map[i][j]-3)%4, (self.map[i][j]-3)//4) self.mapForAStar[i][j] = 1 - self.map = randomBox(self.map, self.regals, 5) + self.map = randomBox(self.map, self.regals, 15) updateMap(self.data, self.map, self.mapForAStar, self.regals) generateGeny(self.data) @@ -94,7 +94,12 @@ class MainWindow: if event.key == pygame.K_g: start(self.data,self.wheel) for gen in self.data.best[0]: - ruszWozek(gen,self.data, self.moves, self.wheel) + if(gen.unboxWczesniejszegoGenu == None): + kordStartowy = (self.wheel.ns, self.wheel.we) + else: + kordStartowy = self.data.unbox[gen.unboxWczesniejszegoGenu] + + zbierzBox(gen,self.data, self.moves, kordStartowy) elif len(self.moves)==0: self.wheel.move(event, self.map)