diff --git a/.idea/workspace.xml b/.idea/workspace.xml index d69a6f3..6c26ce9 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,12 +2,12 @@ - + - - - + + + - toVisit - dra - neuro - where regals isOccupied print @@ -146,13 +151,17 @@ mapfor tmp global + cop + jakLiczycKoszt + jakLiczyc + fitness @@ -171,20 +180,21 @@ - - - + - - - + + + + + - - @@ -380,23 +390,23 @@ - + - + - - + + - + - + - + @@ -429,9 +439,9 @@ - file://$PROJECT_DIR$/program.py - 98 - @@ -533,13 +543,6 @@ - - - - - - - @@ -567,6 +570,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -576,76 +631,38 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - + + + + + - + - - + + diff --git a/Mapa/__pycache__/generate.cpython-37.pyc b/Mapa/__pycache__/generate.cpython-37.pyc index 685a68a..b301ded 100644 Binary files a/Mapa/__pycache__/generate.cpython-37.pyc and b/Mapa/__pycache__/generate.cpython-37.pyc differ diff --git a/__pycache__/AStar.cpython-37.pyc b/__pycache__/AStar.cpython-37.pyc index c85f72f..7eb6304 100644 Binary files a/__pycache__/AStar.cpython-37.pyc and b/__pycache__/AStar.cpython-37.pyc differ diff --git a/__pycache__/program.cpython-37.pyc b/__pycache__/program.cpython-37.pyc index 49cf25b..48eff3b 100644 Binary files a/__pycache__/program.cpython-37.pyc and b/__pycache__/program.cpython-37.pyc differ diff --git a/genetyczny/Data.py b/genetyczny/Data.py index 2281ecc..ce68143 100644 --- a/genetyczny/Data.py +++ b/genetyczny/Data.py @@ -8,7 +8,11 @@ class Data: self.mapa = [] self.unbox = [] self.astarMap = [] - + self.geny = [] + self.kordyWozka = None + self.jakLiczycKoszt = None + self.best = None + self.histZmian = [] def genMap(self, mapa): tmpMap =[] diff --git a/genetyczny/Gene.py b/genetyczny/Gene.py index 075688e..bc01c41 100644 --- a/genetyczny/Gene.py +++ b/genetyczny/Gene.py @@ -1,8 +1,8 @@ class Gene: - def __init__(self, poczatkowa, koncowa, name): - self.poczatkowa = poczatkowa - self.koncowa = koncowa - self.koszt = 0 - self.name = name + def __init__(self, kordydnaty): + self.kordy = kordydnaty + self.unbox1 = None + self.unbox2 = None + self.ktoryUnbox = None \ No newline at end of file diff --git a/genetyczny/__pycache__/Data.cpython-37.pyc b/genetyczny/__pycache__/Data.cpython-37.pyc index f2082c6..0fce18f 100644 Binary files a/genetyczny/__pycache__/Data.cpython-37.pyc and b/genetyczny/__pycache__/Data.cpython-37.pyc differ diff --git a/genetyczny/__pycache__/Gene.cpython-37.pyc b/genetyczny/__pycache__/Gene.cpython-37.pyc new file mode 100644 index 0000000..e54eea9 Binary files /dev/null and b/genetyczny/__pycache__/Gene.cpython-37.pyc differ diff --git a/genetyczny/__pycache__/funkcje.cpython-37.pyc b/genetyczny/__pycache__/funkcje.cpython-37.pyc index 0efff03..74e2f21 100644 Binary files a/genetyczny/__pycache__/funkcje.cpython-37.pyc and b/genetyczny/__pycache__/funkcje.cpython-37.pyc differ diff --git a/genetyczny/funkcje.py b/genetyczny/funkcje.py index e860f53..bccff64 100644 --- a/genetyczny/funkcje.py +++ b/genetyczny/funkcje.py @@ -3,6 +3,20 @@ from genetyczny.Gene import Gene from Mapa.box import Box from AStar import AStar import random +import numpy + + + + + +def generateGeny(data): + zajeteRegaly = data.zajeteRegaly[:] + for r in zajeteRegaly: + g = Gene(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) def znajdzUnbox(data,mapa): @@ -15,8 +29,7 @@ def znajdzUnbox(data,mapa): iterator += 1 data.unbox = unboxy -def wybierzUnbox(data): - return random.choice(data.unbox) + def policzCost(mapaBoxy, poczatek, koniec): @@ -24,31 +37,69 @@ def policzCost(mapaBoxy, poczatek, koniec): koszt = astar.search(poczatek, koniec, mapaBoxy, 1, 0) return koszt -def generateChromosome(data, mapaBoxy, wheelxy): - chromosome = [] - regaly = data.zajeteRegaly - random.shuffle(regaly) - - - for r in regaly: - gen0 = Gene(wheelxy,r,"poczatek-regal") - gen0.koszt = policzCost(mapaBoxy, wheelxy, r) - chromosome.append(gen0) - - unbox = wybierzUnbox(data) - gen1 = Gene(r,unbox,"regal-unbox") - gen1.koszt = policzCost(mapaBoxy, r, unbox) - chromosome.append(gen1) +def genRandomChromosome(data): + chromosome = data.geny[:] + random.shuffle(chromosome) + krotkaKosztJakiUnbox = None + unboxLastGen = None + for gen in chromosome: + gen.ktoryUnbox = unboxLastGen + krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt) + unboxLastGen = krotkaKosztJakiUnbox[1] return chromosome -def generatePopulation(data, mapaBoxy, wheelxy, ileWPopulacji): +def genRandomPopulation(data, ileWPopulacji): populacja = [] for i in range(ileWPopulacji): - populacja.append(generateChromosome(data, mapaBoxy, wheelxy)) - + populacja.append(genRandomChromosome(data)) return populacja + +def fitness(chromosome, data): + koszt = 0 + unboxPoprzedniegoGenu = None + + for item, gen in enumerate(chromosome): + if(item == 0): + koszt += policzCost(data.astarMap, data.kordyWozka, gen.kordy) + krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt) + koszt += krotkaKosztJakiUnbox[0] + unboxPoprzedniegoGenu = krotkaKosztJakiUnbox[1] + + else: + if unboxPoprzedniegoGenu == 0: + koszt += gen.unbox1 + elif unboxPoprzedniegoGenu == 1: + koszt += gen.unbox2 + + krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt) + koszt += krotkaKosztJakiUnbox[0] + unboxPoprzedniegoGenu = krotkaKosztJakiUnbox[1] + + + return koszt + +def wybierzUnbox(gen, jakLiczycKoszt): + 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 @@ -84,3 +135,83 @@ def znajdzBox(mapa, regals): if(tmp == True): zajeteRegaly.append((x,y)) return zajeteRegaly + +def dwieNajlepsze(populacja, data): + tmpPopulacja = populacja[:] + chromFitness = [] + + for chrom in populacja: + chromFitness.append(fitness(chrom,data)) + + bestValue = min(chromFitness) + bestChromIndex = chromFitness.index(bestValue) + pierwsza = tmpPopulacja[bestChromIndex] + if (data.best == None): + data.best = (pierwsza[:],bestValue) + elif(data.best[1] > bestValue): + data.best = (pierwsza[:],bestValue) + + tmpPopulacja.pop(bestChromIndex) + chromFitness.pop(bestChromIndex) + + bestValue = min(chromFitness) + bestChromIndex = chromFitness.index(bestValue) + druga = tmpPopulacja[bestChromIndex] + tmpPopulacja.pop(bestChromIndex) + chromFitness.pop(bestChromIndex) + + + return (pierwsza, druga) + +def genPopulacje(pierwszy, drugi, ileWPopulacji, fragmentLiczba, wspMutacji): + ileWChrom = len(pierwszy) + fragment = round(fragmentLiczba*ileWChrom) + nowaPopulacja = [] + + for i in range(ileWPopulacji): + nowaPopulacja.append(crossover(pierwszy,drugi,fragment, wspMutacji)) + + return nowaPopulacja + +def crossover(pierwszy, drugi, fragmentLiczba, wspMutacji): + ileWChrom = len(pierwszy) + tmp = random.randint(0, ileWChrom-fragmentLiczba) + kordyFragment = (tmp,tmp+fragmentLiczba) + nowyChrom = [None] * ileWChrom + iterator = kordyFragment[1] + pomIterator = kordyFragment[1] + nowyChrom[kordyFragment[0]:kordyFragment[1]] = pierwszy[kordyFragment[0]:kordyFragment[1]] + + while(None in nowyChrom): + 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] + iterator += 1 + pomIterator += 1 + elif(nowyChrom[iterator] == None and drugi[pomIterator] in nowyChrom): + pomIterator +=1 + nowyChrom = mutate(wspMutacji, nowyChrom) + return nowyChrom + + +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): + 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 \ No newline at end of file diff --git a/genetyczny/genetyczny.py b/genetyczny/genetyczny.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/genetyczny/genetyczny.py @@ -0,0 +1 @@ + diff --git a/main.py b/main.py index 6cf72fc..a2fb1cf 100644 --- a/main.py +++ b/main.py @@ -34,7 +34,7 @@ def main(): """ if good: szerokosc = 15#min 6 - wysokosc = 8 #min 7 + wysokosc = 10 #min 7 kruche = 1 latwopalne = 1 radioaktywne = 1 diff --git a/program.py b/program.py index 8008cd5..92c030c 100644 --- a/program.py +++ b/program.py @@ -58,12 +58,9 @@ 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, 10) - self.data.mapa = self.map - znajdzUnbox(self.data,self.map) - self.data.zajeteRegaly = znajdzBox(self.map, self.regals) - tmp = self.mapForAStar[:] - self.data.astarMap = self.data.genMap(tmp) + self.map = randomBox(self.map, self.regals, 25) + updateMap(self.data, self.map, self.mapForAStar, self.regals) + generateGeny(self.data) ################################################# @@ -95,7 +92,18 @@ class MainWindow: print("eee") """ elif(event.type==pygame.KEYDOWN): - populacja = generatePopulation(self.data, self.data.astarMap, [self.wheel.ns, self.wheel.we], 100) + + self.data.kordyWozka = (self.wheel.ns, self.wheel.we) + self.data.jakLiczycKoszt = 1 + + randomPopulation = genRandomPopulation(self.data, 5) + for i in range(100): + if i == 0: + best2 = dwieNajlepsze(randomPopulation, self.data) + else: + x = genPopulacje(best2[0], best2[1], 5, 0.2, 0.3) + best2 = dwieNajlepsze(x, self.data) + self.data.histZmian.append(self.data.best[1]) if len(self.moves)==0: self.wheel.move(event, self.map) elif(event.type==pygame.MOUSEBUTTONDOWN):