From 162c9394a7928504f0a7a26fcb9860233ad60c95 Mon Sep 17 00:00:00 2001 From: tomasz Date: Tue, 12 May 2020 20:38:39 +0200 Subject: [PATCH 01/11] wprowadzenie komentarzy oraz drobne modyfikacje kodu --- box.py => Mapa/box.py | 0 boxOnTheFloor.py => Mapa/boxOnTheFloor.py | 0 floor.py => Mapa/floor.py | 0 generate.py => Mapa/generate.py | 4 +++- shelf.py => Mapa/shelf.py | 0 unboxOnTheFloor.py => Mapa/unboxOnTheFloor.py | 1 + wall.py => Mapa/wall.py | 0 genetyczny/Data.py | 0 genetyczny/metody.py | 0 README.md => opis/README.md | 0 environment.md => opis/environment.md | 0 route-planning.md => opis/route-planning.md | 0 12 files changed, 4 insertions(+), 1 deletion(-) rename box.py => Mapa/box.py (100%) rename boxOnTheFloor.py => Mapa/boxOnTheFloor.py (100%) rename floor.py => Mapa/floor.py (100%) rename generate.py => Mapa/generate.py (99%) rename shelf.py => Mapa/shelf.py (100%) rename unboxOnTheFloor.py => Mapa/unboxOnTheFloor.py (93%) rename wall.py => Mapa/wall.py (100%) create mode 100644 genetyczny/Data.py create mode 100644 genetyczny/metody.py rename README.md => opis/README.md (100%) rename environment.md => opis/environment.md (100%) rename route-planning.md => opis/route-planning.md (100%) diff --git a/box.py b/Mapa/box.py similarity index 100% rename from box.py rename to Mapa/box.py diff --git a/boxOnTheFloor.py b/Mapa/boxOnTheFloor.py similarity index 100% rename from boxOnTheFloor.py rename to Mapa/boxOnTheFloor.py diff --git a/floor.py b/Mapa/floor.py similarity index 100% rename from floor.py rename to Mapa/floor.py diff --git a/generate.py b/Mapa/generate.py similarity index 99% rename from generate.py rename to Mapa/generate.py index 65ad33c..8f94ff0 100644 --- a/generate.py +++ b/Mapa/generate.py @@ -171,4 +171,6 @@ class Generate: all[wysokosc-2][szerokosc-3] = 2 all[wysokosc-1][szerokosc-3] = 23 all[wysokosc-2][szerokosc-4] = 1 - return all \ No newline at end of file + return all + +x = Generate.generate(8, 9, 1, 1, 1, 1) \ No newline at end of file diff --git a/shelf.py b/Mapa/shelf.py similarity index 100% rename from shelf.py rename to Mapa/shelf.py diff --git a/unboxOnTheFloor.py b/Mapa/unboxOnTheFloor.py similarity index 93% rename from unboxOnTheFloor.py rename to Mapa/unboxOnTheFloor.py index 8e2ab0e..3f2013a 100644 --- a/unboxOnTheFloor.py +++ b/Mapa/unboxOnTheFloor.py @@ -6,5 +6,6 @@ class UnboxOnTheFloor: self.ns = ns self.we = we self.screen = screen + def draw(self): pass \ No newline at end of file diff --git a/wall.py b/Mapa/wall.py similarity index 100% rename from wall.py rename to Mapa/wall.py diff --git a/genetyczny/Data.py b/genetyczny/Data.py new file mode 100644 index 0000000..e69de29 diff --git a/genetyczny/metody.py b/genetyczny/metody.py new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/opis/README.md similarity index 100% rename from README.md rename to opis/README.md diff --git a/environment.md b/opis/environment.md similarity index 100% rename from environment.md rename to opis/environment.md diff --git a/route-planning.md b/opis/route-planning.md similarity index 100% rename from route-planning.md rename to opis/route-planning.md From 97b64f4f02fc035dc1cd0810f5f827b8bc844142 Mon Sep 17 00:00:00 2001 From: tomasz Date: Tue, 12 May 2020 20:39:36 +0200 Subject: [PATCH 02/11] drobne modyfikacje kodu oraz komentarze --- .idea/AI.iml | 13 + .idea/encodings.xml | 4 + .idea/libraries/R_User_Library.xml | 6 + .idea/misc.xml | 4 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/workspace.xml | 602 ++++++++++++++++++ AStar.py | 12 +- Mapa/__pycache__/box.cpython-37.pyc | Bin 0 -> 416 bytes Mapa/__pycache__/boxOnTheFloor.cpython-37.pyc | Bin 0 -> 916 bytes Mapa/__pycache__/floor.cpython-37.pyc | Bin 0 -> 578 bytes Mapa/__pycache__/generate.cpython-37.pyc | Bin 0 -> 3030 bytes Mapa/__pycache__/shelf.cpython-37.pyc | Bin 0 -> 2334 bytes .../unboxOnTheFloor.cpython-37.pyc | Bin 0 -> 618 bytes Mapa/__pycache__/wall.cpython-37.pyc | Bin 0 -> 729 bytes Mapa/generate.py | 6 +- __pycache__/AStar.cpython-37.pyc | Bin 0 -> 2510 bytes __pycache__/AStarState.cpython-37.pyc | Bin 0 -> 799 bytes __pycache__/Evencik.cpython-37.pyc | Bin 0 -> 396 bytes __pycache__/neurons.cpython-37.pyc | Bin 0 -> 1993 bytes __pycache__/program.cpython-37.pyc | Bin 0 -> 4400 bytes __pycache__/wheel.cpython-37.pyc | Bin 0 -> 3886 bytes __pycache__/whereDecision.cpython-37.pyc | Bin 0 -> 1805 bytes genetyczny/Data.py | 6 + genetyczny/__pycache__/metody.cpython-37.pyc | Bin 0 -> 347 bytes genetyczny/metody.py | 11 + main.py | 10 +- neurons.py | 5 +- program.py | 30 +- wheel.py | 11 +- whereDecision.py | 3 +- 31 files changed, 715 insertions(+), 22 deletions(-) create mode 100644 .idea/AI.iml create mode 100644 .idea/encodings.xml create mode 100644 .idea/libraries/R_User_Library.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 Mapa/__pycache__/box.cpython-37.pyc create mode 100644 Mapa/__pycache__/boxOnTheFloor.cpython-37.pyc create mode 100644 Mapa/__pycache__/floor.cpython-37.pyc create mode 100644 Mapa/__pycache__/generate.cpython-37.pyc create mode 100644 Mapa/__pycache__/shelf.cpython-37.pyc create mode 100644 Mapa/__pycache__/unboxOnTheFloor.cpython-37.pyc create mode 100644 Mapa/__pycache__/wall.cpython-37.pyc create mode 100644 __pycache__/AStar.cpython-37.pyc create mode 100644 __pycache__/AStarState.cpython-37.pyc create mode 100644 __pycache__/Evencik.cpython-37.pyc create mode 100644 __pycache__/neurons.cpython-37.pyc create mode 100644 __pycache__/program.cpython-37.pyc create mode 100644 __pycache__/wheel.cpython-37.pyc create mode 100644 __pycache__/whereDecision.cpython-37.pyc create mode 100644 genetyczny/__pycache__/metody.cpython-37.pyc diff --git a/.idea/AI.iml b/.idea/AI.iml new file mode 100644 index 0000000..bf708e3 --- /dev/null +++ b/.idea/AI.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..15a15b2 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/R_User_Library.xml b/.idea/libraries/R_User_Library.xml new file mode 100644 index 0000000..71f5ff7 --- /dev/null +++ b/.idea/libraries/R_User_Library.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a2e120d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..1872027 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..208808e --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,602 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + whereDecisio + toVisit + dra + neuro + where + regals + isOccupied + print + regal + whee + returnPath + 10 + regalsik + # + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -392,16 +350,16 @@ - + - + - - - + + + @@ -438,10 +396,27 @@ + + + + file://$PROJECT_DIR$/AStar.py + 17 + + + + + + + + + + @@ -488,29 +463,15 @@ - - - - - - + + - - - - - - - - - - - - + + - + @@ -518,29 +479,33 @@ - - - - + - - + + - + - + + + + + + + + - + - - + + @@ -549,35 +514,32 @@ - - + + - - + + - + - - - - - + + - + + + + - - - - - + + @@ -588,10 +550,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + diff --git a/AStar.py b/AStar.py index d9a4cf2..169af59 100644 --- a/AStar.py +++ b/AStar.py @@ -2,7 +2,7 @@ import numpy from AStarState import AStarState class AStar: - def returnPath(self, currentNode, grid): + def returnPath(self, currentNode, grid, flaga): path = [] noRows, noColumns = numpy.shape(grid) result = [[-1 for i in range(noColumns)] for j in range(noRows)] @@ -17,7 +17,7 @@ class AStar: startValue+=1 return result ######################################################### w current jest koszt do przebycia - def search(self, start, end, grid, cost): #start to kordy wózka, end miejsce podjęcia paczki + def search(self, start, end, grid, cost, flaga): #start to kordy wózka, end miejsce podjęcia paczki noRows, noColumns = numpy.shape(grid) startNode = AStarState(None, tuple(start)) endNode = AStarState(None, tuple(end)) diff --git a/Mapa/__pycache__/generate.cpython-37.pyc b/Mapa/__pycache__/generate.cpython-37.pyc index 8b8dd789b26347da039d33faa64320d2bb7fd9db..8d190dcbc6cc0dec32a870a983b971f3f40cfbbb 100644 GIT binary patch delta 34 ncmca6eodU$iIhj;kynb!;(RfoD<%7KGPX@GbAImgp+l1Bqw>&nQ$k_gybnF?-ob_qj!)!Vvl}` z?AT~eA?Iy;3t3~wf2=5Ykz2SP(n?jo%D==-yulUa+oGT8p)R_U?c+nw&-oKw)HHjz zhfAoBKOi4Rgnkor{#02|SNuFTR4elgvbvER>gqXUYr9Gxvwgq7um3L=ma%XA^Wcks zFFKgyzo_H<2i3q+{AcyX(X(xI@273#Pm5?)Ru);d(bGg<=HZ`RGVKLr`CwDsw{OTugHJb@(U|x6zjPYe1k<>g?9VO zy$yaTv=xJS`K>6xy2w8dJv=f64I&=hV=b@460kB4b||AIT5EI~EsyD-g@i^OmIAKX z;v$0(t9o@Bs1Eg5NXSeBh(SWQ+HOKFLf5RIb6cy$`ckTYIux4id9Cz z#l`_L0<3A4=QzH+ya>t^zyiP$z>ENr+$`U|b#3i-rBdE1mAAKs{m=7ie2!dz1cT99 ztL`-(&_HLjUUfQ+U1orP4qyTRPLst21mO;?vf56dcpah~P&NyZivlczEd##_u*RRp zi|JLM5?%-Ps(>3$^5zPD4=M-R-G<{Z3qrDcXqR0AkXy(DD+nOkU8m8u)M5QAAioCi zLV0k0!M{#Cd>4*r-O|`JWXVH_Hag{6ZLi&+_ORJuu|W0RHVMgHzgX^?Fn`6n$@2Oe zPzIVGHV1(-$%b)GSih>5^aumhniRJ*lDc_B(sk-l|9MC=ywGs o1trNdZNT4^9C+F4%XSv%Z@Mje&!KN&VeY_*>NtM-zLYC}1NJgV?EnA( delta 1325 zcmZuv&2Jk;6rb5$d)JQFcAQT;X_6*soTb$C(u9Z)K`}w9NUXLlfe{oL&or^KAMWht zt1{$Z4m~=W100=-Gayw0R0+6O{R{TMxfSiD=L#`zP1R77+?I;t4zBWJxySNqf-AkzB+F>>+1} z3`HE>-rR))Bl#E82X^%PMWIW<&JMZL4KH?d>;7pJSj6Om%O9#J2bg-k4Ns6zk z$jTl4vm{n9)#DBeJbEDR;3h5!Q~7Cbu zg1neit+9vT)zZSlzVqbR6nb+9CRlj4CojZcZk>gB_S z8|dbP4YdEPje1kZ2qXEP?!TLQZ-yq0F=!fU8Z@?y6!fJba~L$at#uV%qH0?zQO$`C zrfOf69to<-x?=Kfh2N3q(cbA`Ho(of4wfhLSi#8MZKJ|}j?jR@@1Jm-7mv04WraUI zp`AGqydd@dC5DVuIgIW3B?~Y7z^hlJDzwp6ZkEI+vGsvPxfzdOKdeRZQ|$J+l%%2V zvK{WZJ~!cH?rky7%BEY?rx#A8M4>_J|fV z>f52_c)N_J#UJr+@UnPEzYrgiuKuTDU!M}+>yvkX(Tf_+iN6M_Ik4~%fKdt73@?as z>il^ql}`aI0K5)xS^~+eRjytA@Zz;l0;<@ma7~608I-0e=hNJuz!84le_Z;7wq! zN%;8gb#n=S2AM3oQhJE&iYMvY zmtaJzmd2;SD;h$w;aBSQomPX4i0E@`s>qSe*(~^S5T4yc38lG+FVRaMKtyU=5HCd(FJW<5vTLYG)0*8P3Eu3>_zXUU*Ia!I zPtI(qbYT9!nQvyArUM|Eet$jPk^kZ3AQ1%s%0kg*{KrNFAS1z&jxE5LPTkq91np#d>>h3thF8 z$Ie#IpU}jF{Tq@`gsOwu**xLFw@9I`D<#^Nf3F5L|dc;$v zV_pzl8oGzhf=(n@tydPYA0V#QW?OMQM10-qYTs#iLpb8doN$dl;^V^lM24Im3H}Jn QkcJ2PSjGO#lD@ literal 0 HcmV?d00001 diff --git a/genetyczny/__pycache__/metody.cpython-37.pyc b/genetyczny/__pycache__/metody.cpython-37.pyc deleted file mode 100644 index 2ecf1cf9ecf5470b3f637736a75d9c19f6d61039..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmYLE!AiqG5Z%e{MlI=Ic*&)B77=Z|c(4bH6qdyjx~qlkCLtTCDeXyr#y=20C09@V z1y9bThy!ot4a~eZGae2H4C8bE_4tPMo0`9fkX#|cDJH`VIOahC5RY8sx#GyV5${Y1 zBWEm)_c+N?=;Ul=-4l`d%38N1DGGrA!~_u%Ok1{#wy@)d;W|t|SSr*}pyjYo(q~n+ zQ1PKxg4&uS`t)-)IoA)t)og^|LK((=InftG#VX(~hdPJGsva zQ~GiFD(L`{Vj!T7u})Lj4erok)Z5i`awpexe$A2hL;vmvMl#*;g)hyEvzPQ)FPcEY Fe*unLOz;2z diff --git a/genetyczny/__pycache__/randomBox.cpython-37.pyc b/genetyczny/__pycache__/randomBox.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21e8d176db858771264cd88745e627b6f3f2c583 GIT binary patch literal 683 zcmYjPJ8u**5cXr&`^a5{cuBbm(H%t^3J{7=NYWrd3IaOGS~xAY=5BM|$9a9ahrCrN z`4N|r-@w11bW4@LK*e|?5M#|Z-*{%cW6z%S`!NEEfByJ1B?$d;&R+o^9fLN{0Wy?f zi3-dycAQ93P)<8erC0de@39s&H}L^7dk1Leo4%`A zBqL;)L1SioxCT8}7<#&KFbph}qO?q!bDB#izV*20f;`g8T8cM$qj?O`?tp4#qg)G>>bxqg z-{o7JTYPEp+S1R}`a4qh;M>2Sp1w#vG(t7WcD0$ybe^1vX0EF`dG$J(ic;v!WLs{M z+x}q+hxNur|2zg~G>-rf@vvJV=v^E;OJdw3cQC^bF(c{$ Date: Sun, 17 May 2020 15:23:06 +0200 Subject: [PATCH 04/11] generowanie populacji, gen jako koszt obiekt z kosztem przejazdu --- .idea/workspace.xml | 344 ++++++++++-------- AStar.py | 15 +- Mapa/__pycache__/generate.cpython-37.pyc | Bin 3030 -> 3030 bytes Mapa/generate.py | 1 + __pycache__/AStar.cpython-37.pyc | Bin 2510 -> 2637 bytes __pycache__/program.cpython-37.pyc | Bin 4496 -> 4760 bytes genetyczny/Data.py | 12 +- genetyczny/Gene.py | 8 + genetyczny/__pycache__/Data.cpython-37.pyc | Bin 402 -> 655 bytes genetyczny/__pycache__/funkcje.cpython-37.pyc | Bin 0 -> 2102 bytes .../__pycache__/randomBox.cpython-37.pyc | Bin 683 -> 0 bytes genetyczny/funkcje.py | 86 +++++ genetyczny/randomBox.py | 26 -- program.py | 26 +- 14 files changed, 340 insertions(+), 178 deletions(-) create mode 100644 genetyczny/Gene.py create mode 100644 genetyczny/__pycache__/funkcje.cpython-37.pyc delete mode 100644 genetyczny/__pycache__/randomBox.cpython-37.pyc create mode 100644 genetyczny/funkcje.py delete mode 100644 genetyczny/randomBox.py diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 6d0694e..d69a6f3 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,13 +2,12 @@ - + - - + + + + - + - - + + @@ -31,14 +33,20 @@ - - + + - - - - - + + + + + + + + + + + @@ -46,8 +54,8 @@ - - + + @@ -58,8 +66,8 @@ - - + + @@ -68,19 +76,13 @@ - + - - - - - - - - - - - + + + + + @@ -88,8 +90,17 @@ - - + + + + + + + + + + + @@ -105,7 +116,6 @@ - whereDecisio toVisit dra neuro @@ -120,15 +130,29 @@ regalsik # put - random randomB + search + sear + rando + chi + genera + return + occupied + astarstate + grid + whereDecision + genMa + random + mapfor + tmp + global @@ -143,21 +167,24 @@ - @@ -320,13 +347,16 @@ + - + + @@ -353,19 +383,19 @@ - - - + + + - - - - - - - + + + + + + + - + @@ -374,19 +404,19 @@ - - - + + + - - - - - - - + + + + + + + - + @@ -399,9 +429,9 @@ - file://$PROJECT_DIR$/AStar.py - 17 - @@ -417,6 +447,10 @@ + + + + @@ -469,33 +503,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -512,37 +519,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -550,48 +526,128 @@ - - - - + - - - - - + + - + - - - - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AStar.py b/AStar.py index 169af59..d0ecf9c 100644 --- a/AStar.py +++ b/AStar.py @@ -2,7 +2,7 @@ import numpy from AStarState import AStarState class AStar: - def returnPath(self, currentNode, grid, flaga): + def returnPath(self, currentNode, grid): path = [] noRows, noColumns = numpy.shape(grid) result = [[-1 for i in range(noColumns)] for j in range(noRows)] @@ -41,10 +41,14 @@ class AStar: if item.gmax and flaga == 0: #podprojekt genetyczne + return current.g if iterations>max: return self.returnPath(current, grid) visited.append(current) toVisit.pop(currentIndeks) + if current==endNode and flaga == 0: + return current.g if current==endNode: return self.returnPath(current, grid) #zwracanie wagi przejscia children = [] @@ -56,6 +60,11 @@ class AStar: positions[1] > (noColumns - 1) or positions[1] < 0): continue + """ podprojekt genetyczne""" + if grid[positions[0]][positions[1]] == 2 and flaga == 0: + children.append(AStarState(current, positions)) + continue + if grid[positions[0]][positions[1]]!=0: continue @@ -76,3 +85,7 @@ class AStar: continue toVisit.append(child) + + + + diff --git a/Mapa/__pycache__/generate.cpython-37.pyc b/Mapa/__pycache__/generate.cpython-37.pyc index 8d190dcbc6cc0dec32a870a983b971f3f40cfbbb..685a68a50e8f5405967b6305f191b53dff82a115 100644 GIT binary patch delta 28 icmca6eodU$iIZfE39hm`GQ)lm(=0ws0|5E{ue! zu-G4P=qca_aFq@!N-92rGUD93c8CNk&Fq|c?U|YV-ul)~9@c7+!1JoNdj6~SIhi_B z&tN>;5Mw)#vjgZ{EQy_SdM34}{ah-MJ4`d0Ngb?_v?x@>!O*q3VzmbyT2DAMo^a@m zg^nOqj+QVf2zZgTU)<@$-6ifqMAUFR*`I9(kIj=7e)*>47!RN{@CCu{G5 zvY5p(;yQ+v@K&c_ST_v8waN`^)j3QhQuoUi)+(E9B9E>&!KAIpPfkGXhi>C@v7yav zqr1Z5ip9`fF_OB&9h>2)%Fa|^W;z>`E-)5rWJ-J_{Efp?#!!AlQfDEvo(=z}^f*Rk=iTcS;C4$DvPU>hyu0hvvP#Xaxtt>_w6C%bQ`nqPD->~4Sx_TJM$5&KJe zT72>!)Aom;=MO5Qm&fDdq8EImy!aYCxYHnyB8njqwb!-_drvkgAtSEbqXu-5gsVT} C1kfV@ delta 760 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 L`ysjfr1$*)S9tZf diff --git a/genetyczny/Data.py b/genetyczny/Data.py index 9c450dc..2281ecc 100644 --- a/genetyczny/Data.py +++ b/genetyczny/Data.py @@ -4,5 +4,15 @@ class Data: def __init__(self): - self.zajeteRegaly = [] + self.zajeteRegaly = [] #krotka (x,y) + self.mapa = [] + self.unbox = [] + self.astarMap = [] + + def genMap(self, mapa): + tmpMap =[] + tmpMap = mapa.copy() + for regal in self.zajeteRegaly: + tmpMap[regal[0]][regal[1]] = 2 + return tmpMap diff --git a/genetyczny/Gene.py b/genetyczny/Gene.py new file mode 100644 index 0000000..075688e --- /dev/null +++ b/genetyczny/Gene.py @@ -0,0 +1,8 @@ + + +class Gene: + def __init__(self, poczatkowa, koncowa, name): + self.poczatkowa = poczatkowa + self.koncowa = koncowa + self.koszt = 0 + self.name = name diff --git a/genetyczny/__pycache__/Data.cpython-37.pyc b/genetyczny/__pycache__/Data.cpython-37.pyc index 571bb4142b8d570857f580e44643c15d82cf3b21..f2082c6d152947563e0d33ee03942a32a864f9b4 100644 GIT binary patch literal 655 zcmYjO!EV$r5FI;C8p^JaP!C;+6SrK7ggBuJ6}nQ@1ACxCNKwEtv02*9W>Y(>Hc@(_ z9|A}IqTk^wr~L&^%y?DQiRR5@#^aecem5TP0?Nx5cVE6UfIsweFA+LNsO~Ak324yl z7WD_uLGv@nq7vi(g`;YgDO$eD(mYo_@vVvw;th<`b9z+GqlYaJlyh z23o6_ZRo-cDr{&s8TX=GHJzn!CM?Zk>2dO;T{g(n$CefmXl{X~^$C)~>==C)UYQA& zvJu;7{o_Djo1bMdajn(TNa=T_T(0!GB7Y?1}?g#bLhmaNFrksKYY&2P;U22><{9 delta 247 zcmeBYoy5%N#LLUY00d4KcgF=VOyqM*76I~78KM|d7^0X`7*m*97^0X{n1dNKS#Gho zB$gy5GlJ9u0f=S-VrL*O1{sphP{R<DTs$?xxuE)tb>$NxI zS+cvbpBC}JuSg&H8A$w!dF82pfhW!#w`o;`S2OpHcfRhq=N{i*Uk@3czqbDT`S*aa zziIILap2rVt28>vB+uD|N1T)IHd$)&AD!d#nPZ#4n9uFU+)mWF);k|E%M?gX^l4Y?N9?pt!a-8l? z7iMi)#K&@Jkwa=(bpajYE`B}U=OJ3pQ5W$pp%CaHE6^-xJvf@3@tPe21_aFa2g3L& zE@U||eljXEL`n1+aJ2?wZ`yWrlI%H`%XTq1XVotlfK>tjflHd7IkiiC znGb6hj5+|L1Oo6RUx~)ot_{aqiQ0eWAw0kKX}0dvY{i=n=6ZEUI+z>Sxfo$?@M>;A zb5C}_Kw)86_FqSML#0P?zFf2BM$5Cn^p^2)s?#6ozl9?7O{W^o4iEEG5%e}L^&WW? zl+DSY+vbrVFrCv;n&yBqOh&4llvO!NBi|mfFkD40Sa;K=-@3Qng>;ix309|j=gZ&6 zz7^p~EcAIO!j_3nU~S(~AL75nr5SiA3FplC90P#u&ab0@#fk&qt;Va}Gp@lAf_5b= zM14R+OtEbBz}BO*jga;p_-`Uqbe(8D%hRWi%IPeRljF>Er?1@D@a%s>YUk^$EN)hmo}U4wtl7b*)1$CCRuI5lrjP>tnHt3-_pRr2O{kbQT|)B&tR*7AwJ;0<_E zi?Ofnp6s0LfH&X|1qxn~DtW|-`De8NAlHYY=`=yp)hE zC+yEF@&N{<^Yhy^5#$TtAsQDn0cC&$l%CK;wRTWxeC((YO3!O(eXH~*At^k_i-Yt}Wm9s&H}L^7dk1Leo4%`A zBqL;)L1SioxCT8}7<#&KFbph}qO?q!bDB#izV*20f;`g8T8cM$qj?O`?tp4#qg)G>>bxqg z-{o7JTYPEp+S1R}`a4qh;M>2Sp1w#vG(t7WcD0$ybe^1vX0EF`dG$J(ic;v!WLs{M z+x}q+hxNur|2zg~G>-rf@vvJV=v^E;OJdw3cQC^bF(c{$ Date: Mon, 18 May 2020 12:53:51 +0200 Subject: [PATCH 05/11] kompletny algorytm genetyczny bez rozwozenia boxow i interface --- .idea/workspace.xml | 275 ++++++++++-------- Mapa/__pycache__/generate.cpython-37.pyc | Bin 3030 -> 3030 bytes __pycache__/AStar.cpython-37.pyc | Bin 2637 -> 2637 bytes __pycache__/program.cpython-37.pyc | Bin 4760 -> 4934 bytes genetyczny/Data.py | 6 +- genetyczny/Gene.py | 10 +- genetyczny/__pycache__/Data.cpython-37.pyc | Bin 655 -> 746 bytes genetyczny/__pycache__/Gene.cpython-37.pyc | Bin 0 -> 459 bytes genetyczny/__pycache__/funkcje.cpython-37.pyc | Bin 2102 -> 4689 bytes genetyczny/funkcje.py | 171 +++++++++-- genetyczny/genetyczny.py | 1 + main.py | 2 +- program.py | 22 +- 13 files changed, 324 insertions(+), 163 deletions(-) create mode 100644 genetyczny/__pycache__/Gene.cpython-37.pyc create mode 100644 genetyczny/genetyczny.py 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 685a68a50e8f5405967b6305f191b53dff82a115..b301dedc62fc9ea72477caed18228f925a365636 100644 GIT binary patch delta 20 acmca6eodU)iIra#n=fiIra#n=fiI*uM&Z*st}{Hz?M`M_$Cu=&{+MT3sfi* z>smZ9v5zo$O8~DQ?eoM8yA#%=Ma@Wsg1NmWP?ElT=qQ1s$R#)*_(h$w^1#Z>5zW+* z$ce*9)r(v{;y2y&LoauRiC9Ec$Zf6=M&2XQpmSfo6zYTi{1!oh-HM)e{*?a;`*yM{ zZW-^!v$0^pNE;juOGbLn8B-Ri&q*rF(gVV0o$r-dy5{_+%!@tL?<}eFqZ)u5wmmHo zQk4oD7BQ(S)W{;7ZryYqsH5dyASu=KdD6cjV2Z0jhD`~qYL<>W6DmSUD6CoSOsvpF za_jw)Xp0P*#6Pw|wig2)Qf|}guq7t-5s(!6Eijq2RpgQkUNRz~7w%@K+vV-uWpu=T zU^lFnK-mMtA@oo1uDZQ8rV>Vea=J}T5lZL-t8M|+W*9%lls;0SRzGS%H{cFhC(I$H z!k>@%S%3u-Qi3w=6X<)X4LnY|!#3>hNR8CWLP_!FZWIh-Ok#>PULh6CwgEmztceOK zskZ7)g7&ai2?4zmSbc<1Mr(4Z-bG&tCtEfBrGV|T{m_j-A1MW^v~bq;Lupc#@?X)y zXqc4iW*b`GOJH`;PK`NVne`C*=SfqJJG#LC{C zq``~BMP@qR2H((nFbECN89wNQv@>NMh10%}&c}pZgAc!*{>J#CCeoNu(Dwh2@ZI6rGWH^$*L z<}0S-CMzyv3j7qFgT=UMSjMuEh^O|V8h-`-Uq?%bw`O?()iQqg+&(SvC1*m9T%5%K zPrQb2r$O9=mA?mq&~6%}swB{$&`nh#NOh`GT?m7=|KYAaNk7E=_N9$vD&;i+D}pjm zyo>^S%Lh@M01=ZmQps#otY?Yo@QWx~a=^$hoWI+v3s|Cu7V{_b*Vfl}vPpw^4Qzny zi`I5FCUY#m73MMof8{(0UAr`gFj!eVDKs2$ZWiAG2ArI{3PPpog8G4~aMVVJU|Mc> iBxuxm)Nv#97O40n3jE*4BhF-JG}Nr3j_9m)UicsCKm(ru delta 2016 zcmaJ>O>7%Q6rR~#dw*=N9VgUrQqs8jb(=P+5EU&+D}}V8K$6lXjcSR8CF7WEQpX-| zNwC)P!GarTrM+-m7jb|a^u`Sdp&q$#F&t2DmAD}FSRvlqb>jTAO*G%kyf^dhd+!^+ z-$uU~(Pv{Zjlkbr>X&;D2Y%H5r8@3$yaS`+Jc)aNlitYH)5+z>U&3bpWDP6YZ6Le9uHm*DLDdnm}rw# z#p;6_kp^XAV8tC1(}aaK1xMr(?0da4)>(_16Yk$q|CM7a z2hN>$r$YUc)dQBv&P}}MO);@aDRG3dvjSP&CfSHv4PB35fu4>7WG}eChn~$y_l=T~ zi&Tq-$*Rl6PquekYOtAwWwdITc`JV_Uof^l&xH&5;=EC6DMrOIIIP^i!gEw}Gx9C9 zC0h4O-xEIL?#P$vy8DxSRn@3YlQ0tQGx_S!A$cT;5J%j7ZV{7uLX*tF?xTO)JIYY~ zGfROCPyyA~D`G}5BQsVI7;Q*3!O~$LhYAau0=LlTC2Xu)7uKz;+td_+Hwj+d0!_>= z2AZM<4Qh3x6>L4;Yt{)f#U%I-u`rXFQjiLisr9d*a5cQv>!od&y}l-C3N^{<2ir*) zuQP#()|Nll?hXQ|z!Ur-`lL z!*l9%cgmI_H_4&AiY})0lE7`NOiK}X4e0UhK1tj=4aA^!;0F>~zG%ySoib1-xW7r@ z&f|bBb)4-nvZV;J)lH=HAI~8=#Scl~(Yg_BbOLXnWi!x;~HM~pGb%DNnqPo_OJ{<2{Hh#1Z}koiaYGLRdscwthd`wY~d+`w!TZ;m9}f z=C|&531`-i*)N5*QCVDDdr;cQGe4(2l4+z3act^GY2F9d5AIIa;`OWe5zHhA3LOUy zcarS_M>mX$0-#Xkn)03^bF^j$K+ 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 f2082c6d152947563e0d33ee03942a32a864f9b4..0fce18f854678514251cc959b88fbf99fa554595 100644 GIT binary patch delta 332 zcmeBYeZ|V_#LLUY00fH@4#oYP$lK~{1>~eN)G)+DNJcQ52~0ABNtP6lEGw8~1C#7v zagG#*U#t&M!)-49~C1PQ1mJm6+|5nOs$w?44g+RdS0Z zDYdxd7H39gaYUpVm#f!xK&27{CJ8QToFfkH*hKq88* zB)7mfvEUYKQEGZ(P7x1C0!;7%S-04LwgY7aCqHF$Pv!&3iNF=0DlK9JO0WQNF^J$` g;@}30_-QhNX(WRYrgPZj=BJeAq}qY?0ktsz0N=q%T>t<8 delta 208 zcmaFG+Rw`C#LLUY00c(*2jVg&^0unV06FOlH4O0(k`c^i0+Y-s48aVVjDDId6R)cB zXfobnDNfBvTggzwKG~AdiIoFn&g3q}Hb%C|f=m+P>_Bc2m;lM#VoOiW^Gz(^o$SEm yF2xCwW$LkvMu12T@oCO1E&G$+-L1;{G~Vg>-cyd}8+ diff --git a/genetyczny/__pycache__/Gene.cpython-37.pyc b/genetyczny/__pycache__/Gene.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e54eea976ca5d65367875b635e679cbb9af07234 GIT binary patch literal 459 zcmYjNu};G<5Vf69LPQtD20zfH5{w9;LXj$#E~rZsVTIbDDrr*URN$&i?awgq5&VW% z{(^~jE=4`--ks0y&d>ClSayr6h;8XTYfFtp0hnCX&{%`R7>e%DW{d1 y7nC1L`7+On%}ITL30}$$(Ab&-=(`R5N5uVp*xAG#F1@0r1{Ym!uDJ4DsIXrh3}y8I literal 0 HcmV?d00001 diff --git a/genetyczny/__pycache__/funkcje.cpython-37.pyc b/genetyczny/__pycache__/funkcje.cpython-37.pyc index 0efff03e537331bb4fe29114f4114f5b51c5792b..74e2f21e8df2dc147c132b4c0920990733e82bad 100644 GIT binary patch literal 4689 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 Y?_n#aNURTc;Kv#FxXm5j+y=+5i9m 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): From 9c48010c38a7bdccf69a32c1cf92a1935f09af5d Mon Sep 17 00:00:00 2001 From: tomasz Date: Mon, 18 May 2020 18:55:18 +0200 Subject: [PATCH 06/11] blad w algorytmie, nie generuje nowych obiektow tylko nadpisuje juz wygenerowane --- .idea/workspace.xml | 318 +++++++++--------- Mapa/__pycache__/generate.cpython-37.pyc | Bin 3030 -> 3084 bytes Mapa/generate.py | 4 +- __pycache__/program.cpython-37.pyc | Bin 4934 -> 4758 bytes genetyczny/Data.py | 1 + genetyczny/__pycache__/Data.cpython-37.pyc | Bin 746 -> 765 bytes genetyczny/__pycache__/eee.cpython-37.pyc | Bin 0 -> 3368 bytes genetyczny/__pycache__/funkcje.cpython-37.pyc | Bin 4689 -> 4714 bytes genetyczny/eee.py | 142 ++++++++ genetyczny/funkcje.py | 1 + genetyczny/genetyczny.py | 1 - program.py | 28 +- 12 files changed, 317 insertions(+), 178 deletions(-) create mode 100644 genetyczny/__pycache__/eee.cpython-37.pyc create mode 100644 genetyczny/eee.py delete mode 100644 genetyczny/genetyczny.py diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 6c26ce9..72c409c 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,12 +2,12 @@ - + + - - + - regals - isOccupied - print - regal - whee - returnPath 10 regalsik # @@ -154,6 +139,12 @@ cop jakLiczycKoszt jakLiczyc + eve + doW + self + moves + gen + wybierz fitness @@ -178,19 +169,20 @@ - + + + + - + - - - @@ -391,17 +383,16 @@ - - + - + - + @@ -438,10 +429,20 @@ + + file://$PROJECT_DIR$/genetyczny/eee.py + 24 + file://$PROJECT_DIR$/genetyczny/funkcje.py - 145 - + + file://$PROJECT_DIR$/genetyczny/funkcje.py + 40 + @@ -485,13 +486,6 @@ - - - - - - - @@ -500,9 +494,6 @@ - - - @@ -536,13 +527,6 @@ - - - - - - - @@ -570,20 +554,6 @@ - - - - - - - - - - - - - - @@ -591,34 +561,27 @@ - - - - - - - - - - - - - + + - - + + - + - - - - - + + + + + + + + + @@ -629,40 +592,81 @@ - + - - - - - + + - + - - + + + + + + + + + - + - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mapa/__pycache__/generate.cpython-37.pyc b/Mapa/__pycache__/generate.cpython-37.pyc index b301dedc62fc9ea72477caed18228f925a365636..5fcef5cc6e556c6fb963b3c9209013ab13b7de22 100644 GIT binary patch delta 98 zcmca6-Xp>5#LLUY00izWhvE)S3vvIOF$7ViGQ$|Lq%`RLrjEwA))47)d034|d A761SM diff --git a/Mapa/generate.py b/Mapa/generate.py index 397b7f2..46f2e55 100644 --- a/Mapa/generate.py +++ b/Mapa/generate.py @@ -173,10 +173,10 @@ class Generate: all[wysokosc-1][szerokosc-3] = 23 all[wysokosc-2][szerokosc-4] = 1 - """ Drugi wyjazd + all[wysokosc-2][2] = 2 all[wysokosc-1][2] = 23 all[wysokosc-2][3] = 1 - """ + return all diff --git a/__pycache__/program.cpython-37.pyc b/__pycache__/program.cpython-37.pyc index 48eff3bf018f014eb8e9303aeefa43343c39439a..dd8f3c39a985f5de3e9d3ed0de805aa8f7f0e5a1 100644 GIT binary patch delta 1440 zcmaJ>&uooqrJ(~^+j00xBkpZPat5bCA>fVpr-qF0WcS;q;4gtgx6&U`c9&YSP8 zUz~Wd=w42zlR#JaWm*~jh-4j!NUYg&R#JUDt2u7aG9-WEtN6s6f;-~MBw_52U( zHR9pumqg{VXiZ+fyH+o*)#bzWbLH|{eNC6k_mL^-VrpJjXf;op09|uqK|>XLq7Pq^ zcgKrv*~dH20<78;cWOcfIvGIq5Uo@w5H`MMubP&aql!B-ZK2&jY-eQREEA!zT7>$n z9w$E&qD10(%2;nAK)QQr8O&23OyG>Xpy%~z6|EIWoOP;zfiZ&K!-EAQ8_gPjjOB8g#Lv-VEuoAJVtq;zyya63m&AeZppd#@DgMKVUZ!r1Ptk*#W|JjTC`8NY3zr5)&EG5;*UFWF z)zo*DR>wG_KxSax^P9Tls7K9K@nOrasd z_4)f|iQNe@ypyI)#zy;!ea%k9(ZXDm^nS;y(F^b5c*&&(e7$+URo^`4`+oG+JB9gZ Kell;ME&d0D#7pY{ delta 1591 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 literal 0 HcmV?d00001 diff --git a/genetyczny/__pycache__/funkcje.cpython-37.pyc b/genetyczny/__pycache__/funkcje.cpython-37.pyc index 74e2f21e8df2dc147c132b4c0920990733e82bad..9e698499fc6ecd7d5cf617561f049aeeefcceb63 100644 GIT binary patch delta 492 zcmZwEOD_Xa6bJA*!#vG&S|q4fB$a5=q#7a?9#QouS_=}A5(~EF3$PS>&M8YbIluYOy?17A&b)*^LU!D?O^L?P>BHJt*?v_agYRky zB9(LP6CjGm#tjT(k9p!Bplw29+L##LnThsMiW@S)!=O^BCaK&v^fjD!!M0M8Jmnfd z^5l~0skK!1mvF2hnAZPUkUY)PH{~TMET;v(GOP)QE+WG86IEqvH@ zTRGYhdG`P{>kRtv!U{HlC7WQ%I+(y^)`>XYTi-3W^tfvg63tssFZ-ZX7W0)Sdklh8 zG%co?8D^GAG9wsr#+3xcG8UW|B=FK%g;D%+qOn?Qns`@@W=d7#pqR_<=Tq6@Bi*_> zA%RLKvOp~2vj3`w+a!9KPG*4!>%U)|;E5y#0)tA5;xo<#Iw6IHKrvkFKsT=sGyDTY WoSA3%d}5JFAv7kn4&BsSb?pcBv0&u@ delta 445 zcmYk2Jx>Bb5Qc9K?t}Z_4#cPsGzK)mNEAau0VaH?5G1q~8lzHJXw0641)2~$+G#B? zCbmlW2Ud1yi-nbimi_^q(Zo2L_sQ(LliAt*NIoa+qHP-zg|hpwv)#8}R2bpA+Jp3< zt9=42<9Xl)ayV;TxLGO_8e@vFf_FwaR-klWCU68uDyc;Bo-k;3ZMmnk)oTE$?dvJn zHxuUn{i`_x>OXl~H5lG4HG@6-w{1<7A+M17`~gXuC_0#k?CI zd!#c@CrF^uO%{kI9=TVuWpczEBhJ_)r1am;MK)@<5XvSRlnzN=gdow(7ESC2mlo&L nt%04;N$Th2GgKmS4E|BUKPc)9o=-Fx4UC4XT1+?eNnQH}xxP@7 diff --git a/genetyczny/eee.py b/genetyczny/eee.py new file mode 100644 index 0000000..481f1eb --- /dev/null +++ b/genetyczny/eee.py @@ -0,0 +1,142 @@ +from genetyczny.funkcje import * +from easygui import * +from genetyczny.Data import Data +import matplotlib.pyplot as plt +import numpy as np +import matplotlib.animation as animation + +def start(data, wheel): + + ileGeneracji = 200 + ileWPopulacji = 16 + fragment = 0.2 + mutacja = 0.05 + unbox = 3 + + + data.kordyWozka = (wheel.ns, wheel.we) + data.jakLiczycKoszt = unbox + + randomPopulation = genRandomPopulation(data, ileWPopulacji) + for i in range(ileGeneracji): + if i == 0: + best2 = dwieNajlepsze(randomPopulation, data) + else: + x = genPopulacje(best2[0], best2[1], ileWPopulacji, fragment, mutacja) + best2 = dwieNajlepsze(x, data) + data.histZmian.append(data.best[1]) + break + #rysujWykres(data, ileGeneracji, 1000, 2000) + + + +def ruszWozek(gen,data, moves, wheel): + 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 + 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): + cns = cns + 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]], unbox, mapForAStar, 1, 1) + #mapForAStar[where[0]][where[1]] = 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 + +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 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]] diff --git a/genetyczny/funkcje.py b/genetyczny/funkcje.py index bccff64..fd0d297 100644 --- a/genetyczny/funkcje.py +++ b/genetyczny/funkcje.py @@ -150,6 +150,7 @@ def dwieNajlepsze(populacja, data): data.best = (pierwsza[:],bestValue) elif(data.best[1] > bestValue): data.best = (pierwsza[:],bestValue) + data.doWykresu.append(bestValue) tmpPopulacja.pop(bestChromIndex) chromFitness.pop(bestChromIndex) diff --git a/genetyczny/genetyczny.py b/genetyczny/genetyczny.py deleted file mode 100644 index 8b13789..0000000 --- a/genetyczny/genetyczny.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/program.py b/program.py index 92c030c..12859b6 100644 --- a/program.py +++ b/program.py @@ -15,6 +15,7 @@ from neurons import Neurons from whereDecision import WhereDecision from Evencik import Evencik from genetyczny.Data import Data +from genetyczny.eee import * class MainWindow: def __init__(self, szerokosc, wysokosc, kruche, latwopalne, radioaktywne, niebezpieczne): @@ -58,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, 25) + self.map = randomBox(self.map, self.regals, 5) updateMap(self.data, self.map, self.mapForAStar, self.regals) generateGeny(self.data) @@ -81,31 +82,22 @@ class MainWindow: self.wheel.move(Evencik(pygame.K_LEFT), self.map) elif (self.moves[0]==4): self.wheel.move(Evencik(pygame.K_RIGHT), self.map) + self.moves.pop(0) def events(self): for event in pygame.event.get(): if(event.type==pygame.QUIT): sys.exit() - """ - elif(event.type == pygame.K_p): - print("eee") - """ + elif(event.type==pygame.KEYDOWN): - - 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: + 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) + elif len(self.moves)==0: self.wheel.move(event, self.map) + elif(event.type==pygame.MOUSEBUTTONDOWN): if (type(self.map[0][2]) == Floor): whatIsIt = self.neurons.whatIsIt(easygui.fileopenbox("Wybierz zdjęcie paczki", "Wybierz zdjęcie paczki", filetypes = [["*.jpg", "*.jpeg", "*.png", "Pliki graficzne"]])) From 33726c29d5ec4f155de097bc61da17acaa39ed96 Mon Sep 17 00:00:00 2001 From: tomasz Date: Tue, 19 May 2020 13:01:21 +0200 Subject: [PATCH 07/11] 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) From e184f519eb044867fcd30368319507058082649f Mon Sep 17 00:00:00 2001 From: tomasz Date: Tue, 19 May 2020 13:12:40 +0200 Subject: [PATCH 08/11] porzadki --- .idea/workspace.xml | 34 +++++++++++++++------------------- genetyczny/eee.py | 5 ----- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index f2c0a1b..5c5601f 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,11 +2,7 @@ - - - - - + - + @@ -94,11 +90,11 @@ - + - - + + @@ -178,12 +174,12 @@ - + @@ -113,8 +159,6 @@ - astarstate - grid whereDecision genMa mapfor @@ -127,7 +171,6 @@ doW self gen - data.gen data.geny crosso fitness @@ -143,13 +186,16 @@ genpo random wybierz + update + za + data.gen @@ -170,18 +216,21 @@ - @@ -202,12 +251,7 @@ - - - - - - + @@ -258,6 +184,7 @@ + @@ -419,15 +346,15 @@ - + - + - + @@ -465,9 +392,9 @@ - file://$PROJECT_DIR$/program.py - 171 - @@ -615,7 +542,7 @@ - + @@ -625,23 +552,6 @@ - - - - - - - - - - - - - - - - - @@ -662,13 +572,6 @@ - - - - - - - @@ -676,16 +579,6 @@ - - - - - - - - - - @@ -693,6 +586,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -701,33 +634,33 @@ - - - - - - - + + + + + + + - - + + - - - - - - - + + + + + + + diff --git a/LechT.md b/LechT.md index cda43c9..579b8a3 100644 --- a/LechT.md +++ b/LechT.md @@ -5,7 +5,316 @@ Celem projektu jest znalezienie najoptymalniejszej drogi między zajętymi regałami a miejscami odbioru paczki. -Projekt wykorzystuje wcześniej opracowany algorytm AStar, który jest opisany w pliku [route-planning](https://git.wmi.amu.edu.pl/s444399/AI/src/master/route-planning.md) +Projekt wykorzystuje wcześniej opracowany algorytm AStar, który jest opisany w pliku [route-planning](https://git.wmi.amu.edu.pl/s444399/AI/src/master/route-planning.md). +Moduł podprojektu uruchamia się po uruchomieniu programu oraz kliknięciu **g** na klawiaturze. Omawiany moduł genetyczny podprojektu w dalszej części raportu będzie się pojawiał w skrócie jako **mdg**. + +### Opis składowych elementów wykorzystanych w **mdg** +* Gen - jest to najmniejszy wykorzystywany obiekt, reprezentujący zajęty regał, kóry ma określony koszt do danego miejsca odbioru +* Chromosom - jest to uporządkowany zbiór Genów, który reprezentuje kolejność odbioru paczek, końcowa długość wynika z ilości paczek na magazynie. +* Populacja - jest to zbiór chromosomów. +* Funkcja fitness - funkcja obliczająca całkowity koszt chromosomu. +* Selekcja - składowa odpowiedzialna za wybór najlepszych chromosomów z pośród populacji. +* Crossover - składowa odpowiedzialna za generowanie nowej populacji uwzględniając współczynnik mutacji, wielkość dziedziczonego fragmentu oraz otrzymane podczas selekcji chromosomy. + + ### Dane wejściowe +Podane przez urzydkownika przed uruchomieniem programu: + +* ileGeneracji - wartość, która definiuje ile generacji ma się wykonać po uruchomieniu modułu **mdg**, +* ileWPopulacji - wartość, która definiuje ile chromosomów ma się znajdować w Populacji +* fragment - wartość z zakresu (0,1), która względnie do długości chromosomu określa fragment, który będzie dziedziczony, przy tworzeniu nowego chromosomu. +* mutacja - wartość z zakresu (0,1), która określa jaka część nowo tworzonego chromosomu, po dziedziczeniu, ma zostać losowo zmieniona. +* unbox - wartość określająca do jakiego miejsca odbioru ma się kierować wózek +
+0 - losowe miejsce odbioru
+1 - miejsce odbioru tylko po lewej stronie mapy
+2 - miejsce odbioru tylko po prawej stronie mapy
+3 - miejsce odbioru wybierane korzystniej na podstawie kosztu +

