From 33726c29d5ec4f155de097bc61da17acaa39ed96 Mon Sep 17 00:00:00 2001 From: tomasz Date: Tue, 19 May 2020 13:01:21 +0200 Subject: [PATCH] dzialajacy algorytm oraz zbieranie boxow --- .idea/workspace.xml | 177 +++++++++--------- __pycache__/program.cpython-37.pyc | Bin 4758 -> 4850 bytes genetyczny/Gene.py | 7 +- genetyczny/__pycache__/Gene.cpython-37.pyc | Bin 459 -> 481 bytes genetyczny/__pycache__/eee.cpython-37.pyc | Bin 3368 -> 3716 bytes genetyczny/__pycache__/funkcje.cpython-37.pyc | Bin 4714 -> 5221 bytes genetyczny/eee.py | 48 +++-- genetyczny/funkcje.py | 56 ++++-- program.py | 9 +- 9 files changed, 173 insertions(+), 124 deletions(-) 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 dd8f3c39a985f5de3e9d3ed0de805aa8f7f0e5a1..6d62a98e127a6187af8daee4048acbeeb3ccfecf 100644 GIT binary patch delta 1286 zcmaJ>&rcIU7@co+7k0Pp0tNd+L{J0-FL?1_h!TGULo^|BXwrllWoqM+Z0&RjmCU+_ zzu8g{3bdKo%zIzozVCaxeLMDN%(|6G zm;^r${%#lU4u7(~Xwb9uP2+SlhNz@&Sn$S%=!R z(6KkQ4*aWRn2{kZR+!945 za*{#0G>I%pHQJ$OM3yMex6SU^GMV4?iwm=f4RG1CQem}L)J z5CkE((t~=~#hW)Nc<>^K7Z3geJ^2^(;9uaI-6YliN|;&Zecycc&HGOBXMTI$xm_$4 zfIi{&_xAPrXXmSd#?DVeusIc0;|`6@1s$NT_hvnCF=h$erPXRBYMXPx2Z^ppaci9k z=@lfnV>IlLA@m-om0RRkqaCYLKJy&O1{tL^OGoIoS74*=jnldmB1hu9Q(9b>NY6?_ zq^?76(daFwNOe3-#TAvapavm&6Dmx>$@sKab*H#SU!5B~$MYS%gWP43?ps4N6rt@5fsqBtAO3>gIw-Uq8 zWeI*hOYu#alldA*vj)D^$KDm0r?csO6tPmcH3gX}X@3>gS*oP*lu?T3iHiuCt{B~x z%%^>7P@ic3I`lCRdl{~J7`LZhQ-u+Z9m1JuNlaWD7CR_wSdvmq6{F*jJycTR03&Eg zGpkAYF{+D+t$k!#+CFmYKv`o4kgdmbu5N1uxbnXtbw#FL>D;QpA}BKk?bjs)?#KXc z9hrW#4Vq{iV}nvovVnDf|6@at`Jf4Lj15XT$p(eXY|zA){hp<_W7spL9AiU3{#yMM za)b@K7+phk6R3$pq*4e;yNAyHZvzp@2AWsEyGVVl(6|()Ki;R8yAGKH%h0qRMTzZV zGqQ`z(aYjnbC+#wK4CA`q8X=IDTu4|=OJ#;w5xU2HpIP%JGUlZ(Hd|9Z7eXGW(O-c nz4Ofp5I;sY$A1}1q<@OaR&iBodcJ#VUg<6F?EIpX%21GOq9)@lmg3Z$ zw3Q4+91~wTv4gE-WSeZrXeSC{7jd8xoReD^71huMfog7X*yQG?l;)(`F#~zUK+FID DUs5bk delta 197 zcmaFJe43fpiITZlX-=vgGmuvd#0&r$%PiXf diff --git a/genetyczny/__pycache__/eee.cpython-37.pyc b/genetyczny/__pycache__/eee.cpython-37.pyc index 1e7516d6ba12dab86aab36ade40e1ba164fe6fc1..4418120c5fcab0ff3d1cca635d71631da73ed857 100644 GIT binary patch delta 1793 zcmZ`)&u<$=6rP#g9q+E~v{Y$gyGa!gYO!d0D5WRUhz2BnNL8wUBCSe=@or6QXSbfU z8#~&?6%IEJww4PBiR2cp6u|*b<-gbyst{5{kG*l>y;&REiL%x{kKcRy&3oUs^L$v? zTb{d}&6)(R+rRyB|H8s>E=NBfUj8(jv9o)`I%6vvq&PSHdd1WsXAN%uo8d1vd-qye z!20wZ^2vIr2fEGcOnlVhK`J1978=b`3s!+)^E_G&tP-e!*5{!KS!R;;1$@`^eFLnC zIR})IW@(ey1U60G*?K_~sJ3XIgjzsr%m(bQSe}I3rU4IBo8}4BrrO{ukwDv50tJ0w!Bb^W zGq;(|4zw_pM4($43k~R1$L;{l9MH}=V1d?Eafp7K<$4GV!N9cHA_001rJDc%+lLLY z*(4U4%|@UDp}bGwK~g8;c>=O{9OF4+ERHdhV;BY&FreZJKHbCZ5pGg~3`rkUk431* z0k8<{e_RMW(HZxN8_!^M5Fd(3u(VmM^&V+9KuUHB&64_rc%Yfo_!QBz#QqK}(K;J2 zVU4IAv0^juQs4^d22R}j)2u=NGJ%QAm^Am+q!;966u*-26dLZuNgR6}#XtDJ&zZuS zPXQMRXX5+W!lbM{&|HQ_)tyv*KoMeEcgX*Hx`!#cF>=dBo7b@gzqom|`l{>YlK>(Z5<@ z?F@KgrQx`7S~@>=Kl3`}Vmel;jw@cmsJ87ra{M@h@r_nlw7i|JWeTTSZhRlgDQa(e`&Yy}9r}Kp+%s4ll z(Uwe!<>*QJ?eoXlSG~IHbt5Blw^u>-@j?NRe>v4}z@l?4ATZG{g)CqJ#W_${1ea@= zhH_2zNgzj8lW)Rwg*mNE30tHw7Y?dZR4fDZazwdOD~k+(%jTi;H)dqX?(TREcdNEu z-rjO5KR}+3e>8-dGzZd%Rah6#M)xw0H*m6xt7zUt^A;KmPq8_nR4;9NcDv!+!k5mU T2O|}x8L6|rq`#+U^-KQ&h&7Fq delta 1417 zcmZ`(O=}ZD7@nE^-fXJ2l_sf`3WX9x@nTP@rG6YlEtMjbptZ5PRI_O|olUhVvqXsE zwds1%Q+rboLG-L3Jt+QzoJ717JoF#v`)-n^sdizWoqa!^dFGi+o({cE^<0d{O#;tq z_+{>UU%e+m=j)^MiZnygR{h1WsX^`%41c5kX)Km4D}vSNWpa0_{wL`ewwffuur)wQ z$U>ybbfG*4m1k|a>dQjG*EL}VM* zeugp4ra}|4O_Kz)%QnO^M5vpJkn$=FZIQu#G@IFMO9^z021XSVfhlxhK$8hHv30uI z3kFbE=5H}>vjh@CPQ+|BKwJj#C<=D4O&#dKhGs5^EtiB*HiTBA*yj?y+vFHH$gztY z169%@kq(fUC}5rPb8TrY87&D>#>5ziM-lSDeiVUTw1q&2=x{}HfUAo8iBhPhEk@}k zgCj1%5wk<=jVx~(4i+o>Ebex7r0ME9Y)s|Cr49j}BYgr?M z>kYo*ug!XEj(Z9|{SpA7Dz#wr(0-bNH-3ea+F5pzh0nE*R0}hDN{vGy9|`a1qZwS7 zCjqi*1$CFRa^*_V<_QQjXr;MYXUQ0^_$&F@ipw2;?!#yOssxmVH8?l~^=p0ELT>mm zka+&W@X|^-w~&9x)o{W}(39b9Yx4Mk4alBb^xW{Bb(5u!gzw`|uH%0YKZ9@{VH}~; g)X|}5mOOi<;9S7}GQSr2h|6YVB8LT)i9{ z5p9#$l!i1*EHc0gb#l}4X^yn9*Nz;t+tg?Crnvr$53HqqxTI?dY2KrhEDf0jBB{DV zciGl_L-;G|2YPsuU0z%a>VDqpn0`4b7tOh#zM>5F?v_C~AfYBrQ0YB|4<87+<#%;Jgc3hyfCC@23L$Dim#aFnAN14*nfbA|gqf#x$a9Oj10e zj{qEz6ad&C8y{R6UFB}y~oRiep%%ER6Z;34S zxs@BDQEP;aTF~+I5*Ny01QR<3z@?s;n-#alM)rbl*bjnG4xpI~f%8Bgq+(p1vkG)v z-LuXQ96>*>{SaP2YM=VYdU^=)5|}haS0AF#Se-8mbQGf~wxjS+q(S5zu~Q8=6FU%g zu^Yv}hQOcKab~MgJqW`S>U}3q52(+b$CDe=J4UTq&znNe)+^_54qbU}6}|P0`jY4A zsQQsVN~Um=5fq11oVY|M)Gvv>w5t9}jMHOkyZccV;}Z@FTvEKGzH#^E+MtGbZpbN? z1z2nV20}me=ubC6?E~m}SQ*|t>RP5OoU%6qZ(26R_+N`ZpVAVxZcE`tIoL?MOj zh)Pr1gP2Z^bbLC`#29`jN$fz4@#WnSBvTs`YdB6wzJ_T9b0NhXX|*j~ABUhk_1(Xm9MS@*>r^;&8$=XMih*o4RsyOT_}@YG!_Mj^C2mv#p+O^=!Lm+cLT4 ztk2OPT`Q2~`|I0Zy&I=wLR!8#M1X>R_9-00ZEbWsh7K2&O5m10nP<1CI0Klw`UuH+ z=NVi3!I9R-pSAIbuujS9jpGr~wq?RM;XlL1`s*&W9&V@)3nb!@8XVYz1G}V`k4g?m z9E>wEEiZb{yopQnen5J=mw2W24|j23_o0Gb%@c*oF?H zD0J;3^@$xI@_jnP#hci14#it2&ZD@1;#GAbbD&jBG{e9@kJpHpz;0dXW2k9D`5!tG zXJPa^XyIuPSR2R!{oVSYLtx=M2$kZ&t%Gf}*Ovt!mw7;^>y&D9x|xZy>QUy(z$sWv zvrW+kGJdzi>OxSgRm*iTp7%Q6yDk2*^O}tM!Z|2S0_uhPOo|XPA zW-g}Fjsnjc{UFc1HFy4g`wgI?uTk+xjQY|Pk*{g7}qFnzlRwKgI0g1Ip z1q+QM>OLtb1C47pjmSiOKzy~Sv&#Q$z>l=Cz=H1ETzg1}vYRWzKQ7d>?NtYdYgBvP>S_@7BG+J}=)$RPv!E4(L93SJnkV6sJqDI~)fXR!Aqh>Ok%(cv(^0Gs>hWelu3H3uuQWQiu*Ugxa`b(foY@ zr(`@) zhKbf{v|XJ^yBYC_P8sNKQ~X3-a$NjP4@OexVjAJBIIypglF*$qq%O`nr^%8iJD-i7 z$3+XFfN)McbLI>8Kn#bZ(A7~$)C6KcLKhCsjM&7SN6S~mo2glHT3kFjQuYVp2w~useJ;pRrAV2H8wcD>QQA& zjZI&v!%7Y^;--&{O`m^l$i_r^OT90d<2_^3?hV0f0^h 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)