+Po uruchomieniu programu: + +* generowanie losowo rozmieszczonych paczek na regałach - za przycisku **r** na klawiaturze. + + +### Integracja + + + +*W pliku program.py*
+Uruchomienie **mdg**: + + if event.key == pygame.K_g: + start(self.data,self.wheel) + +Po zakończeniu algorytmu, uruchaminy modul który rozwiezie paczki do miejsca odbioru: + + for gen in self.data.best[0]: + 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) + +*W pliku genetyczne.py* + + def start(data, wheel): + + ileGeneracji = 20 + ileWPopulacji = 16 + fragment = 0.5 + mutacja = 0.05 + unbox = 3 + + data.kordyWozka = (wheel.ns, wheel.we) + data.jakLiczycKoszt = unbox + + randomPopulation = genRandomPopulation(data, ileWPopulacji) + for i in range(ileGeneracji): + if i == 0: + best2 = dwieNajlepsze(randomPopulation, data) + else: + x = genPopulacje(data,best2[0], best2[1], ileWPopulacji, fragment, mutacja) + best2 = dwieNajlepsze(x, data) + del x + + data.histZmian.append(data.best[1]) + + + rysujWykres(data, ileGeneracji, 0, 2000) + +W celu modyfikacji danych wejściowych należy zmienić wartości zmiennych, pamiętając o podanych powyrzej ograniczeniach. + +Powyżej fragment kodu reprezentujący działanie pętli, której iteracje odpowiadają tworzeniom nowych generacji. + +###Sposób działania algorytmu: + +```mermaid +graph TD +A[
Generowanie
losowego
chromosomu
] +B[
Generowanie
losowej
populacji
] + +C[
Selekcyjny
wybór najlepszych chromosomów
z pośród populacji
] +D[Generowanie nowej populacji z podanych chromosomów] +E[Ilość generacji] + + A --> B + B --> C + C --> D + D --> E + E --> C +``` +###Implementacja +#### Generowanie losowego chromosomu +*W pliku Gene.py* + +Klasa Gene: + + class Gene: + def __init__(self): + self.kordy = None + self.unbox1 = None + self.unbox2 = None + self.unboxWczesniejszegoGenu = None + self.kordyUnboxa = None + +Odpowiednio: +* kordy - krotka z koordynatami regału +* unbox1 - koszt potrzebny do przejazdu z miejsca regału do miejsca oddania paczki po lewej stronie mapy +* unbox2 - koszty potrzebny do przejazdu z miejsca regału do miejsca oddania paczki po prawej stronie mapy +* unboxWczesniejszegoGenu - wartość (0 lub 1) która definiuje z jakiego miejsca oddania paczki jechał wózek do regału reprezentowanego przez ten gen +* kordyUnboxa - koordynaty miejsca oddania paczki do którego będzie jechać wózek + +Od tego momentu miejsce oddania paczki będzie określane jako **unbox** + +*W pliku genetyczne.py* + + def generateGeny(data): + geny = [] + zajeteRegaly = data.zajeteRegaly[:] + for r in zajeteRegaly: + 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]) + geny.append(g) + return geny + + def genRandomChromosome(data): + chromosome = generateGeny(data) + random.shuffle(chromosome) + unboxLastGen = None + + for gen in chromosome: + gen.unboxWczesniejszegoGenu = unboxLastGen + krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt) + unboxLastGen = krotkaKosztJakiUnbox[1] + gen.kordyUnboxa = data.unbox[krotkaKosztJakiUnbox[1]] + return chromosome + +Odpowiednio: +* Funkcja *generateGeny* generuje oraz oblicza wartości unboxów dla danego regału oraz zwraca je jako listę genów +* Funkcja *genRandomChromosome* losowo miesza wygenerowane geny oraz dla podanej wartości **unbox** (podanej przy uruchomieniu programu) zapisuje w genach wartości odpowiadające koodrynatom unboxa oraz z jakiego unboxa wózek przyjedzie. W przypadku pierwszego genu, do którego wózek będzie jechać z określonego miejsca ta wartość pozostaje *None*. Funkcja zwraca spójny chromosom. + +#### Generowanie Losowej populacji +*W pliku genetyczne.py* + + def genRandomPopulation(data, ileWPopulacji): + populacja = [] + for i in range(ileWPopulacji): + populacja.append(genRandomChromosome(data)) + return populacja +Odpowiednio: +* Dla podanej wartości *ileWPopulacji* funkcja generuje losową populację wykorzystując metodę losowego chromosomu, wykonując tyle iteracji ile wynosi wartość. + +#### Selekcyjny wybór najlepszych chromosomów z pośród populacji na podstawie funkcji fitness +*W pliku genetyczne.py* + + 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 + +Odpowiednio: +* Zmienna *koszt* jest sumą całkowitą kosztów przejechania trasy. +* Pętla *for* iteruje się tyle razy ile jest genów w chromosomie. +* W pierwszej iteracji koszt jest liczony dla pierwszego genu w chromosomie wywołując AStar, z pozycji początkowej wózka do miejsca regału. +* Dla reszty iteracji jest sprawdzane do którego unboxa będzie jechać wózek, i taka wartość kosztu jest dodawana co całkowitej sumy oraz koszt przejechania od unboxa poprzedniego genu do regału (zmienna *unboxPoprzedniegoGenu*) + + + 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) + data.doWykresu.append(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) + +Funkcja selekcji dla której odpowiednio: +* W pierwszej pętli *for* tworzy się lista *chromFitness* przetrzymująca wartości kosztów dla danego chromosomu. Wartości w *chromFitness* odpowiadają chromosomom na tych samych indeksach w liście populacja. +* Zmienna *bestValue* reprezentuje najlepszy koszt z danej populacji +* Zmienna *pierwsza* reprezentuje chromosom o najkorzystniejszym koszcie. +* Zmienna *druga* reprezentuje chromosom o drugim co do wartości najkorzystniejszym koszcie. +* W zmiennej *best* klasy obiektu *data* zapisywana jest krotka odpowiednio (chromosom,koszt) najlepszego chromosomu. +* Funkcja zwraca krotkę z dwoma najlepszymi chromosomami w populacji. + +#### Generowanie nowej populacji - Crossover +*W pliku genetyczne.py* + + def crossover(data,pierwszy, drugi, fragmentLiczba, wspMutacji): + ileWChrom = len(pierwszy) + tmp = random.randint(0, ileWChrom-fragmentLiczba) + kordyFragment = (tmp,tmp+fragmentLiczba) + nowyChrom = [Gene() for q in range(ileWChrom)] + iterator = kordyFragment[1] + pomIterator = 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) + + for x in range(ileWChrom): + if(iterator > ileWChrom - 1): + iterator = 0 + if(pomIterator > ileWChrom - 1): + pomIterator = 0 + 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 + 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 + +Odpowiednio: +* Dane wejściowe są to: + * *pierwszy*, *drugi* - wybrane najkorzystniejsze chromosomy, z których ma powstać nowy chromosom + * *fragmentLiczba* - jest to liczba reprezentująca jaki fragment z **pierwszego** chromosomu zostanie bezpośrednio skopiowany do nowego chromosomu, ten fragment jest wybierany losowo spośród chromosomu natomiast jego długość jest określona procentowo i zależy od podanej wartości (oraz ilości genów w chromosomoie) + * *wspMutacji* - jest to liczba reprezentująca jak wiele par w chromosomie zostanie zamienionych miejscami. +* Zmienne pomocnicze: + * *iterator*, *pomIterator* - w pierwszych dwóch instrukcjach warunkowych jest pilnowane aby iterując się nie przekroczyły dopuszczalnej wartości (odpowiadają one indeksom w kolejce). *Iterato* jest indeksem w nowym, tworzonym chromosomie. *pomIterator* jest indeksem który przechodzi przez **drugi** podany chromosom. + * lista *usedKordy* - do niej są dodawane koordynaty genów, które zostały skopiowane z **pierwszego** chromosomu, aby geny o tych samych koordynatach z **drugiego** chromosomu nie zostały zapisane w nowym chromosomie. +* Następuje skopiowanie fagmentu z **pierwszego** chromosomu, w pierwszej pętli *for* wykonuje się przepisanie wartości do powstającego chromosomu. W drugiej pętli *for* następuje przepisanie pozostałych wartości z **drugiego** chromosomu do powstającego chromosomu. +* Po przepisaniu wartości według wspMutacji jest dokonywana zamiana genów w nowym chromosomie. +* Ostatnia pętla **for** łączy geny ze sobą (zapisując unbox poprzedniego genu) + +*W pliku genetyczne.py* + + 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(data,pierwszy,drugi,fragment, wspMutacji)) + + return nowaPopulacja +Odpowiednio: +* W pętli *for* tworzone są nowe chromosomy z **pierwszego** oraz **drugiego** najlepszego chromosomu z poprzedniej generacji. +* Nowe chromosomy zapisywane są do *nowaPopulacja* +* Z powstałej populacji na nowo selekcjonowane są dwa najlepsze, z których będą powstawać nowe populacje w zależności od wartości podanych generacji. + +### Dalsze działanie programu + +Po wykonaniu iteracji uruchamia się okienko pokazujące wykres najlepszych wag otrzymywanych w danej populacji. + +Po zamknięciu okienka wózek zaczyna rozwozić paczki do miejsc oddania paczki. \ No newline at end of file diff --git a/opis/README.md b/README.md similarity index 100% rename from opis/README.md rename to README.md diff --git a/__pycache__/funkcje.cpython-37.pyc b/__pycache__/funkcje.cpython-37.pyc index 81a24590810380c14b4cf83dff9063ff2157058b..c015eca069f1050bf52cf1f79e7b3b9de87bc85e 100644 GIT binary patch delta 73 zcmdn5)}q4a#LLUY00iD_N8)ZsP2`hc?3t+E!^#rOpeeEOKr+u}f4)o1jC&_53Hh@5 b0@Y~>Pc9XzVf3B+T}X{lX0n{H93u|^v&Ir+ delta 412 zcmZ8by-or_5Z<}pmE4^WFA>mSVia>Wz5tCvV+h8Cg5(lS2ut*c9JqG`i@i`lVPQk? z0kpIS2nBfGH$O3_=maC5Y9#^H>q;6l&z6mS~J5daOQa z3>i$xlV>F{{`IB+VHA*u)hwW*Fe*f>x(c~1wa7#OzM`ISz>{1);OX4KlInag3K`## z^CLMhc{^l57<)9$jH6*=6t_FQAk{n9e9%wVf}3uuDxpsi`u(6C@_pR%)gjLGVbJAc zUt@f9#fwsNm9`G0ve8GaxVuCgxtIu0u)qNgvgi_9!0T_D_Kyl*i{EU+Xd=mT7soka g)DiOL;yqX1Eg_U#3wLl!r>E3LH>pdD)WN#`2btYjWdHyG diff --git a/__pycache__/genetyczne.cpython-37.pyc b/__pycache__/genetyczne.cpython-37.pyc index 9a2015ec7cc8b5e6836b42a69c12e808056d3197..2dc837d9bdc5b4d1a43de882efbb40e6603c6ed4 100644 GIT binary patch delta 527 zcmZ9Ize^)Q6vyYy{u-0rRWJ!j6z{k~T|}`{LNF#-R1oCkK)FRlaYf?KIEg=y2?|=+ z#{CB_h2<5pwVmx%R~%e#BU~$2-g~jT8Qy2#d;6U?%=cyR?t@!#oCL$QXg+ULGi^5u zo9&UWc9^;71S6 zWi* zy5G`6)-syfH$6l}$g`}&TjqbYrLI7kITR{TRt`rhv&dApDzcNIRqUWo+L8pkQd$Vl zke?`DAUK3k!VJO_?++_b!$$<7cCZs1*0zphmP)ODd>9z@+KxOA^iZDe%KQ{*^MnCH z3Gp4HkwUyX;(`u+xXB$Gx{4()8NE5e=5W0#LLUY00b+~9**l3naC%>7%@>jk|mfyQ)FY01rsCl=A%qjjEst#SiBh- z^(XtVE@iad{E0Q2k$9D4&JW7OpP9Bz!!o7Ff2nHZ}lS8&Gwg|2d6W-On)lE&u<$=6rR~#+q<^cP7~_Hb=&-Q;xsLx5(y2V5>*wbT3R5HqAr5S%DArAY3z)* zA%wMzWF#&{vNShNYY8FL3qnP`BYNggAr6)Ri3>&j2danz?~OOHleD!o&pY3H^UZtT zd%KU*|D?@JrWq#i8~W>)Pk#Q*;k#YfMAzZ;{$U-?s(h#`Zn6`HQC^0rSVlwHoLwP|ERjq^ zd=XfTOo9~uq9BC=2S=sdGxAr|m(e)tJTtEXYDk&ue+g zjIY(I=4y--^#wA0H0b8y3QUVV z>W$$w)c`z?dubQ`y@@7iD%GGf30MZ!6oYwj&eTaAqx`BCh%;R$)sP$V&H@^>2S}2*VOSAn_7gc;TWwrM_j%`l0q0u! zs}UHC^R6K~k%Ugb`63Jpf7E8{Kg#w9+4{*on;b7UQj=htE({ITU@mne!F2qz_EJKR z#HwK^08@$`Nh#b;2^+qjmddRTqfD*CShEi06+cY*KE4F!;U&NcOS(a%hU9|GOp*nH zs{1+z(Z8oOGoKsn7nUTTAl;sEjhbKc?hD$W!rLs{voGAiHmI8qkF-JK@4lc7=sDPi zn%@V%4M^8+gU0W5M3d98CmMQQ)&|M(oHl6u&ko~W8!5s^>bV_<4#8!~9%*jigW?3iqUbf7~5S&7DPNZV*)Y9WEIGPh^3^WlitzadWW8M=Hn?XN_**prT8qpiMO}3 zTZQ#?p20v_hOF`|Zt)AwQ)o_tv9w$3g>pu1-#dr!8)yz)h9`dzfA=&lp;A&aD_p4D zSX;YWF65Z3$|q^5&YiLqkcu3pxdw+Hil2_%Sbh^}ummoXLPu9{r^;jCI1a0V!s=AN ysDGq~IHH+BSw%}JRk#9sJ|b3nr|G2lviEuf`^BSZCd41TnVwELZEBI|TlgPR3fNu% delta 1859 zcmah}O>7%Q6rR~1du^|Onh+J{pKM9436ic|WIj7uN znzX1nC4NxSPyBNP$u=ph;%$kNwZ+4oLD(ttu_JMYh^gsIFCRgsyE}28lVft5Qqqz( zipzwNw}_#Oo9c^+IMm_KEE+6{kr!X9ekmulkEz~^*U zx!)~Qq@|N$M8a1%t||hw$i5N5DQgh!1)m*d7R2ueI zL3aMYW9vW7_5j)X$swEMu{B)KqYHyz*wcGRg6a5abyM2&usXggm{RmqN?|W0l=m<# znP<9;ZfYGynKv>g@`|0Ld;=vpfOf{0#IOTM4ao(Vo+5Jui|ki5(5Y)%t!qqwWVC;= z6u}B^J#L2@?ww`+@C+HyXGBkW0d>N3=lR@EccZ=qB zN2h4$aiuv!2AAUzGAR73E@MZACAZno1(eVp9c7Qp0F)pD*kxknps-08`6f1UUNJ7daLG>i6Y~d{EqvJ{K5)j}14(ZuFVNC{A-|E}_YYE3uanQ!w4vK6tNWEo?4W zJS#qq4F@LCpBCT7lDP?-=D`#~+iNA0ZNsOEkKtP1E}3Pk{ARgQTK&+_`DO82?3L6k z#=GWeoXvo_0b}zEu@F!1nDHz09c15E?yRh?@@b55Q_A4%A{qnDAetdC1?A4_O3je@ zWkjAra}~{rb8zQ3;_pOj9&_W!RtT?bF5SL;ueMTV?hSmBec8HOE2tdvK1uT$?AsAP zom;vwhcuYImlQgV1a~iZ4jg?jHZ?FB)t=REYC(>ualyUCzO=r{C0O%uvD%ZThWM;! XF@k01I-0EbtH(%muj5gRT<_d}A3CuT diff --git a/opis/environment.md b/environment.md similarity index 100% rename from opis/environment.md rename to environment.md diff --git a/funkcje.py b/funkcje.py index acafabd..4df211d 100644 --- a/funkcje.py +++ b/funkcje.py @@ -181,17 +181,7 @@ def updateMap(data, map, mapForAstar, regals): 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 + diff --git a/genetyczne.py b/genetyczne.py index 5aeb3a3..7812d5e 100644 --- a/genetyczne.py +++ b/genetyczne.py @@ -9,7 +9,6 @@ def start(data, wheel): mutacja = 0.05 unbox = 3 - data.kordyWozka = (wheel.ns, wheel.we) data.jakLiczycKoszt = unbox @@ -148,6 +147,8 @@ def crossover(data,pierwszy, drugi, fragmentLiczba, wspMutacji): nowyChrom = mutate(wspMutacji, nowyChrom) unboxLastGen = None + + for gen in nowyChrom: gen.unboxWczesniejszegoGenu = unboxLastGen krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt) @@ -167,4 +168,16 @@ def genPopulacje(data,pierwszy, drugi, ileWPopulacji, fragmentLiczba, wspMutacji for i in range(ileWPopulacji): nowaPopulacja.append(crossover(data,pierwszy,drugi,fragment, wspMutacji)) - return nowaPopulacja \ No newline at end of file + return nowaPopulacja + +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 \ No newline at end of file diff --git a/program.py b/program.py index fa73405..c37522c 100644 --- a/program.py +++ b/program.py @@ -55,8 +55,8 @@ 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, 15) - updateMap(self.data, self.map, self.mapForAStar, self.regals) + + @@ -96,6 +96,9 @@ class MainWindow: kordStartowy = self.data.unbox[gen.unboxWczesniejszegoGenu] zbierzBox(gen,self.data, self.moves, kordStartowy) + elif(event.key== pygame.K_r): + self.map = randomBox(self.map, self.regals, 15) + updateMap(self.data, self.map, self.mapForAStar, self.regals) elif len(self.moves)==0: self.wheel.move(event, self.map) diff --git a/opis/route-planning.md b/route-planning.md similarity index 100% rename from opis/route-planning.md rename to route-planning.md From 778590e247f33ae0d11a4510157835eee45f3440 Mon Sep 17 00:00:00 2001 From: tomasz Date: Tue, 19 May 2020 19:52:09 +0200 Subject: [PATCH 11/11] dodanie raportu --- .idea/workspace.xml | 144 +++++++++++++++++++++----------------------- 1 file changed, 69 insertions(+), 75 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 3d79eda..c3df9f9 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -3,13 +3,6 @@ - - - - - - - @@ -150,10 +143,10 @@ - @@ -310,8 +303,8 @@ - + @@ -344,14 +337,15 @@ - + + - + - + @@ -514,13 +508,6 @@ - - - - - - - @@ -552,26 +539,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -602,16 +569,6 @@ - - - - - - - - - - @@ -619,13 +576,6 @@ - - - - - - - @@ -634,16 +584,6 @@ - - - - - - - - - - @@ -654,10 +594,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - +