From 8ae3247a1b24cfbdfb395898a7b435eb290cc4cb Mon Sep 17 00:00:00 2001 From: Pedro Date: Sat, 16 Sep 2023 17:53:50 -0300 Subject: [PATCH 01/19] classe map --- __pycache__/abstract_agent.cpython-311.pyc | Bin 0 -> 3849 bytes __pycache__/environment.cpython-311.pyc | Bin 0 -> 22236 bytes __pycache__/explorer.cpython-311.pyc | Bin 0 -> 3188 bytes __pycache__/map.cpython-311.pyc | Bin 0 -> 3823 bytes __pycache__/physical_agent.cpython-311.pyc | Bin 0 -> 9042 bytes __pycache__/rescuer.cpython-311.pyc | Bin 0 -> 4008 bytes datasets/data_12x12_10vic/explorer_config.txt | 2 +- explorer.py | 66 +++++++++++++-- main.py | 0 map.py | 76 ++++++++++++++++++ 10 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 __pycache__/abstract_agent.cpython-311.pyc create mode 100644 __pycache__/environment.cpython-311.pyc create mode 100644 __pycache__/explorer.cpython-311.pyc create mode 100644 __pycache__/map.cpython-311.pyc create mode 100644 __pycache__/physical_agent.cpython-311.pyc create mode 100644 __pycache__/rescuer.cpython-311.pyc mode change 100644 => 100755 main.py create mode 100644 map.py diff --git a/__pycache__/abstract_agent.cpython-311.pyc b/__pycache__/abstract_agent.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e072b81e07d71486c8f588dfeaed775591ab6cd6 GIT binary patch literal 3849 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 Z_nt=x$AO1lUpMyt%Vz%fGxKaeKLMiq@}&R( literal 0 HcmV?d00001 diff --git a/__pycache__/map.cpython-311.pyc b/__pycache__/map.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c8814d37426adbaf61d00ded3ee1d921a5c8af8 GIT binary patch literal 3823 zcma)8OKclO7@mFD-gq77;ka>{w6z-&aDk+yX~QGpA=2^?wTgl$1R-O*+r-2#W}T{y z9H~M*SSSaBA|*&USO}F??V;kt0VIwb*O8@KD^;q*h2D(9i3|Mytasu~Qq=MK-cx1T`!v(Kydb`kOi4xA>pJ3B8!XM>33EuxVdL=$d`gxrC@-R5nM2pnk- zN6_Rs68EGXD88L}J1@XsgXm;l(8#=~2{*{Rq=A%qS(9|nWl@uF$n##!17Cca7pS87 zK$>Dn7gEKv&><5=O7P$Liiy;OGD&ha8*#KI0?*k3Dfu{z+=T8OJ_M9=d^px3O7u8P zO)8TwI5*?w5!j-fc!XGs#6^m;7>Ro=U%F7BTJoyXxn`-^lu=5i(xprxZz&fGM#kkfcZ0Om`2A(4N&uf#5g`7TF)HPa|oGql6b9%mHOkSjg1)9pG(y7AaJNc5H z%`E8obS5?VVFtwK<}$fSkTp@fW+};JCZ8!KlPdwx2%QKwQ^@SHrI7Cpf?c*pDVG zh^wHs8bbHAvTze{cledjUqRh`RO6S|InjN2t72Ky#3hEL0a#DM_1M+pK3L1I0!HQ- zPa7k{Mekyk0ORezuzhP@7v^KY_&P8iwwBL@c?&QK#|WB@QCyfafa&5Gsg3D!VMYPt z@4(pm@w+g6fKl5RRg>E1QadqEs`-1rmIW~9K!O>tC7gSN*IbC3RoW(f)CU$TTt zmN*BmIe49m%T_SGsHc~bjtx^4C#l6kF}a*C(G1uvL>dy8Xb>4vu5iWj+Ad(A>Z8#p z?Lm%zL3ey(C5V=~I}QNfcoB93w%XHM?W^b&sTu6QAB=4WW3|zGaJ&&5Z;_#{XPV)m z^-u4IC$_^A_3+6?_+;gLvnRY6`g*mp3iiF(SJkUhb9B5aH+rLHZ?xGrxHqpSpAmDrOwp$rIcgPu#73g((CU8YJ_c8?AFSzV0 zgo>IpN9>%CpaU?U8P*5q!4@zQQw0g$Ed)+94tflTffCv_L61Oxr5}yKZDc19I0Xa@ zBG9|`-ezd?{jEdwz_FVAL*Uljy}r92)}yCQb?RsN7sXUxho>1DtWG@)MXG0*GSb}b zK?+yGS+KFaO0W;Un_*l^5ZhcHuv`l42xNPdBhazOXQNfAj5&v^^6@ffVDtH*C&TVu z7Rc|&Xf>YcKp1a;@H&I?o!Ag`5pbXgffV>pm?5~dqfAehjG*UPn3eeh{J zuenCdUIw;COm+O0c6ZTK&%*Pd|L`{_)=yO4Y)(yAX4l@XYU|nB)DJUe_+&kB$_$)( z*nepK8OVL_-5R(%Vh*2e^iKm=39NPBS7O^rtoBsn_zU+=*OlppGHoi;&B!oj&I9iNdGHRhUpudhAHVjM7!Gpyp8O&Uq$4gRa3ZQrnb?WAd`pQqAGB?<&G=pHj* zSGLmU6p*~8dkv%+XboTpM~~kcxc9+t^6#_erBBTCf|;l0paGBV5;Nu?K5Q@?Wd)z9 zMBv$Pt*9HOpGD|wkP<()J0ZBsI89i>IdE!-Bz(q`lyi_WP=lgfhJbFQte&T5Ko*9H z;yzs*1(Z!v~9R87~FVUs;*56P5!f$^cz+k)k56vzSd;kCd literal 0 HcmV?d00001 diff --git a/__pycache__/physical_agent.cpython-311.pyc b/__pycache__/physical_agent.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acdf4f51ea081dddde31eee6d60362e909ef9b60 GIT binary patch literal 9042 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 PX!<)={)bo8vf2GFz&EfP literal 0 HcmV?d00001 diff --git a/__pycache__/rescuer.cpython-311.pyc b/__pycache__/rescuer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e156d503ac443bf82c633384fb677236fa93a8ba GIT binary patch literal 4008 zcmcf^O>Y~=b@qegkd|nPjwLy%<5BEFrR`9+qE3s(vZNFO5+P{RpdkV*R=Xo{t^J^9 zmWm`ufDQ)A7zS#%4y;29=;So;rTr(QK)}MDf(8iSn*y~!kxTPtcDW)Y6^(W1aQDs3 zn|W{E&imw-gM$SG?H8|Q>EF*G^o^KwTP7JCR$=fI*~nI0RE>M3s=!=zRZpvGioj{E z?q#YOIo92*m#gMHT*V4f(QlBQxsU8D)t+exJ%=}L)x52Igvz;>Vme<|qQR*}9x~Gk zrc{s1CVB*d($O|+!g%6(kb zZ1p~>>b3?jW9u}#q=IOAHP=LIN)>}J*(mp0%B==vRw^fO)8Q5K!+!wyLV1cp1qMlb z2L1Ey1nu^$q)4=>Y^u*dz~@~dk%E@dCNk3bCc2xR2zYU#Y=G}-0_|qI*xo)Y9?kCJ z?)VwV@jR79fwOk=-L>AnUwY7=(22V7m=s9TZr4p_dW8C`?+}wPx`9LdT<#z8Ki+QJ&M#0MSCq#9c=E z+|2v4(Xf%I*DwU3Pgz-ybWYu+NCU~Eb3M{UdBc!jU>IDmfa}=)etNPNcyzK(Z5B+< z1Xe?QD4+b01>n(i!Ad4=JHuZ=3{fn2Ld;){Q0Y>@3 zhxr%yjXnIvU*`Ti-^MpO_(lugfW7&_KNcSp+jy*l$6DRz5RO58CN7Lmyod7uo`SjD zg+6Yln{=3(DC#lY<7Stb)8EK~u#L648!*ZUr@qalo;|ZJbR3$XPk&jWJ~LgHgK62R z<*dp}vSKG%H2<+xp0c@jVTI~GfW*fiV!Ed*^4;zDhR_fC*NtITFIPznZW-G@P z^uHBtt7o9m&OoD|fhKbXn(P^9a{nh9e1>yQ=*P}O3@>baNv24hIjcP;AJ$9=%cg5J zT)@UI2zIl-TC$&!7%w`>0Pu1wKzA&d z&BJ5>`Y3DG>kxU$iu7PE&P)6iLVc1CHio;NnxZCPAO98r_-HYSv@$ARY~w2(e5Hl2 z?Bf9ue_t6p(#E8NNeh!+4zGe8ZR7C{9&h3CUJj>YPv?8|74RYO$S@OS84VlE?+Z5~ z49Xnw7F=C_xLHOkLQS9u5%FI=sC)|4TgsLSl#-9&wJXj#(N309TiT`;riBk=qqJa3 zWV+SI_0%G&zYN;aH+5TGk$l+eebl)V0s&(4Sm@fy*c!N?ZjQl4L9T*K1CPi;RxNOj ziY1?}g^4f4DUCax@XUb8%p^#hqXH^PTj0Uev})j|CJ%g>Hm!BbrNoIVFj+c@^OAg+ zdhrJh9ty8?yt+$8-4gpIU8TZtMZuMBy&Y?xEU-pgr7;S{Sl~mM$A||xJdFSlFznz2 z-Fv3XdkFoYmq-K|JAgDTG` v2$wmpe|Exq>G3Y=UhDd``PK=EzHhDLspGiE5=g5 zlAIdlmmJ1J!*uL&HcrW^y%woZ`+@E9h8sp2r}rWaCS2$ok~6e8KNr#Nrr zrW>!w`jTA+@mUFgD2M}>O^V@QQqo$~bqxao;Rs-5AiOOvh6y*4U{EaF0|3=%_jjNU zWiB0{Q@}MnQ#n8>C=O+a*q4B7W0}`>W)2W^KLW@vl`=rVuLc~{30WoZj{f`^(pZ@Y z4^goW{}CNXX$exqs7NyxEhfB|3B^lZU!j<o8j&;PP6h5i9N7KH%- literal 0 HcmV?d00001 diff --git a/datasets/data_12x12_10vic/explorer_config.txt b/datasets/data_12x12_10vic/explorer_config.txt index 43fcf27..96051c7 100644 --- a/datasets/data_12x12_10vic/explorer_config.txt +++ b/datasets/data_12x12_10vic/explorer_config.txt @@ -1,7 +1,7 @@ NAME EXPLORER COLOR (0, 0, 255) TRACE_COLOR (153, 153, 255) -TLIM 100.0 +TLIM 10000.0 COST_LINE 1.0 COST_DIAG 1.5 COST_READ 2.0 diff --git a/explorer.py b/explorer.py index 414677c..fddfa28 100644 --- a/explorer.py +++ b/explorer.py @@ -7,6 +7,7 @@ import random from abstract_agent import AbstractAgent from physical_agent import PhysAgent +from map import Map from abc import ABC, abstractmethod @@ -22,10 +23,61 @@ def __init__(self, env, config_file, resc): # Specific initialization for the rescuer self.resc = resc # reference to the rescuer agent - self.rtime = self.TLIM # remaining time to explore + self.rtime = self.TLIM # remaining time to explore + + self.map = Map() + # def deliberate(self) -> bool: + # """ The agent chooses the next action. The simulator calls this + # method at each cycle. Must be implemented in every agent""" + + # # No more actions, time almost ended + # if self.rtime < 10.0: + # # time to wake up the rescuer + # # pass the walls and the victims (here, they're empty) + # print(f"{self.NAME} I believe I've remaining time of {self.rtime:.1f}") + # self.resc.go_save_victims([],[]) + # return False + + # dx = random.choice([-1, 0, 1]) + + # if dx == 0: + # dy = random.choice([-1, 1]) + # else: + # dy = random.choice([-1, 0, 1]) + + # # Check the neighborhood obstacles + # obstacles = self.body.check_obstacles() + + + # # Moves the body to another position + # result = self.body.walk(dx, dy) + + # # Update remaining time + # if dx != 0 and dy != 0: + # self.rtime -= self.COST_DIAG + # else: + # self.rtime -= self.COST_LINE + + # # Test the result of the walk action + # if result == PhysAgent.BUMPED: + # walls = 1 # build the map- to do + # # print(self.name() + ": wall or grid limit reached") + + # if result == PhysAgent.EXECUTED: + # # check for victim returns -1 if there is no victim or the sequential + # # the sequential number of a found victim + # seq = self.body.check_for_victim() + # if seq >= 0: + # vs = self.body.read_vital_signals(seq) + # self.rtime -= self.COST_READ + # # print("exp: read vital signals of " + str(seq)) + # # print(vs) + + # return True + def deliberate(self) -> bool: """ The agent chooses the next action. The simulator calls this method at each cycle. Must be implemented in every agent""" @@ -38,12 +90,10 @@ def deliberate(self) -> bool: self.resc.go_save_victims([],[]) return False - dx = random.choice([-1, 0, 1]) - - if dx == 0: - dy = random.choice([-1, 1]) - else: - dy = random.choice([-1, 0, 1]) + mov = self.map.get_action() + + dy = mov[0] + dx = mov[1] # Check the neighborhood obstacles obstacles = self.body.check_obstacles() @@ -61,11 +111,13 @@ def deliberate(self) -> bool: # Test the result of the walk action if result == PhysAgent.BUMPED: walls = 1 # build the map- to do + self.map.update_agent_position(0,0) # print(self.name() + ": wall or grid limit reached") if result == PhysAgent.EXECUTED: # check for victim returns -1 if there is no victim or the sequential # the sequential number of a found victim + self.map.update_agent_position(dx,dy) seq = self.body.check_for_victim() if seq >= 0: vs = self.body.read_vital_signals(seq) diff --git a/main.py b/main.py old mode 100644 new mode 100755 diff --git a/map.py b/map.py new file mode 100644 index 0000000..f5c1b7d --- /dev/null +++ b/map.py @@ -0,0 +1,76 @@ + + +class Map: + def __init__(self): + self.coord_x = 0 + self.coord_y = 0 + self.last_action = '' + self.position = Position() + self.map = {(0,0)} + self.map = {(0, 0): self.position} + + def get_action(self): + mov = [0,0] + while self.check_position(mov): + action = self.position.pop_untried() + if action == 'E': + mov = [0,1] + self.last_action = 'E' + elif action == 'NE': + mov = [-1,1] + self.last_action = 'NE' + elif action == 'N': + mov = [-1,0] + self.last_action = 'N' + elif action == 'NW': + mov = [-1,-1] + self.last_action = 'NW' + elif action == 'W': + mov = [0,-1] + self.last_action = 'W' + elif action == 'SW': + mov = [1,-1] + self.last_action = 'SW' + elif action == 'S': + mov = [1,0] + self.last_action = 'S' + elif action == 'SE': + mov = [1,1] + self.last_action = 'SE' + return mov + + def check_position(self,mov) -> bool: + if (self.coord_x+mov[1],self.coord_y+mov[0]) in self.map: + return True + else: + return False + + def update_agent_position(self, x, y): + self.coord_x = self.coord_x + x + self.coord_y = self.coord_y + y + if (self.coord_x,self.coord_y) not in self.map: + pos = Position() + self.map[(self.coord_x,self.coord_y)] = pos + else: + pos = self.map[(self.coord_x,self.coord_y)] + self.position.set_results(self.last_action,pos) + self.position = pos + + def get_map(self): + return self.map + +class Position: + def __init__(self): + self.results = {'SE': None, 'S': None, 'SW': None, 'W': None, 'NW': None, 'N': None, 'NE': None, 'E': None} + self.untried = ['SE','S','SW','W','NW','N','NE','E'] + self.backtracked = False + + def pop_untried(self): + if len(self.untried) != 0: + return self.untried.pop() + else: + return + + def set_results(self,res,pos): + self.results[(res)] = pos + \ No newline at end of file From a59503203b24fce090f68b824981a3610e5698d0 Mon Sep 17 00:00:00 2001 From: pedro Date: Sun, 17 Sep 2023 19:04:38 -0300 Subject: [PATCH 02/19] DFS online --- __pycache__/abstract_agent.cpython-311.pyc | Bin 3849 -> 3837 bytes __pycache__/environment.cpython-311.pyc | Bin 22236 -> 22224 bytes __pycache__/explorer.cpython-311.pyc | Bin 3188 -> 4206 bytes __pycache__/map.cpython-311.pyc | Bin 3823 -> 4498 bytes __pycache__/physical_agent.cpython-311.pyc | Bin 9042 -> 9030 bytes __pycache__/rescuer.cpython-311.pyc | Bin 4008 -> 3996 bytes datasets/data_12x12_10vic/explorer_config.txt | 2 +- explorer.py | 44 +++++++-- main.py | 4 +- map.py | 86 ++++++++++-------- 10 files changed, 89 insertions(+), 47 deletions(-) diff --git a/__pycache__/abstract_agent.cpython-311.pyc b/__pycache__/abstract_agent.cpython-311.pyc index e072b81e07d71486c8f588dfeaed775591ab6cd6..905a81876df573af49668eccd0434641585c3584 100644 GIT binary patch delta 60 zcmeB_`zy<}oR^o20SLCnZsc0dp=_t0k)NBYUyzzol&|lSpIn-onpcuvtRGO6pI(%h Oo0y!Kzxe@&CK~`dXcS5S delta 72 zcmew>+bPGjoR^o20SGKaHgYZJ(D%~M$j?pHFGx)(%GY3)Y diff --git a/__pycache__/environment.cpython-311.pyc b/__pycache__/environment.cpython-311.pyc index dbc9402a05e35115b95795acba992ef60362f53e..c00aa3e7c7746138f031c8d1f4ddb0125b930f50 100644 GIT binary patch delta 62 zcmcb!mhr+`My}<&yj%=Gur+og*LQAZYyFJ;+*JL7)RdxpeV6>?(%jU%lKf)*fTH~L QqQu<9pQo;yM9J~ZmNDkYD!VQzDs^`X>Mv>NwI!FQGR++ cVs2t`V!pm-UP)?BW_oH~a%SRY6`nO-0Fe6`&Hw-a diff --git a/__pycache__/explorer.cpython-311.pyc b/__pycache__/explorer.cpython-311.pyc index 7f99fcdcb867fc8f544d3423e7b406fe1656eac8..71cf5806cde9dcaae3c32f1d9594c67b34fa5951 100644 GIT binary patch delta 1730 zcmbtUO>EOh6rOQx$9786{I+4+Dr!}g7Kuz}S+@ob?^Xha#(~}2~mPK-2&d3@*=(z?{__gPeps*#zVDuDTVn_QuhDYJzRLB`6 zmhAbaJ!fD)*F6Lc&R}nP0QjHGI+QrMlQO^*=bqe5;ua+aADYif9K+(d||!I0bt7S+9w@Ps8``jUZUr9&u;{XUIf44qJdUsCl2yq zUn?%!^+j9|(CG1>d>>xm13w9dKq7OpLCKc9LNu=d;U*+mk@<0yM1xde%H2|5VUk5R zUg00Y2)^&#fZut$dQc}p*iu$4q~%QEgf?x9@@(O_hEAMTu^9cA%z2wfsy>@5*xa0)%jvd9S7&UdsOz**68M3z4gQB$g(FxKqZ2Qp z>rLrJsAn0l;*M%4c6GzE(BPBM;8JMlX=up&xf+aE2d~D=)F&g}`&Zw!zJJBL{dW&7 z#mAq<$IX4qA_(_7K9>FXg1B1Fu#JoXpoO7jU7=U=2QU}~){7M(eZzgJ-IAxkWq9kvd=-lAk%Y9aIo06m!QWHnzBT$4)Ofnk zujueCFw8n_ipnEoZ^L;TF6b1QAOl5-ff8gn9r|VdR8B)G+SKUb^W7V3f$mE1vQe3N5=cA_B&uCK*6i0o-sa&a3IPEv4~AX@K8K&QSv2mbO9# zzm!IHj&hO8o@GEDpD&XzP7l{!@R%>lqFn&s>%JJ=hwu5$?%vNp!fC&nrFYJo)ivHb GL4N?A>z;-H delta 749 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 diff --git a/__pycache__/physical_agent.cpython-311.pyc b/__pycache__/physical_agent.cpython-311.pyc index acdf4f51ea081dddde31eee6d60362e909ef9b60..05351ad9a8628f440a9969cc50844d3d91134dc5 100644 GIT binary patch delta 60 zcmccQcFc`yIWI340}yPD-N+TptZb*Bk)NBYUyzzol&|lSpIn-onpcuvtRGO6pI(%h Oo0y!KzqyC`m^=VOZ4|Kp delta 72 zcmX@+cFB!vIWI340}xnKS!QxIWI340}yPD-N>cMtZc5Ik)NBYUyzzol&|lSpIn-onpcuvtRGO6pI(%h Oo0y!Kzd4E7jRyb}gcBhE delta 72 zcmbOuze1jCIWI340}xn bool: print(f"{self.NAME} I believe I've remaining time of {self.rtime:.1f}") self.resc.go_save_victims([],[]) return False - - mov = self.map.get_action() - - dy = mov[0] - dx = mov[1] - + # Check the neighborhood obstacles obstacles = self.body.check_obstacles() - + + authorized = False + + while not authorized: + mov = self.map.get_action() + dy = mov[0] + dx = mov[1] + authorized = self.authorize(obstacles,dx,dy) # Moves the body to another position result = self.body.walk(dx, dy) @@ -126,4 +128,32 @@ def deliberate(self) -> bool: # print(vs) return True + + def authorize(self, obstacles, x, y): + if x == 0 and y == -1: + if obstacles[0] != 0: + return False + if x == 1 and y == -1: + if obstacles[1] != 0: + return False + if x == 1 and y == 0: + if obstacles[2] != 0: + return False + if x == 1 and y == 1: + if obstacles[3] != 0: + return False + if x == 0 and y == 1: + if obstacles[4] != 0: + return False + if x == -1 and y == 1: + if obstacles[5] != 0: + return False + if x == -1 and y == 0: + if obstacles[6] != 0: + return False + if x == -1 and y == -1: + if obstacles[7] != 0: + return False + return True + diff --git a/main.py b/main.py index e2fcaaa..bea16b0 100755 --- a/main.py +++ b/main.py @@ -18,7 +18,7 @@ def main(data_folder_name): # Instantiate the environment env = Env(data_folder) - # config files for the agents + # config files for the agen5ts rescuer_file = os.path.join(data_folder, "rescuer_config.txt") explorer_file = os.path.join(data_folder, "explorer_config.txt") @@ -40,6 +40,6 @@ def main(data_folder_name): if len(sys.argv) > 1: data_folder_name = sys.argv[1] else: - data_folder_name = os.path.join("datasets", "data_12x12_10vic") + data_folder_name = os.path.join("datasets", "data_20x20_42vic") main(data_folder_name) diff --git a/map.py b/map.py index f5c1b7d..03a4308 100644 --- a/map.py +++ b/map.py @@ -4,66 +4,78 @@ class Map: def __init__(self): self.coord_x = 0 self.coord_y = 0 - self.last_action = '' + self.coordinates_map = {'SE': [1,1], 'S': [1,0], 'SW': [1,-1], 'W': [0,-1], 'NW': [-1,-1], 'N': [-1,0], 'NE': [-1,1], 'E': [0,1]} self.position = Position() + self.last_position = Position() + self.last_action = '' + self.backtracking = False self.map = {(0,0)} self.map = {(0, 0): self.position} def get_action(self): - mov = [0,0] - while self.check_position(mov): + self.backtracking = False + mov = (0,0) + action = '' + while (self.coord_x+mov[1],self.coord_y+mov[0]) in self.map and action is not None: action = self.position.pop_untried() - if action == 'E': - mov = [0,1] - self.last_action = 'E' - elif action == 'NE': - mov = [-1,1] - self.last_action = 'NE' - elif action == 'N': - mov = [-1,0] - self.last_action = 'N' - elif action == 'NW': - mov = [-1,-1] - self.last_action = 'NW' - elif action == 'W': - mov = [0,-1] - self.last_action = 'W' - elif action == 'SW': - mov = [1,-1] - self.last_action = 'SW' - elif action == 'S': - mov = [1,0] - self.last_action = 'S' - elif action == 'SE': - mov = [1,1] - self.last_action = 'SE' + if action is not None: + mov = self.coordinates_map[action] + self.last_action = action + if action is None: + action = self.get_opposite_action(self.position.last_action) + mov = self.coordinates_map[action] + self.backtracking = True + self.last_action = action return mov - def check_position(self,mov) -> bool: - if (self.coord_x+mov[1],self.coord_y+mov[0]) in self.map: - return True + def get_opposite_action(self,action): + if action == 'E': + return 'W' + elif action == 'NE': + return 'SW' + elif action == 'N': + return 'S' + elif action == 'NW': + return 'SE' + elif action == 'W': + return 'E' + elif action == 'SW': + return 'NE' + elif action == 'S': + return 'N' + elif action == 'SE': + return 'NW' else: - return False - - def update_agent_position(self, x, y): - self.coord_x = self.coord_x + x - self.coord_y = self.coord_y + y + return + + def update_agent_position(self, dx, dy): + self.coord_x = self.coord_x + dx + self.coord_y = self.coord_y + dy if (self.coord_x,self.coord_y) not in self.map: pos = Position() + pos.coord_x = self.coord_x + pos.coord_y = self.coord_y self.map[(self.coord_x,self.coord_y)] = pos + pos.last_action = self.last_action else: pos = self.map[(self.coord_x,self.coord_y)] + if self.backtracking is not True: + pos.last_action = self.last_action self.position.set_results(self.last_action,pos) + pos.set_results(self.get_opposite_action(self.last_action),self.position) + self.last_position = self.position self.position = pos - + def get_map(self): return self.map class Position: def __init__(self): + self.coord_x = 0 + self.coord_y = 0 self.results = {'SE': None, 'S': None, 'SW': None, 'W': None, 'NW': None, 'N': None, 'NE': None, 'E': None} self.untried = ['SE','S','SW','W','NW','N','NE','E'] - self.backtracked = False + self.last_action = '' def pop_untried(self): if len(self.untried) != 0: From 56fc5a0dc0912e5ea1db18e65d7fef66410102a4 Mon Sep 17 00:00:00 2001 From: Francisco Date: Tue, 19 Sep 2023 20:46:42 -0300 Subject: [PATCH 03/19] Exploradores voltam para a base --- .idea/.gitignore | 3 + .idea/VictimSim.iml | 14 +++ .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/misc.xml | 4 + .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ __pycache__/abstract_agent.cpython-311.pyc | Bin 3837 -> 3818 bytes __pycache__/environment.cpython-311.pyc | Bin 22224 -> 22205 bytes __pycache__/explorer.cpython-311.pyc | Bin 4206 -> 5983 bytes __pycache__/map.cpython-311.pyc | Bin 4498 -> 4623 bytes __pycache__/physical_agent.cpython-311.pyc | Bin 9030 -> 9011 bytes __pycache__/rescuer.cpython-311.pyc | Bin 3996 -> 3977 bytes datasets/data_12x12_10vic/env_size.txt | 2 +- datasets/data_20x20_42vic/env_size.txt | 4 +- datasets/data_20x20_42vic/explorer_config.txt | 2 +- explorer.py | 97 ++++++++++++++++-- main.py | 7 +- map.py | 15 +-- 18 files changed, 148 insertions(+), 20 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/VictimSim.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/VictimSim.iml b/.idea/VictimSim.iml new file mode 100644 index 0000000..8dc886f --- /dev/null +++ b/.idea/VictimSim.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.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..3f3e15f --- /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..401c506 --- /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..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/__pycache__/abstract_agent.cpython-311.pyc b/__pycache__/abstract_agent.cpython-311.pyc index 905a81876df573af49668eccd0434641585c3584..f2165ea7572252e794b3c93f3689724219b0629b 100644 GIT binary patch delta 53 zcmew>`%0F3IWI340}$x(aBbvX#v!fkViglwoLUs)l3JWyl3x%LmYH0VnH!v$8?*U7 Hha4LKn79z8 delta 72 zcmaDQ`&X8GIWI340}yPDW!uQTj6=^(KO;XkRlguLr6^zDB|o_|H#M&$zgRz@C_lX@ aF*h+eF<(C{Gr1%)H#jp_fAbj*IW_=PP8g5? diff --git a/__pycache__/environment.cpython-311.pyc b/__pycache__/environment.cpython-311.pyc index c00aa3e7c7746138f031c8d1f4ddb0125b930f50..7e8815b26077a997a07713b494c978490a0bcd64 100644 GIT binary patch delta 55 zcmcbxmT~V|M(*Xjyj%=GASKAPk^39Bw1$gSOlWaxQH)D!adt_5K}=X?a!F=xaAt1I JW__N8UI5F?5y}7n delta 74 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 KpRcIb=JOw&X+J#x delta 1489 zcmZ`(O>Epm6rSZwL*~_VXLR z?>)c2nIA`gE_QsPsxqMTsFAYX@44GC2sMGN_lU_neSTXfQ}8Z*Yq<$)BACBJ|C&R+<+&LQD zM<4*#l5l_t=VKX7_$=@}q6jXLZv&G%V8P!OKIS(e09*8F5oA8w_8S8ES}L3bHF|AQ zKU-~I5ST)RVOd@=ZAc7Dei3uMAvA@M3pjj^0#a>2Isu#r`G7aYzC;5;fv%;0t;K-c zO+RxgfPokYn>3!Sc1+Ci7tHbgpJnFw6%b<&L>WqfXo~Z(E$R=1wyXtU3GUa9ddrf_ zaxa;X3s9j_-`{btLk9Tmf{{l)}`3$M`CGpp#$7FYPuvDpiV<=156FkR|KIr@&o1!UL#NVs(N;(4U9FS(kh zW20f|jd)CPB+Pi`a+IsiS=D*no58+Obu5fJ8Cb4ad0#i^JbU#hV=Ve}9ecCzjJg;s(>9Cb1Z0_XGkJ}Oqs}>VDUy(d7aczm-!U8qM?AK!M_dDAwvpN1Y7y!o zJL zY%7(A)MDy;W$=MAxH0o-{=PD@ql|1TBM%F`YvbffXGplNAE0*cao4wSw)r=u3y2MH zGcF*TxF$P8nyh_Ic4#!&MwtE#l!Q28G(?vXT#Dc_WY)NEQnr#mzqH_Z$U>v- zV!U@R*L@m7jl9+~e&hKB8L4|`Ox1E6T`xh@O;wn6@J!2JhCvx)LyS$z{#vC)XxLF!==8{cIol+z}(aY6zKi33QS5K<#7Q5jX*kpqVyIE@SMxv86>eoB7!d*9FR z``+)p_xbQ=#n{7WG#r5SNiuAd<$JLQNe<1<>VYQ@|G%?@J&qRc{W&+-AdP^AK5yB` z=&VLygJSw@+141t3H32AKMokDSMPsn+c~d)k;k}sp);;PV^{uzNtH1DqJ{~!hSP3YGoa%l;mlLpPBqsW?KmZmyhs+oZ#{`!5o=ei)ORDVR_bFN<2nYz&b%EsRN{Ab_7z%SpUR^}6?}9A z!Moi!zFkHrBNPzw%#nwbaB#F8@FB&5(Q9yzrRcQ`Cck#(9PY43(RnsXL{|XLeW8SwrC$fIdm$yD|Q5Rg-z44U2%KMrlz4EYo7!5GcBir zBfZ=A8ul`@@tCHWTc)jPi%48zR_s##D4Dr`qm{hiBrm|g$cLF6j#BEt`+-nD#L{Gg z{T`bn=UA^YB&2Jk;6yMoh@A_-)q)z=ons{;I7P}&D2vsW-B|u31?KD@F9c0U?l#C_Pj{;=OU~ga|QO|90M| z-~8U2{doM7vDlY}5teYRyr)}BkTPLNm5e>PE{w3tUSlCB%HvR$&rLI5b*;wRE<-2t z$y8~@v8__ms&S|Eic@Xb)|%(IrA6*6^NL-mR-Dqsdey7jOLe;h_vJD675pXJM|RWZ zt?=#ehI+%;9m(Iibo&}E~~d|N52a5FS}dY@(1VmvC?!)&z3r@O>2<+d80%g4x;MkuIVM&;TSU#?yC73AB+f_0*lIGv1~ z)~3+WeFTlj3+iU^(;|EmxrfX(qEj=XX~)PchC~qT>(n{B(!3UVz0#c66XwW?4su=E zi6?Gc*@$x!eu|zP&!UbWClEzV&~B3883L1F6ef&ZJQO(Dk@}E?vN4BMd|}LKblht9 zR=tI{>S;I;%f7QL)#T4Psu6qrX4Hs1b%9f3Io%6Bh)@XZbLs1QboqK~&Es{P ze8K6V^YSeG5KC(F812r(ud&J5oz(QUcyQ*UJHsOz>Vsf<6Zr>;{B|_|FnVO;JT~IxfwOa`&|YBt483~y3<==RQXEw%1_Ix_h;VIa zk!~hl%83JmbrHTB7@0NEzEIHkbL33J!=EP*ozBsY5*+L=iDG66UWMVo3+rZ2w@{Ed z{d?Epz)+y>NpRYBYORJf!)H(=T3w>CqcFxg+BwG39qGUE521f_(0W0Rvs_0K06!0& IP)$tr50j=Qs{jB1 diff --git a/__pycache__/physical_agent.cpython-311.pyc b/__pycache__/physical_agent.cpython-311.pyc index 05351ad9a8628f440a9969cc50844d3d91134dc5..62ff17629ad3d4d1452910bd8b64e9b5a5dcf5c0 100644 GIT binary patch delta 53 zcmX@+w%Lt)IWI340}$x(aBbucVwTo+v5E;TPA!UYNiEJU$uEcr%S$tjYZ!O{ diff --git a/__pycache__/rescuer.cpython-311.pyc b/__pycache__/rescuer.cpython-311.pyc index 18cf6352bc6d740985f641422e334a530a43cdf7..90938c8af5af86c9b19fe02df660788844047a6f 100644 GIT binary patch delta 53 zcmbOu-zm?%oR^o20SNSXxHfWYFiWerSjB`ErxwMyq!wqFw`c&lcza diff --git a/datasets/data_12x12_10vic/env_size.txt b/datasets/data_12x12_10vic/env_size.txt index e9d492a..9992dd6 100644 --- a/datasets/data_12x12_10vic/env_size.txt +++ b/datasets/data_12x12_10vic/env_size.txt @@ -3,4 +3,4 @@ GRID_WIDTH 12 GRID_HEIGHT 12 WINDOW_WIDTH 300 WINDOW_HEIGHT 300 -DELAY 0.01 \ No newline at end of file +DELAY 0.1 \ No newline at end of file diff --git a/datasets/data_20x20_42vic/env_size.txt b/datasets/data_20x20_42vic/env_size.txt index 07b33b3..17a7317 100644 --- a/datasets/data_20x20_42vic/env_size.txt +++ b/datasets/data_20x20_42vic/env_size.txt @@ -1,6 +1,6 @@ -BASE 0,0 +BASE 10,10 GRID_WIDTH 20 GRID_HEIGHT 20 WINDOW_WIDTH 400 WINDOW_HEIGHT 400 -DELAY 0.02 \ No newline at end of file +DELAY 0.1 \ No newline at end of file diff --git a/datasets/data_20x20_42vic/explorer_config.txt b/datasets/data_20x20_42vic/explorer_config.txt index db3e9c3..33250da 100644 --- a/datasets/data_20x20_42vic/explorer_config.txt +++ b/datasets/data_20x20_42vic/explorer_config.txt @@ -1,7 +1,7 @@ NAME EXPLORER COLOR (0, 0, 255) TRACE_COLOR (153, 153, 255) -TLIM 600 +TLIM 100 COST_LINE 1.0 COST_DIAG 1.5 COST_READ 2.0 diff --git a/explorer.py b/explorer.py index 896d35e..88a656f 100644 --- a/explorer.py +++ b/explorer.py @@ -12,7 +12,7 @@ class Explorer(AbstractAgent): - def __init__(self, env, config_file, resc): + def __init__(self, env, config_file, resc, path_priorities): """ Construtor do agente random on-line @param env referencia o ambiente @config_file: the absolute path to the explorer's config file @@ -24,8 +24,11 @@ def __init__(self, env, config_file, resc): # Specific initialization for the rescuer self.resc = resc # reference to the rescuer agent self.rtime = self.TLIM # remaining time to explore - - self.map = Map() + self.horizontal = 0 #Incrementa se andar para a direita e decrementa se andar para a esquerda + self.vertical = 0 # Incrementa se andar para baixo e decrementa se andar para cima + self.number_of_moves = 0 + + self.map = Map(path_priorities) @@ -83,13 +86,88 @@ def deliberate(self) -> bool: method at each cycle. Must be implemented in every agent""" # No more actions, time almost ended - if self.rtime < 10.0: + if self.rtime < 10.0: + pass # time to wake up the rescuer # pass the walls and the victims (here, they're empty) - print(f"{self.NAME} I believe I've remaining time of {self.rtime:.1f}") - self.resc.go_save_victims([],[]) - return False - + # print(f"{self.NAME} I believe I've remaining time of {self.rtime:.1f}") + # self.resc.go_save_victims([],[]) + # return False + + if abs(self.horizontal) + abs(self.vertical) + self.number_of_moves/5 >= self.rtime: + # time to wake up the rescuer + # pass the walls and the victims (here, they're empty) + print(f"{self.NAME} Tentando voltar com {self.rtime:.1f}") + dx = 0 + dy = 0 + if self.horizontal < 0: + dx = 1 + elif self.horizontal > 0: + dx = -1 + if self.vertical < 0: + dy = 1 + elif self.vertical > 0: + dy = -1 + + authorized = False + cont = 0 + movx = dx + movy = dy + while not authorized: + authorized = self.authorize(self.body.check_obstacles(), movx, movy) + if not authorized: + movy = random.choice([-1, 1, 0]) + movx = random.choice([-1, 1, 0]) + + # if not authorized and cont == 0: + # movx = dx + # movy = 0 + # cont += 1 + # elif not authorized and cont == 1: + # movx = -dx + # movy = 0 + # cont += 1 + # elif not authorized and cont == 2: + # movx = 0 + # movy = dy + # cont += 1 + # elif not authorized and cont == 3: + # movx = 0 + # movy = -dy + # cont += 1 + + self.horizontal += movx + self.vertical += movy + + # Moves the body to another position + result = self.body.walk(movx, movy) + + # Update remaining time + if movx != 0 and movy != 0: + self.rtime -= self.COST_DIAG + else: + self.rtime -= self.COST_LINE + + # Test the result of the walk action + if result == PhysAgent.BUMPED: + walls = 1 # build the map- to do + self.map.update_agent_position(0, 0) + # print(self.name() + ": wall or grid limit reached") + + if result == PhysAgent.EXECUTED: + # check for victim returns -1 if there is no victim or the sequential + # the sequential number of a found victim + self.map.update_agent_position(dx, dy) + seq = self.body.check_for_victim() + if seq >= 0: + vs = self.body.read_vital_signals(seq) + self.rtime -= self.COST_READ + # print("exp: read vital signals of " + str(seq)) + # print(vs) + + #self.resc.go_save_victims([],[]) + return True + # Check the neighborhood obstacles obstacles = self.body.check_obstacles() @@ -103,6 +181,9 @@ def deliberate(self) -> bool: # Moves the body to another position result = self.body.walk(dx, dy) + self.horizontal += dx + self.vertical += dy + self.number_of_moves += 1 # Update remaining time if dx != 0 and dy != 0: diff --git a/main.py b/main.py index bea16b0..8b34e16 100755 --- a/main.py +++ b/main.py @@ -1,3 +1,4 @@ +import random import sys import os import time @@ -27,7 +28,11 @@ def main(data_folder_name): # Explorer needs to know rescuer to send the map # that's why rescuer is instatiated before - exp = Explorer(env, explorer_file, resc) + lista = ['E', 'N', 'NW', 'SW', 'NE', 'SE', 'W', 'S'] + exp = Explorer(env, explorer_file, resc, random.sample(lista, len(lista))) + exp = Explorer(env, explorer_file, resc, random.sample(lista, len(lista))) + exp = Explorer(env, explorer_file, resc, random.sample(lista, len(lista))) + exp = Explorer(env, explorer_file, resc, random.sample(lista, len(lista))) # Run the environment simulator env.run() diff --git a/map.py b/map.py index 03a4308..3145ee2 100644 --- a/map.py +++ b/map.py @@ -1,12 +1,13 @@ class Map: - def __init__(self): + def __init__(self, path_priorities): self.coord_x = 0 self.coord_y = 0 self.coordinates_map = {'SE': [1,1], 'S': [1,0], 'SW': [1,-1], 'W': [0,-1], 'NW': [-1,-1], 'N': [-1,0], 'NE': [-1,1], 'E': [0,1]} - self.position = Position() - self.last_position = Position() + self.path_priorities = path_priorities + self.position = Position(self.path_priorities) + self.last_position = Position(self.path_priorities) self.last_action = '' self.backtracking = False self.map = {(0,0)} @@ -52,7 +53,7 @@ def update_agent_position(self, dx, dy): self.coord_x = self.coord_x + dx self.coord_y = self.coord_y + dy if (self.coord_x,self.coord_y) not in self.map: - pos = Position() + pos = Position(self.path_priorities) pos.coord_x = self.coord_x pos.coord_y = self.coord_y self.map[(self.coord_x,self.coord_y)] = pos @@ -70,16 +71,16 @@ def get_map(self): return self.map class Position: - def __init__(self): + def __init__(self, path_priorities): self.coord_x = 0 self.coord_y = 0 self.results = {'SE': None, 'S': None, 'SW': None, 'W': None, 'NW': None, 'N': None, 'NE': None, 'E': None} - self.untried = ['SE','S','SW','W','NW','N','NE','E'] + self.untried = list(path_priorities) self.last_action = '' def pop_untried(self): if len(self.untried) != 0: - return self.untried.pop() + return self.untried.pop(0) else: return From 9b142537bb48c5dbacdb580078d08563b57df7b4 Mon Sep 17 00:00:00 2001 From: Henrique Date: Wed, 20 Sep 2023 01:09:14 -0300 Subject: [PATCH 04/19] =?UTF-8?q?Encapsulando=20fun=C3=A7=C3=B5es=20de=20m?= =?UTF-8?q?ovimenta=C3=A7=C3=A3o=20do=20explorador?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/abstract_agent.cpython-38.pyc | Bin 0 -> 2126 bytes __pycache__/environment.cpython-38.pyc | Bin 0 -> 9879 bytes __pycache__/explorer.cpython-38.pyc | Bin 0 -> 3784 bytes __pycache__/map.cpython-38.pyc | Bin 0 -> 2587 bytes __pycache__/physical_agent.cpython-38.pyc | Bin 0 -> 6524 bytes __pycache__/rescuer.cpython-38.pyc | Bin 0 -> 2433 bytes datasets/data_20x20_42vic/env_size.txt | 2 +- explorer.py | 181 ++++++++++------------ 8 files changed, 82 insertions(+), 101 deletions(-) create mode 100644 __pycache__/abstract_agent.cpython-38.pyc create mode 100644 __pycache__/environment.cpython-38.pyc create mode 100644 __pycache__/explorer.cpython-38.pyc create mode 100644 __pycache__/map.cpython-38.pyc create mode 100644 __pycache__/physical_agent.cpython-38.pyc create mode 100644 __pycache__/rescuer.cpython-38.pyc diff --git a/__pycache__/abstract_agent.cpython-38.pyc b/__pycache__/abstract_agent.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17849c4d916997cad4511cc805166a2f72d34270 GIT binary patch literal 2126 zcmbtVPjeeJ6qoj&*G}T5X<-@;j4n_No!ppVI!q_VNlTd41=keDQ)ZD@axA*LaFM|0e!I5TK+tx7jd*Vj zp}*~9x%n{JhF;zQV2I%i4XS@Uz%chRFZTz29t;9(<$f0C(ICR;9%2CtPY?@_y+MuP zN2nE@f(_JddB$&l(J@UrEVZJk&bb~-*21R#^>|jc_j#dHyK=b&FxiG)ehk2o^*!(y z9{9{-{s|fcJme7ze#0ze(MfQO!DkJ8#%8U3=EfO5?34ajlqAh)SrWx3ikIN8B$R+( zu0%?xJpiEvBl)z{WXOrgCmGK{${88XU}-9gRB_EKGg~CJVOlgB&^q)E^zsjk&>YWE z0-*!M%maiY1NsgFhoQsBVT}c#jadj-*NwTyqGRtR{-t~5&;1?r692G$6wHHHE3eT} zI1gEE6CFkKh{aDm^#bPgO=NvM>w>HSvOo1|C4IHVR$k*{d{lFi)lGCRiJfF^Nm8HJ z=JC8fvL}t5t>#lWh1&Sv*6PmM6=&_1ZdPYIw$bsOX5DG-UeW|kbJb~nyrc=8X2WR? zFKKE{a}6TUy(EvGb-zQOqHjdGAH^`EZ3wl9MnQLi8VMH=L+wTsyqTlAP} zB8oAv1PC)yGAG({Nfw+u7gnh%Ag*_#W2ZzHjvj6}w7TL%PEM`mE1OsF0cEi0iV?oHsfTTSfhb3J|nZ9mvOb;Gdp@czTzVenDw7CH4md1^^-R{Fhm zXE$+56ZG%zJuvmo!$6;;e`pyNhY-MMWJB~F`t-llu4>hoidiVTvoPtn5f<9 z?>*jaHB3(*GeIT_Zo=nMvC`C@@|hheo6rXD8$A3SsSjZC&nG*# zpY-@dmO@J={LOCk8zAw zp>Mcf6E~Jd>oB|MF@7&NeD_j?+giASf*L`QnyMnT54dP{Y`ZH@HZqR#9=!p=sx|_p zEyvQa6e%Zi!4 zU*%#^7d}eBhl1ujNlYV2a>=Hd9j_+IvnkEaG_@pQGEEY76YMFMY>*)`Q!P8U99#l> z5)}g21SxGI$2jog&phm;;L?*N@Buz+GB-XQrplhPGTWTMcUQnOF6E2cw&cM1bN7uu QuMT`Cx^NW(Cs+M{0iypR6#xJL literal 0 HcmV?d00001 diff --git a/__pycache__/environment.cpython-38.pyc b/__pycache__/environment.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44f48506739003137b6f6232a853edfb50e79dcf GIT binary patch literal 9879 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 literal 0 HcmV?d00001 diff --git a/__pycache__/explorer.cpython-38.pyc b/__pycache__/explorer.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e683bda8a0f3913aa6009511bb923ce947b34ec GIT binary patch literal 3784 zcma)9UvJ#T5$7(+J05j9on$4hlQt#N{OJ|7TC_zHxIrLCQUU|E62x**91PGDcO_Bc zk>_2WY6&O6s14+;=m+S->8<(<1q#0u$U{E?kp}~P(n~);UYg%5sq3bNA-weGA`TGhcrDmSz2mI~w+5@NWFyh&% zJ81M9rtPH7f!Fs;+f7>ozwZy``g6?s+!77Zd}@iNbe`D#wqSRyo_CI2tj!)P=WlN7 zLPc?Lb5~{s23lY49qEgXeJ2|Bcxm7Kbgk?}wd6n+d%1{dh1t)pJGzgCv`Fhd|JvGN zf(icA>)X;1_FtHAg!|O#yOmb`hVVq|snu@^U(BKQL|e?GZi$XqK<$gJSVTSdwdGj- zHgsPqy^Tl1G*?o^?u-J|CM%L2`eTs7dSXr3n2q@c?R2zid+RE4^)$((AJpIKFjCPVklA6N4jmEB}EvP4$Uu}t=qTm zl&&h0fh_&KTqVbORzzv(9ZC$wXf0%;!M0Rkz7r1eL#Y*+zO)Cxi(5KcraPq#W0Z3< z$5rG4{RKK^I8+IiEfT5EfVnV?(@5(uJhQ%gcm2lwujDY-2@Id)`u^{d7>e9Y2KO(F zvNAkUEv&VGqB|f~vtu`y#~SqG$BP#LS-ChEfZb5C7^y6#vtN9)2;pW8MZXRX@B!aD zu#`Urc1|tz25Nq4-6f7aaZarhU}WE&G|=K>F8DR;#71qSb|BjX-kh<0YU{mM%RT(W ztOmqElApL^0C&GNc0RN?@Mn7d*fu@r0p6UbdUM#JUCjcb-C};fbHLR%!aix3-4+Bi zGH54W_kjPIsilfDokizZg!avGQ}6?~mar#FTJl9eioM!S-0fZGvo~;-WoeV~4L_PzUq$HH+De$V$5ky5Gqj)cfkK$CW1b0Td z2)1RA42G#3khh2+$pQ(m9aUTIRu}fpszL5KUEx-5S+!A@T|#MCFK9F+_4o{SH|9C0kd##(hTzweWDb%L@LjS$-acTD+1lpd&gNGL*>BCM6K zjfNsBWT@mIg2!aLA#JWG(_u)Mr?=Y%;r^C$8ZreU{SO+z6 zeAZ@N=lIIhyI!pLl2>`OFpBZ2E-p*36TAZOmkaOuf#4@B>(qTmy$1x7UqK4K_W`)v zaH;R8b#VEZk)IhKGf|v;5i#9?r~R>jKMEVzXS+5q>|E;G4{saKBx!mH$OAkx*ZAI~ zHGL!8!rz~RNBtWz?aBOfoMv?3GmSA`iv!p2?a9Kpf!&(MW4f5JXgmh3$W4&r1cDnjk51Wu=OwW$ zuhuXW36Pw{2K|I{^<$b65FtpapAaFCtG9`~L*!i|P?LO2}OSdVgW`D0MtO4)*NGenRVF` z2f*w$_YKTEf|=`q*I~!kreM45)GtAfA_5)RK#tB?km=bIW@`R~T{YJ(*qfGVIS06k z9^X7CoZ`i@@d(e@pPbzo>5NqdxOBER!2cVH<{;LrmY0K3Oj=!h)Shbj0Xky>xUJsC z15(u#?2YDC@XY|GdW6^E81Omc6?}Sj6#=VIv3~33=XKP$eQR^$%)WGWm+vRQ{(nc& z4G@ddEgZi!wf6rEbpK^?I=(UaG8!;Ay`4O#7l#gpJW72C#u=Y6Egk!^D!<0qKTs~r z*`2CUqx02P3^1*>5i<{F)kD%}dPqWX¨u7INwakxN(kD~x@EqA7u~5ciIQ>F%#^ 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 R^FDxGi76Ympvu|L{1@QYs*(Tz literal 0 HcmV?d00001 diff --git a/__pycache__/rescuer.cpython-38.pyc b/__pycache__/rescuer.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d439babb9d4b4f059af0a8b9685622d6f6c78ed2 GIT binary patch literal 2433 zcmZ`*O>f*b5T!&(tKHZe$Nfax0}lm)1p*%n)F=wOj#C6kj3U_tfnY$OMXp!2Br2rV z$r|fZ4CLNRFFn|&BDePM=-N~MLNDzMC9f3+m2Gl38V*PEW*+@)b#*}CdGK2x|GGuU z-?->L9xS%t&pd)b5aDDbYGx;LVC`mZP9y4|j%Hr&N4}N4EXaFNFAt;8AwLu0i{PAy zK+-of>I>&78THecN7Q)!-5+lR8KK+*qYIycS2t?BkpJN1yaCb_JpN+h_o z`_Oh_HbIaCLyO$EWa0=%xaVO+1r^>oiM%F|$d`fW{qBfR^v}Jh_m+4h3L&UL-FqTU zGLt&Fa*3W%#!TRBzJsA6Z^(tSa2D>R>ySgTAhEk3M-*lcX8$6ndPm`<qpRJN>o-JhCyBeO|OA@cfG zC%Sh4a2(rjh~szUpKtGP?mv;GGHIoBs?7fLG=T%3run{Zu-GW)I)uZ9n0{NY{*VSv z=nd)VT6^%uRp=i9hhgsE&UF|7900Czk0^rEg7PODV}@UsnbJ}-BMV_{wsKx#rYa6u zDGsgb70)sQ0EuP(Pi(m6F3VKHt5g*m)?FJrJCKRWrD5AU;esPu28#al9@7o9EWnvewXc8-&rsgrp!tKa5-K~w+ z(fb`a=*YeQk=vfS_AmO_wx@rvZC2{^q?5pE%Ar+wmdrBHHh@A_ju|iwpacp9U5Cw% z>0P4HW(0tmY0&GXdCunmCM#qjjp2HZMZnBd%`$)pI!g$^DlI;6wuF_pu#Q}fse6wD z$X~-`hby_GfB!E$t-b!HvB$|e0KJvFdUUo2FZwXo0WV9af~{I%mG1fVIcJgd{-aG}*CEPrNIL?)rWhk%2@yi*{nm6_e&|iUTeH#Y6k5r~dD6Y2mNg}f>jyr*U zg4W1*8VeNJ(%?k`fvktUaNTO*`g4_m?}L6;`SrgVu|-cKE7rpj{v%0&Oj@O-T*?m; fjYY409PotB(br@f{?L5Tk7#D^uMkrKKWpB9EaQB6 literal 0 HcmV?d00001 diff --git a/datasets/data_20x20_42vic/env_size.txt b/datasets/data_20x20_42vic/env_size.txt index 17a7317..dfc1bd3 100644 --- a/datasets/data_20x20_42vic/env_size.txt +++ b/datasets/data_20x20_42vic/env_size.txt @@ -1,4 +1,4 @@ -BASE 10,10 +BASE 16,3 GRID_WIDTH 20 GRID_HEIGHT 20 WINDOW_WIDTH 400 diff --git a/explorer.py b/explorer.py index 88a656f..15d2e29 100644 --- a/explorer.py +++ b/explorer.py @@ -85,117 +85,32 @@ def deliberate(self) -> bool: """ The agent chooses the next action. The simulator calls this method at each cycle. Must be implemented in every agent""" - # No more actions, time almost ended - if self.rtime < 10.0: - pass - # time to wake up the rescuer - # pass the walls and the victims (here, they're empty) - # print(f"{self.NAME} I believe I've remaining time of {self.rtime:.1f}") - # self.resc.go_save_victims([],[]) - # return False - - if abs(self.horizontal) + abs(self.vertical) + self.number_of_moves/5 >= self.rtime: - # time to wake up the rescuer - # pass the walls and the victims (here, they're empty) - print(f"{self.NAME} Tentando voltar com {self.rtime:.1f}") - dx = 0 - dy = 0 - if self.horizontal < 0: - dx = 1 - elif self.horizontal > 0: - dx = -1 - if self.vertical < 0: - dy = 1 - elif self.vertical > 0: - dy = -1 - - authorized = False - cont = 0 - movx = dx - movy = dy - while not authorized: - authorized = self.authorize(self.body.check_obstacles(), movx, movy) - if not authorized: - movy = random.choice([-1, 1, 0]) - movx = random.choice([-1, 1, 0]) - - # if not authorized and cont == 0: - # movx = dx - # movy = 0 - # cont += 1 - # elif not authorized and cont == 1: - # movx = -dx - # movy = 0 - # cont += 1 - # elif not authorized and cont == 2: - # movx = 0 - # movy = dy - # cont += 1 - # elif not authorized and cont == 3: - # movx = 0 - # movy = -dy - # cont += 1 - - self.horizontal += movx - self.vertical += movy - - # Moves the body to another position - result = self.body.walk(movx, movy) - - # Update remaining time - if movx != 0 and movy != 0: - self.rtime -= self.COST_DIAG - else: - self.rtime -= self.COST_LINE - - # Test the result of the walk action - if result == PhysAgent.BUMPED: - walls = 1 # build the map- to do - self.map.update_agent_position(0, 0) - # print(self.name() + ": wall or grid limit reached") - - if result == PhysAgent.EXECUTED: - # check for victim returns -1 if there is no victim or the sequential - # the sequential number of a found victim - self.map.update_agent_position(dx, dy) - seq = self.body.check_for_victim() - if seq >= 0: - vs = self.body.read_vital_signals(seq) - self.rtime -= self.COST_READ - # print("exp: read vital signals of " + str(seq)) - # print(vs) - - #self.resc.go_save_victims([],[]) - return True + if self.time_to_get_back(): + # Returns to base and notify the rescuer + # If agent is not at the base, returns True + return self.get_back_to_base() # Check the neighborhood obstacles obstacles = self.body.check_obstacles() - authorized = False - - while not authorized: + mov = self.map.get_action() + dy = mov[0] + dx = mov[1] + + while not self.authorize(obstacles,dx,dy): mov = self.map.get_action() dy = mov[0] dx = mov[1] - authorized = self.authorize(obstacles,dx,dy) - + # Moves the body to another position result = self.body.walk(dx, dy) - self.horizontal += dx - self.vertical += dy - self.number_of_moves += 1 - # Update remaining time - if dx != 0 and dy != 0: - self.rtime -= self.COST_DIAG - else: - self.rtime -= self.COST_LINE + # Updates travel information + self.update_distance_to_base() + self.update_number_of_moves() - # Test the result of the walk action - if result == PhysAgent.BUMPED: - walls = 1 # build the map- to do - self.map.update_agent_position(0,0) - # print(self.name() + ": wall or grid limit reached") + # Update remaining time + self.update_remaining_time(dx, dy) if result == PhysAgent.EXECUTED: # check for victim returns -1 if there is no victim or the sequential @@ -210,6 +125,72 @@ def deliberate(self) -> bool: return True + def get_back_to_base(self): + # Moves the agent to the base + dx = 0 + dy = 0 + if self.horizontal < 0: + dx = 1 + elif self.horizontal > 0: + dx = -1 + if self.vertical < 0: + dy = 1 + elif self.vertical > 0: + dy = -1 + + movx = dx + movy = dy + + while not self.authorize(self.body.check_obstacles(), movx, movy): + movy = random.choice([-1, 1, 0]) + movx = random.choice([-1, 1, 0]) + + self.update_distance_to_base(movx, movy) + + # Moves the body to another position + result = self.body.walk(movx, movy) + + # Update remaining time + self.update_remaining_time(dx, dy) + + if result == PhysAgent.EXECUTED: + # check for victim returns -1 if there is no victim or the sequential + # the sequential number of a found victim + self.map.update_agent_position(dx, dy) + seq = self.body.check_for_victim() + if seq >= 0: + vs = self.body.read_vital_signals(seq) + self.rtime -= self.COST_READ + # print("exp: read vital signals of " + str(seq)) + # print(vs) + + #self.resc.go_save_victims([],[]) + if not self.at_base(): + return True + else: + self.resc.go_save_victims([],[]) + return False + + def time_to_get_back(self): + return (abs(self.horizontal) + abs(self.vertical) + self.number_of_moves/5 >= self.rtime) + + def update_remaining_time(self, dx, dy): + # Update remaining time + if dx != 0 and dy != 0: + self.rtime -= self.COST_DIAG + else: + self.rtime -= self.COST_LINE + + def at_base(self): + return (self.horizontal == 0 and self.vertical == 0) + + def update_distance_to_base(self, dx, dy): + self.horizontal += dx + self.vertical += dy + + def update_number_of_moves(self): + self.number_of_moves += 1 + def authorize(self, obstacles, x, y): if x == 0 and y == -1: if obstacles[0] != 0: From db0e6f7a4af3ca0b931501375d69272df6bc27cd Mon Sep 17 00:00:00 2001 From: henriqueramalho1 Date: Wed, 20 Sep 2023 10:32:59 -0300 Subject: [PATCH 05/19] =?UTF-8?q?Arrumando=20chamada=20de=20fun=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20atualizar=20dist=C3=A2ncia=20at=C3=A9=20a=20base?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 6148 bytes __pycache__/abstract_agent.cpython-311.pyc | Bin 3818 -> 3859 bytes __pycache__/environment.cpython-311.pyc | Bin 22205 -> 22264 bytes __pycache__/explorer.cpython-311.pyc | Bin 5983 -> 7321 bytes __pycache__/map.cpython-311.pyc | Bin 4623 -> 4689 bytes __pycache__/physical_agent.cpython-311.pyc | Bin 9011 -> 9086 bytes __pycache__/rescuer.cpython-311.pyc | Bin 3977 -> 4008 bytes datasets/.DS_Store | Bin 0 -> 6148 bytes explorer.py | 2 +- 9 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 .DS_Store create mode 100644 datasets/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fc0ac630ab8aecbc393c4392e0e3cd8c479f4f0e GIT binary patch literal 6148 zcmeHK%}T>S5Z<-bBov_sg&r5Y7EFt%#Y?F51&ruHr6we3FlI}W+CwSitS{t~_&m<+ zZotwUJc-yD*nG3|v%B*__J=XXhqI{1Ser3sLqp`K)CihuU0Ws?k*hIs7PEro;XI$z z4D=UGxOSUGEP!|ZEQ@lL>uZPO*v`1!SuBp+)2`_E zPL^G<81&t)ICclirDN|O9G+c{pVOC2zG*T!@UCRnUtkw1EPqS2JkKn8Fs(3bGELPhi9#T_5ck9<4ROOKwr58KnM4cj&f?h bKpo;dgQZ3s1??&wkS+p>5c&`Uzres3GS^KY literal 0 HcmV?d00001 diff --git a/__pycache__/abstract_agent.cpython-311.pyc b/__pycache__/abstract_agent.cpython-311.pyc index f2165ea7572252e794b3c93f3689724219b0629b..0d908efe5c5eb2aedef00c9e897435bff24e3919 100644 GIT binary patch delta 257 zcmaDQJ6Vo^e83Yy*p>P%hXxFlmC{}O(X z{)u4y*_T8$KQOQZ`dY44?J}@u?t^3F& P3$&O~&~&pP_f2L1i@{nf delta 208 zcmbO%_ez#~IWI340}$x(aBbvX#v!fkViglwoLUs)l3JWyl3x%LmYH0VnH!v$8#DPa zhXrHrWEsw>QWNZND5x$-T*5KIWs2tn&l{pLGtw`Ks$LLPoqT~akNJYAHjs{(Jex~A zc0&AJpwiS8j!QBY@-N{BX_yGskbOy1^Ma`6T~)0WrW*v;SS*ZR5)YL1o9G8J4zKJ5 ZIlW7wdKX0XCQES30&UaWY{h+(82}9kOr`(; diff --git a/__pycache__/environment.cpython-311.pyc b/__pycache__/environment.cpython-311.pyc index 7e8815b26077a997a07713b494c978490a0bcd64..27eb6d49eccb89cec5e9df6bbd51e62815632a51 100644 GIT binary patch delta 317 zcmdnHmhs10M(*Xjyj%=GpthZTBlkCMBYXYO;?$yI{fyMSqRhh5)S|@P#GH(LeV6?5 zyqx^Rlw$p$)PnqC{jkjBlFZ!T%v}A=GCa%J7;kSrEX2gZ`hkI&Q+V6=>+JZnXBZTV>GJ#iVbG(iVCu7UxC8i630*rzxlReDzSwAue z3TjQRGW)9t64Sb&syV^$=La?h0g;}H8SGd16&4s?;#UEgrMG#Cxh${r1~vwU28OSE v3_ScD<()P?HZv42aZ7(>kmJd}7-x6YCVZOj^IQgNN4T#>XES}B6s4}@YGGE|Vnry41Fj-AUkokh33Xts$6w}?@tK-7SSTp&O z=|Z4doyiqu`pg%F4JWTL`wKMEaPm5HaiB7l&8N&|c_r7eF)%bReC1={;qNH#wCS;# gp?HZ~`XaaVW+vAVUdBh8!-GsfHfe937@W=w0G~=sIRF3v diff --git a/__pycache__/explorer.cpython-311.pyc b/__pycache__/explorer.cpython-311.pyc index c294809ef0ab1809cb293c1cd3943513e44ddf6e..e76d1b66b627adc2842c199e47a5217a0790590f 100644 GIT binary patch literal 7321 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 KpRcIb=JOw&X+J#x diff --git a/__pycache__/map.cpython-311.pyc b/__pycache__/map.cpython-311.pyc index cb042222574519cc2256496ee5265ca10b527e42..b5accb1360d56b98a0bae054f279f188c12d0e42 100644 GIT binary patch delta 363 zcmeBIxv0XooR^o20SJOVbERJ7-pIFt$;ezkv^ce>SU)2*uPC#yG_@!(H!&w8U*9Fa zJTE6dF{M~PD77HJSU)T?xg;|;I5Ss&^F<~HX2v&@h1hJ=KQORxYMo#MQ#V8fil{+{+YNrv4-8DaT9fnHY{Zb&e&Ax@5dsOQZQjM^&RE|MbW{Vw4Q{~+ z!Ckf=7z8l$HS!7MXPQA;`*HO|_bCFx- V3b)Jx#!K9a9~eNoRRvx#0swuQ<7f&4wQ)_<@UoN2tSY^F20q#`-Vhd>V0?pDctS~6Tu0muVettjAYO4-Y)32=1AaA diff --git a/__pycache__/physical_agent.cpython-311.pyc b/__pycache__/physical_agent.cpython-311.pyc index 62ff17629ad3d4d1452910bd8b64e9b5a5dcf5c0..ebbf736760480f840e817a8e9baca8357affec94 100644 GIT binary patch delta 466 zcmdn&_Ro!bIWI340}!ZfXWz&j#BAiGA6lGRRIHzonpc!rSejatn46fBk+1KPU!Iqf zpO{jtACy{h+))dea`G?wVBsJWtKb4khuEO>zRgy11AF!My|h4APr;qh0( zlP{zcUI{O{r%NIfSECfwu7K&2U{1vLs?j%m$q+s`i&; z?7@NuOivgdvIH|HHwcRYT>(@%d4{ku$UVGzoA(KKF)?~g_7qbBJJ5P_p4eR`#;VCa zlIltzuWH>DlD;COd4XH=0~-Sm{{)pO8drogE^%vsB*ivQkbKR=m_NBjh6vS?n-9or gVPy25Tq>sxwq0rSBDoEWi~*B_6?C8iO$r;C0Gn5k#sB~S delta 433 zcmez8w%Lt)IWI340}$x(aBbucVwTo+v5E;TPA!UYNiEJU$uEcr%SY29YgdJ52Ui?6En) zcE#HNLO|dZ>!3@9K^F{zHeY9#W0jO=1REm4z{58|u*`LcUMUIijd|7Zp{yD3_Sc3RHkTL5z@HCt#N@{WAjDH z*G!CAllRIHQphH|g^|%`@@_e8rjGi_XBE^Zo5*gQd|3Vlqu=B?3OdXe_~kdBRoKV` E0PI?w!2kdN diff --git a/__pycache__/rescuer.cpython-311.pyc b/__pycache__/rescuer.cpython-311.pyc index 90938c8af5af86c9b19fe02df660788844047a6f..3dbb39f4368fc354874e0245e79e0fc99dc2b28d 100644 GIT binary patch delta 145 zcmeB_Um?%EoR^o20SMH#vv1_qU^cSW4=qkDD%Q_P%`3_*EKMy+%uUS6$k%ttFVD-# zPfRJ+4@xb_FV+vsOfJdH4bIHf-|WY{kyC6E(2NF#4+0E40zH;9n7ZsgFfejTOcvsG vQu)BZ!m0m2NNkGcbs?QgLOK_P^sWf$bvWPP7n+dRRRL7UtG~IJSBwb&v*s-J delta 114 zcmZ1>-zm?%oR^o20SNSXxHfWYFiWerSjB`ErxwMyq!wqF5(mAPE524U=gwO^L9<`kd zXU9KefcDOX1R^Lds#XtJnvOhma5AuwVG3F)UJX% zH4ciX7!Ep7|AKm_N@ek^9mQv9cO1HFhbk|kH1GCxLYj0jYX?KNe)wL5Lf$$r~w${lZiI(6#nn_CAb;eGayt0%*)!0%AYs>K;RW8=p< zM?pW&RDO%Gvw3FujLZNtzzi%B1NMxoHx{WVu7w$327ZMBIv*q|p>MG?sE-ab^!rHT zRYDSM(_4a2TJ$ZJ25|&Mm{dfQD(n+Om~`|@8|Par4VrWidS#r)t}N^eMd;PhFLgKw z-ymCNfEoDAz>?{@bpIcJ|Nj4+#64z!8CWO=MD-{*>R?IsZk;QR?pld@jY>jsrNQ?U jZ0M^PW9cg1K-GeNNex8bVrdXPDEuR!X<)+){3!!(-K9?% literal 0 HcmV?d00001 diff --git a/explorer.py b/explorer.py index 15d2e29..94a2ef0 100644 --- a/explorer.py +++ b/explorer.py @@ -106,7 +106,7 @@ def deliberate(self) -> bool: result = self.body.walk(dx, dy) # Updates travel information - self.update_distance_to_base() + self.update_distance_to_base(dx, dy) self.update_number_of_moves() # Update remaining time From df9072fba9dc9bab8752ae2d81ede0871a9a3aaf Mon Sep 17 00:00:00 2001 From: Francisco Becheli Date: Wed, 20 Sep 2023 12:12:09 -0300 Subject: [PATCH 06/19] Map merging incomplete --- .idea/VictimSim.iml | 2 +- .idea/misc.xml | 2 +- __pycache__/abstract_agent.cpython-310.pyc | Bin 0 -> 2159 bytes __pycache__/environment.cpython-310.pyc | Bin 0 -> 9918 bytes __pycache__/explorer.cpython-310.pyc | Bin 0 -> 4300 bytes __pycache__/map.cpython-310.pyc | Bin 0 -> 2646 bytes __pycache__/physical_agent.cpython-310.pyc | Bin 0 -> 6470 bytes __pycache__/rescuer.cpython-310.pyc | Bin 0 -> 2665 bytes datasets/data_20x20_42vic/env_size.txt | 2 +- explorer.py | 17 ++++++++++++++--- main.py | 8 ++++---- rescuer.py | 13 +++++++++---- 12 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 __pycache__/abstract_agent.cpython-310.pyc create mode 100644 __pycache__/environment.cpython-310.pyc create mode 100644 __pycache__/explorer.cpython-310.pyc create mode 100644 __pycache__/map.cpython-310.pyc create mode 100644 __pycache__/physical_agent.cpython-310.pyc create mode 100644 __pycache__/rescuer.cpython-310.pyc diff --git a/.idea/VictimSim.iml b/.idea/VictimSim.iml index 8dc886f..09bfacf 100644 --- a/.idea/VictimSim.iml +++ b/.idea/VictimSim.iml @@ -4,7 +4,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index 3f3e15f..dc9ea49 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/__pycache__/abstract_agent.cpython-310.pyc b/__pycache__/abstract_agent.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5963c642c01d0a2594d96b7b7ef38fd7269ea35b GIT binary patch literal 2159 zcmbtV&ube;6rR~%TFJ8FIBrRxl%de1D#g%4p_me^%1$asoFJ?3`~NOg5nx zZv${-eD@uO`z~{s`vmnp?lX@ELx=e+c;cO4@L2($p3KFNZD2U`^ z$qVpT5K6!=mq|>hxd5R#BiW=-WWY(1jZ>Zh%NZF=VQVb%SaQWnGwUQaVLERnpds`& z^x`>2XohDfg3tkC<^aN#0bPrpMc-mzvBEr94Ve#ERkfMJf)nSPACBFbyM;de?%11o zPnVvdV}Ite$~ANx%mNl3IC2B#)oaMue{>zV8gQSfddWUrW=qfT2|lh^rhW}wFrj6Z z=a}lOG7D$bp}A#fZ8gBwSO42q)!MoQw!T%3@?IwMfd77h_bh)I_@5Sd-}0-# zKVRT0mcIi0&kKC;==wv5zlS_@;$oDC@1o+@#~35?`vm$7KfN?VYUT6G&&>P5R<3JD zzmXa_Ypr~GrWrM&iX{06v;wjjN|6y|6eV&_9w%u^M)Z&a1-c?sDVYo=ii5rmX_C@G z%GWP!ZjPy>8R7XM2yw_I&*Ov=L1;EejM!e@2&x+<`_V8-`G#>oAb~^**2$Qv5mBNf zjeKu_!tHKic3&9U(P;l%rcL*h!B|$#0f?{7*l5>+#!`ZOk@j|4cehXN&~M+nbFX{k zz14h&oI0?0YNW51dfirgJF<(~>)q+x)z$XB-ClI3v$K6R-0HM$>xN}-b-J+D>TI1Y zb+=nv%~kC}D6}^aY${C>$rS^a4XheiGjPQ~-M}RP?TInZwO@?WL}@q46^tR~W9<)9 zL6xpj#v+^1(v%P#wA#JSgY9Nbdj(I2@)aQaOLLLco{5_ z3B0fI;726igvnnw+Z%fy7hD#5LrL>^9iq@}?cVQnx8K{_;>CdyI~bX&Vjz-%Ts^eT{L;RK}{>BS?F#GHtso#p%ssF?7S zB43AXoD@kmNvRT9IKk)*g#VOj4XIS8lm2((WNk>^RiPvU8uLb)xCmUS5Xm9OkY z-rW6(tjn@AtPY>(M@O_(6H)n?^^aGv8>lj#u4( E0OdR?_5c6? literal 0 HcmV?d00001 diff --git a/__pycache__/environment.cpython-310.pyc b/__pycache__/environment.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6db2747495efe21455aac20aaba9dee3517ca70 GIT binary patch literal 9918 zcma)CNpKuTcCD@V1uFp%q^QzDiA_4Ot}4P1sfUV4J#_%4q$D0$Isu&j&4^?YYOo}PgPKjx84DV?%BWCeF zCg#L(yl2Ebq(2er%bnfFx>O;@AgSn2en%DQBtga3l+PqdCGNr$)H$hOMpTQ6ej{^E zD2A9028bw(xYLvOX`Jj37alksr_Ugv;Ku%7Pbl|<>gpPjNiSN zaTKI#gHosiQe9BJ!8IvP)0}3wKFj%BLun8dwuIk>Z-J3j^3iLyD-w2E)Mm&{d_AJ+HW(`>G0AROL3Fp)s=6jGMm~VxbJ-P%&3n?MxCJ^JZob}f*d5sL4q7hAfAz6eMEx1 zH;WaBW?kTXo>!pA`2y!loG)^|%=r@M$0+a3HIH*?oYoJec`i*rwj5@Y4+=psC+ynKV@vSN^ zdnZKs0r=xR#_y94usb7k;3C)1J|5Fe&>P2Cf2goF8GTL4i>c?-7FheHU!Z+22?YoK z*eaj2Ivu6tk4_1lnJGNKeH}?d36#6#eTGSlO;SRuY3)dp|4Q4@z)63G2c4`n;xV4^ zFo;J?ukyf;mB(7BExa45d$I&FPM&^z<-(mWU0b?$Hf60-Us$}dd}DF#ir+vrn>^idBX#-^!w)evP#g^lG^=^Cnlb_P)G@Wtf>01D{g=*F5 zI9|27aIw{`*IMo;$Rxx=*|2c+#>!Il+VaZPYwHj&1t}VKs0*k5Sd(L57^+`ARzt(J zTbq&G6C^xgN`K7P72o`^F~d9$bZcd4{hD9GM5^~|t(LpsedUF!d_ue8k5Tn5&z2kf z3D@b=92a#SUPSwZ=JUDQFOcSv!L*40k zkZv0dBGg-GPHncjHBXY(hlQ1;UskW)SiHHiemg8uVQu;5@(n7bwk35n?5`Y;Cg3`r zEh>}pB>KrSNUS{1wYurFY%7B?Ig>*s8CrJl%XuOvG_#8FBE%hbUCxBMYwv`byA9(F z&kmmLO-qw_8q(5Q8__oKhS27P*#wYYMad=OFRi6j{v~gevh>qW8RKeE%OhXJZ(P;> z_v8=b`9aMj*Az43`k;;|=~u?@q!#70-=6wma)NlK)k%%sGy07Bs_qxDFMWg@(SNeM z=($2t{sR&ZH^6}w!0r$#?r_yJ0^A6&Tt42{0uA=cJNtT|AEXWyvR{OLT-i_I4eMt= zjXOMbPm^zpw8%VEg7iU3;HIUUWIxj>p*4rrpLppY%{7LXiE=>(<7I;sY@Bi2xB0}z z5&1O*R?g3d?^~*?6#UEP4JZx}#|D)7HlY*c8`2SG4M29^>4@%q&O(iZYeGr7X3Yf7 z6Smdlp6M3}C#g39t$Z1i=Zj04$c4t`#kJ*;r6MFIZKR9OrPIilXBtZc12efSSq*Tq zFQC1WTqsVY9HR&I*TjZ+PAmTDXn%$d&hxIZr|P*dwX}SF@%CyZCqF<}`5`4gp@dXj z(hY^fxZQF*`7^2@G5F+HvV0<}9L+b7>^)&_HOlR@Aire)R``;+a|2>0(R%Xl)5VSrut^ zw5|aR6qqD1j>#8T29?;+ul|e zY9XKoxBwXfO=v@;Jndeq=5^&l-i-fNJQLv6vFje)Xts$v3yKzzZ*;|;d8Y5}Rr;MS zZP#S2ZIab+fqOx>64S-(ZZyH|C@t}gXnBNKgIT(xq^^hiJEG-mqVC&pI~`a%(VPao zr0w-&=K{?(8XF?jJQGVo6B_L$uVSeOieE7#Z3-)mtWXXO%}4|AT!M|DW_0=(QFBs^E6wL+ou&M1Lc3Y zpJ#sggp){Pws{fr;gTxyJY%GoaREKY0*otCbIN{^WgJHxt>;7lzbz=lYcNSv4dtE= zFGwBGfz}8LqCk>#rcjz1qMII}gFhG1!N0^V?B{m=1@zO9`}BS(C^e6HGtJq18u(x0 zS(KV{yc(tE@u5{H53OUVIo~`Hlu1HS+#mZ^-8qTYlLs%6uP;gfma>07MiuGoLj4n1 z5r9fQR{guj0dT+yX}e}vytT5r^!cqSy8-ePR6H!jRgnu4S#%~E)};;mh~T>wnMbKx*H+e-BU>xIz1OIlmhb--_N_L%r`%?;KfcFd^%n zRiGG~4NJ1sm1LH&X~#|SO(IQ4mYP+F-rN$Zbx9Yrm8msiE{M}PyLQzPE&B*qS?Ow( z7U*x$!Tl7;v@xxg^+|nFol|FELY+~k)k(dqo>5_feXV_eZfr(1^t}2mjIKEtYV^$D zipzuMByxsod|lT4e00$f>k*hEFr*D;nEMLXl&2i1q+l?*aEl2TT8DtNs)n+0K+u(r z0WVE}M*$hM!dN=UvRbA9imLo4Q0ETvhYHj`Pexj^fSMvqt@i}1lbth2>7Fd1eVvT9 zX4xBSj-&mdpc~X^P8>|aoP!y6Fm51IaqWI_$i9iSmf_YC=W-id>gNe%H# zRv^&be*||9x1f#>E6P#WCnve=z-01Y!b zE71Ua%l3H>+XrOFu(M9r`4FSkC*EWuxZW{?EwH z=yW}EsFLNax%V*r%`O5FF#}lQ3+8I~KCyW-8d?4!36Ha(_}2z9K*Z=6o9Im^IaySi zL9Z3FwUf}r!otE}j84NJ%fCJH=f5*xy>8dRZl_mk?eq{MsdpW>W|B3Bg{{MHu1WKg zPb#LgAW~>hkO|P+?RZvZZO{D_8CgS%1((^Yw!83Uc?)h4bw2Wk8G}>ssNtvT4IBNv zy=@@$FTPw^KZ2?9kI^rJ(fmNatOC4Za@1+}!W@khTVPAei%aqnjb*GZezpwM^QyE7 zR%&^5X?e*qR+g?WV?64Ya$B~&9hTT(1~$6A7DWP_&UOzX?erY4l8zucBYT|=A~kXg zoUL*Upj{bZD8uVyyDRM~wRAgf)$3M8_XxO#I=K8h7`UrQvZ-~LLl3f~w5W`>2{DBS@k6Q4 z5BX>Ky&TWmWWKL3-&Z|Y>CggNMXZ~biON{d>A|{+`DDeW z6G4ZE%axKM~I+6`wVd|X{Q#f2YNrkY%!B})~Nk$ZeNJBmFg<*`u}BqK`}Ga zc7WLw6}AD&2;&j9Qh|ec{dh7((fgNB?B>QHvI}%$#dju=k(ayy|B|@d;%FxVJ>Zs1 zdeux6C>~5V0tNNEh<-O%0^-m(+TZPM47%30fY5acYD;??SO#oOI^z07br5IqgrZbO6^IxMlh*QtxrkSBPZl zi>|i-tH4D%Ac#kJpXta0@W6GGY9=eur&rL9(R0CJmCrpIhs-iFLHbj_pzbrjzLx z`dvXb#?{c9M3OnvJpKHB`fAt23dbw7TFJ|c5Q?J{?7qkaDqf<5gU+csbUF@$y+yU} zAVDt<43pDiWfP4=aJRQ%A;PjLQ zoThRHw-w)Nnvx0f>eO1jB>@9Effe+(dDG`ba%RU5Oqs+7Wt=f}lQsq&~V;;2)!(KGLH^ z5}=m8XJ4X#s3-?&Gu2E3yT>BzK{?}Pn-l^5722aOpSZ~)*_k?zv@oZj&tz2oPD%RG zH+PEm9F!1Y!9O~1BtbnWqZY0WYISi;%y1;+nwSO3&H4XqehOS+JDkH&=OSE+p)NUS zWJizU-Ns&DpZf^J(L?~>R4Bq0;6)&*pKi|Mt&RrXD7Ma0)UK?;5>`guo z1hy=jYqo291f9a!+_WWq?)2Zy=ksUJo;6qb3m?BCF1)-+CpE3ZUT`xH(@3jofR zs7Xk|t6|b)a``_p7wKaaf$3fU0&hXo9Q!Ee%)M^Ubho;_mcYWf^_qlph1g5X@SM5P z^WX{ile~`j>WnZhxj)3-AdumxMyT2x;s{lDwK5g~2!%uBJ|&DC9QUBuhHO*PkATP) zik7i{edRMNC5g8+0s9_b+;E%rzp70|Ucktij_6qN61q6V%F&A`+`@qu{%F9-1dY9o z9uz^jS>hbszJO9Y)!nS{pU hN|u|Xc%FD+_F}YbpI|=}cM=JI_J}iIOE*@t-6{x|VITb=np;`_nB5y26g*rU4o+h}~ikJTNrxwM?5L zl}pNv4H*dL4B5-DuORQuAE3bA2JB(L9`*(Jx+i~y0bBPwmozOaDNqVL_ug~vpQCfn z@0`P^(Wq&7{#=_9>+fjVziBZ3m>4YKjh}*Wjk7@OWG(A3HP$;iT0Jm&X2)bCGlEjD z+$pQR8B}^!$5Q=LQ0>(^wcb=`ifIotUgnjT8m|cR*yz+bTi4pw8BWpG+AM7>Z^emp zy=1v7!UT-!yG|P+h&|` z{iW40xFO7KotwP$((IHntvY3H@#;&hQ{go}h1TMA-auRBO+Jmb##{Uf+9^K6XVKRA z9G^$qc%_+Ir-}b^HMLfs_k&0Z>6OM5qCQ!b^ol>V<6xVU0ahTdGQ3$&Yl1SP-vRyKsu%#RFsAosvt-udO z&CZ{tzAN3HEy8_Uifti9==rXVRlO~r)?G~WqHx>qI@^9A?%K(YuwnBk7+~wZo9x(0 zq?jWAyC1}Mw!o$Z7rSJ~NfCRO&m+!2NbDtDyB~3MT`!W{y%j{oYRO=#wRSx%#e=?( zspU9+=qHYonzTMOH$H#(C@smv?}@aw6G{It3KKU-t$hKehu(BJ=xqtpcwvO?xJ~B?UBRJBoIVz#24|UEKv?Bwpj@HE7G91(#8Yf2l(RZ6C-&H$T)GGa` zggvaR4=2|~)e}v%wY;4wWTm9O+t}0PD|Jq@;FF%y(5^fL6!uC=u8&&7@(DYt41uZL zD_AjeN7FTjdb4=vx&)>9eWqs5kFK8chn22z!Vs1W0LMH$vNy=92`;v`6GgFzl}m@> zc>-rl{3u*hQ)0h22wZ{}JSw0`eq8uy7J+Oxv4!jH*xrE`h(-I+AWrNpVf(#)AbJEW zZu_Av;Fky4k;=Ev=+-vc*U}cbu#-eiS0v7s>+Pkj^B!@x+*qXMR>Tj|X>Uh(drpJ^ z=;EkYlB;xTG&|Edt-1pQMPLC-zH)=T^xB}$-9$Lt$C}Vn=cpZ9x!?j4S98uJYUXpk z6g?LZ47&~~EGeELcoCG zbc0ydX|L+aZ`L=QC#%c%Wdmc`Byxo$Ww+lKA#Yo9R!uAn&@lk)REKGF{yYU7;z5w4 zMl7DC`hG00(+-L((7GBIfscRydwhv;{4)^Cw2Ycj(=BGPrd|U@``>1{4)|HD4oTA> zZk@H*47CWKAV`6tfZ#n`GiOK0K7g6Fi~gP_>s&u#A)Hu^O*zXA1xL(+ z^aiB5lG50e??I{$8NpLQQ)P>hc|y6v1VBGaN~3aD&4N!W#{o)m-l^c6#iHa=}H zj5&@?!ncW_%z+DKIWa8*?Y<}Edn9?6$ooXTPlP;L{(uPKN`64(heX;$$VcUmK+=j! zI0Y)J0$5T0lqH8623!Pnn$X zTlqam{(v|B1jN)$RzqH>v5S^?b9$3C+1&r?W)rS^*>SCs$!7Gou;Or`aNfxnbIFA% zHjz12=-8Ve2{{ToW~$YX*)`=joZZk=&)mbcw)M3$@_Xb^0|mp_Wl&yI20Ue%F)kxh zz6JT$cw-&p=D3!VvC$)~&L8R*THe86NPscq4COP`QkGDft1N+HmGWQC(=T|Zdgfkm zsqr_I_g&ea+}(0A=(!bYOCd z7kWhapudKyPyQN$Q+>?1AA>Qe$}hqD8(wA5Id<48)X07J+wEv$S#BftE6T0e2<568 zp`2dVPT87V#yq)1Wa2UjT7SnIQ&H7K)I79{({m$CW~0~4P~0jZG1G?U+R*v%GzI)N zlghQ;WCHTqe~=nvQYi7xq!JT(?lm1qeRUOtT)GOn1XW+?s4wO*LLGI%SJee{BmLw( zENPo#m!!hMkHM91()E1^{)tz4&J4TG%x}h!nj5Xi)E;Se{!pL(q0$uJW18}PUABe> z*AcW^goy=mBSW^R`hna8-_GSW(u`L2^C?|ETBb zf>Ok%S<)aQosnOik;&v;>Jd=SDj*xmiE(38V91|s_K(u;opSwfQW)xKj&sZgSd ZHS6Qd5T8&giU~f@L=|FnRgBFU{|5qk;Lrd7 literal 0 HcmV?d00001 diff --git a/__pycache__/map.cpython-310.pyc b/__pycache__/map.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a03b312231eccd993c7aab8f9178abf4aca2f00f GIT binary patch literal 2646 zcma)7OK%)S5bo}IdcA&R^E8AIK_pm1Ob{SNC_)LrMnPf~vVkDW(rDQpJL~LY=pILj zwLUrGS8%Y8zH{WpznCkh+&Lj6_`aUq?AnQd8CCVy)!j8cRbN*R=H@B_&u@QJ(t1^h z-`SadJaleC>}9Agg%(;qgY2ty_LTO}^U#ypZ;E=*#;jwHLhmNTehifg%oFQMORb)X zbx(WRN9*fAhiC&G=@@OOXLJQ^q-Wu?T6kZ#vNj!!AL1FvZHWB|O3R^0N)6XqZ9%kj z+Jlyw8lQ8TcF)bhTwwp_7^~HgKD^u?ifwP7IGDnr4q%CN2p#L_A;)KQgtFv{-PK zPQR6>HtDspVj*kg50lJv2BwpDQd`7#2Nr11FXC*B=DIDLCoj6QuG?z6S=Ap}?MJzR z>h!k?4?d4n;oG#kX-;D+N5Wi0^XEsmKi&A&rp9h;npVHPa_jc$y<5$@ckZozvhhV~ zALWB=D#3%Ov1S&qc{5MNe{u=F zU!O4-*jc1HMYTkA7OI%d23fMx&rK)QrbhF5non<~c{0dcD$}G)Vcj#YbIj`v9v5M0 zb4e@J8yu@}T{*Z%5+$5ZuKnrpd-zP~T`*ovVyn(rlYNDKKqT5*GIfEhu* zc6YAL zLp-d88zrwSIUa+aaW!6y&s1w}qz&V-hugXdu~(q}`%dM>WSGa7PV|dA^g2e5-J!hb zr(adxkzlQKccZV#o51nLZ^>D(XA{ud|@VgzG7ty%HvAUVps3s9{!C>UR zf><7IUKtlahKk%hb$4{Tz53=D$IvC5K5}<{_F1PqGl%rc1Eu95>d%Pn<)!NtUN`NV z53z!5&CD{;$vwRZ+cywPCe4GOs1Rpf>}RTSA1e<`DaCDxR{^gG7Kj^e3#JYe*!TgP zaY;wC%sVig+yPVl0OB|~FQ>jfbq*Vd{QF#dm1>2`@sQg$^f2Xh!ah>t4#cv!I`&1? e&=IDAipsdU&a2iI@r{!IpK+RHJ)BpywSNF2oeTp2 literal 0 HcmV?d00001 diff --git a/__pycache__/physical_agent.cpython-310.pyc b/__pycache__/physical_agent.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf8c6d8e290bbd460a0485209effd6c25826c1fc GIT binary patch literal 6470 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 bool: # Updates travel information self.update_distance_to_base(dx, dy) + self.update_known_map() self.update_number_of_moves() # Update remaining time @@ -120,6 +123,8 @@ def deliberate(self) -> bool: if seq >= 0: vs = self.body.read_vital_signals(seq) self.rtime -= self.COST_READ + if [self.horizontal, self.vertical] not in self.known_victims: + self.known_victims.append([self.horizontal, self.vertical, vs]) # print("exp: read vital signals of " + str(seq)) # print(vs) @@ -149,6 +154,7 @@ def get_back_to_base(self): # Moves the body to another position result = self.body.walk(movx, movy) + self.update_known_map() # Update remaining time self.update_remaining_time(dx, dy) @@ -168,7 +174,8 @@ def get_back_to_base(self): if not self.at_base(): return True else: - self.resc.go_save_victims([],[]) + for i, r in enumerate(self.resc): + self.resc[i].merge_maps([self.known_map], [self.known_victims]) return False def time_to_get_back(self): @@ -182,7 +189,7 @@ def update_remaining_time(self, dx, dy): self.rtime -= self.COST_LINE def at_base(self): - return (self.horizontal == 0 and self.vertical == 0) + return self.horizontal == 0 and self.vertical == 0 def update_distance_to_base(self, dx, dy): self.horizontal += dx @@ -190,7 +197,11 @@ def update_distance_to_base(self, dx, dy): def update_number_of_moves(self): self.number_of_moves += 1 - + + def update_known_map(self): + if [self.horizontal, self.vertical] not in self.known_map: + self.known_map.append([self.horizontal, self.vertical]) + def authorize(self, obstacles, x, y): if x == 0 and y == -1: if obstacles[0] != 0: diff --git a/main.py b/main.py index 8b34e16..6eedff1 100755 --- a/main.py +++ b/main.py @@ -29,10 +29,10 @@ def main(data_folder_name): # Explorer needs to know rescuer to send the map # that's why rescuer is instatiated before lista = ['E', 'N', 'NW', 'SW', 'NE', 'SE', 'W', 'S'] - exp = Explorer(env, explorer_file, resc, random.sample(lista, len(lista))) - exp = Explorer(env, explorer_file, resc, random.sample(lista, len(lista))) - exp = Explorer(env, explorer_file, resc, random.sample(lista, len(lista))) - exp = Explorer(env, explorer_file, resc, random.sample(lista, len(lista))) + exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) + exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) + exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) + exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) # Run the environment simulator env.run() diff --git a/rescuer.py b/rescuer.py index ce516ab..1b94079 100644 --- a/rescuer.py +++ b/rescuer.py @@ -25,17 +25,22 @@ def __init__(self, env, config_file): # Starts in IDLE state. # It changes to ACTIVE when the map arrives self.body.set_state(PhysAgent.IDLE) + self.known_map = [] + self.known_victims = [] # planning self.__planner() - def go_save_victims(self, walls, victims): + def go_save_victims(self, path, victims): """ The explorer sends the map containing the walls and victims' location. The rescuer becomes ACTIVE. From now, the deliberate method is called by the environment""" self.body.set_state(PhysAgent.ACTIVE) - - + + def merge_maps(self, path, victims): + self.known_map = [set(path + self.known_map)] + self.known_victims = [set(path + self.known_victims)] + def __planner(self): """ A private method that calculates the walk actions to rescue the victims. Further actions may be necessary and should be added in the @@ -53,7 +58,7 @@ def __planner(self): self.plan.append((-1,-1)) self.plan.append((-1,1)) self.plan.append((1,1)) - + def deliberate(self) -> bool: """ This is the choice of the next action. The simulator calls this method at each reasonning cycle if the agent is ACTIVE. From 9e125ce6f847fa2f298c1b5488c4afd564aac9b1 Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 20 Sep 2023 14:55:57 -0300 Subject: [PATCH 07/19] Fixed map merging for rescuers --- .idea/VictimSim.iml | 2 +- .idea/misc.xml | 2 +- __pycache__/abstract_agent.cpython-311.pyc | Bin 3859 -> 3818 bytes __pycache__/environment.cpython-311.pyc | Bin 22264 -> 22205 bytes __pycache__/explorer.cpython-311.pyc | Bin 7321 -> 8185 bytes __pycache__/map.cpython-311.pyc | Bin 4689 -> 4623 bytes __pycache__/physical_agent.cpython-311.pyc | Bin 9086 -> 9011 bytes __pycache__/rescuer.cpython-311.pyc | Bin 4008 -> 4592 bytes explorer.py | 2 +- rescuer.py | 8 ++++++-- 10 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.idea/VictimSim.iml b/.idea/VictimSim.iml index 09bfacf..8e5446a 100644 --- a/.idea/VictimSim.iml +++ b/.idea/VictimSim.iml @@ -4,7 +4,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index dc9ea49..3f3e15f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/__pycache__/abstract_agent.cpython-311.pyc b/__pycache__/abstract_agent.cpython-311.pyc index 0d908efe5c5eb2aedef00c9e897435bff24e3919..f2165ea7572252e794b3c93f3689724219b0629b 100644 GIT binary patch delta 208 zcmbO%_ez#~IWI340}$x(aBbvX#v!fkViglwoLUs)l3JWyl3x%LmYH0VnH!v$8#DPa zhXrHrWEsw>QWNZND5x$-T*5KIWs2tn&l{pLGtw`Ks$LLPoqT~akNJYAHjs{(Jex~A zc0&AJpwiS8j!QBY@-N{BX_yGskbOy1^Ma`6T~)0WrW*v;SS*ZR5)YL1o9G8J4zKJ5 ZIlW7wdKX0XCQES30&UaWY{h+(82}9kOr`(; delta 257 zcmaDQJ6Vo^e83Yy*p>P%hXxFlmC{}O(X z{)u4y*_T8$KQOQZ`dY44?J}@u?t^3F& P3$&O~&~&pP_f2L1i@{nf diff --git a/__pycache__/environment.cpython-311.pyc b/__pycache__/environment.cpython-311.pyc index 27eb6d49eccb89cec5e9df6bbd51e62815632a51..7e8815b26077a997a07713b494c978490a0bcd64 100644 GIT binary patch delta 240 zcmeydmT~V|M(*Xjyj%=GASKAPk^39Bw1$gSOlWaxQH)D!adt_5K}=X?a!F=xaAt1I zW@DaZY>d}7-x6YCVZOj^IQgNN4T#>XES}B6s4}@YGGE|Vnry41Fj-AUkokh33Xts$6w}?@tK-7SSTp&O z=|Z4doyiqu`pg%F4JWTL`wKMEaPm5HaiB7l&8N&|c_r7eF)%bReC1={;qNH#wCS;# gp?HZ~`XaaVW+vAVUdBh8!-GsfHfe937@W=w0G~=sIRF3v delta 317 zcmdnHmhs10M(*Xjyj%=GpthZTBlkCMBYXYO;?$yI{fyMSqRhh5)S|@P#GH(LeV6?5 zyqx^Rlw$p$)PnqC{jkjBlFZ!T%v}A=GCa%J7;kSrEX2gZ`hkI&Q+V6=>+JZnXBZTV>GJ#iVbG(iVCu7UxC8i630*rzxlReDzSwAue z3TjQRGW)9t64Sb&syV^$=La?h0g;}H8SGd16&4s?;#UEgrMG#Cxh${r1~vwU28OSE v3_ScD<()P?HZv42aZ7(>kmJlDhZ`3NsX~hNE*lK zeNI}Uw63Nhd0nKrxs@eHfhc zoEWEnKxjAb{e12@=iYnn`S=E%d0>&i*dOP}xPkj?Tlim$EJwWf|zn%k-!YX0GMg3}v0w^K3nuyN-#Qa9(O4&xyZ zDgWX(OkYdQIiYz`Xw3_)s?f@>m^bTHv6KJX9MGjs@>a2Pq#!q(Kad@|Frqp)T@U29 z?Ngoj06Qzs`6k-Aa*&GU>-OuT)7BLYT<=g zlCL@p*TzM&4noLZF}nGOlFU_OJC(Hf{6lKveyeN2>Ze*X{M8=+k!WO{m>;-j)@t0F z@WVk%quT!~y*ofg_6$SxPYI_?)mn2x?`5qt>i5DWTHp zV^KC5#WGilhKVsH!7!J#wDX%;J<$#b-`x_&nQ;+${)OQAEdzlquMgyp_S+ zC~gCoZG7b9)I^*`S@&o(5#$A%W%vc)D<<&K8S;r_P3a06h_?BinS(j8MHO2Lj=EHT zs=pvP=7X8zImxR^-h#sk9MF0=(~}cDs_3cG8iAEkiz>D7N9}La6$HyIVP$2!ZC(%K;x3GD)S!2byep-4D(rgC1gv< z^A2iZNY9Xh%{iaUw&iTARa@^x!xibeBj@W?g{>(L zCy4!`9AbfsBo zJ-kw&(8GQFKZf??{nc02Hzg4=sJ-kUZ06EWgc7@O^+6A4H?J$9Mq@HtJ=JURi5T>5VMZQS1UK=L8* zqSg(W7b&fQW2KclJAUHIogJf4l!C$VL`YG>(TRy*5Xz$oxLS?=vRv`_&l^Lqq970O z%^8SK`LCp_tMQe{3fNSh@7HzJ$eDo>fuB3!DDAFkERhO4&A({s5Vt|+t0@EbxV?3{ zngM8rRVeU2x5rZ=jWx2?-!!xQQcB;rclSfuC#nVvE$Tzhgc;@{!(7zV t*%73$#I@`FSJ)nlN2VvDJJ={Mx=;5V)>AO|-k3V|r6&3MK5}i_?*VM&xF-Mr delta 2080 zcmb7FOKcNY6rDHr#NYAwGl}gGJE6pcfdnTsgkK;b;-jW5Ed?TqiY$|u5b7}S#t9*! zO%^O78dQ@@g}bN}HWXC)p=?lDw5qzP)Jk9>)v~IVMK^Ti2o`One(oK|G(Zt_q8wk} zcl_SD_Z~n0-u3=E&xf+?6!7uiccwZbXFb2L-DmH;(mo}Ov3>F`L30)DTgQ&3b)Mq= z5)tPgE52Ir|K2wU@3Hejh5?g8aE^_O86Px@5$1qiagI5m)AAx*uLvJjih*TIGH}A$G7OmkEHeFfDwN!byPRveM9}3q2XOa!*P(U%h*2Xu=c{c)(%H2 z9(Z0jDa=BftilmVxi)A0i-BI{hdEEoMUu>CRz^ZK9If)fgiV3HwrbEN1;!OGoU+x! zWhL0?t#D5YhkccJJSYhLVxqDJ=j=1g4^56v7JvcAdicz7+N#;P3VWRESs1d;#;V=; zS>p_R;k*xDxmu-?U~{yQG@HWb>B6wb?!7IlN&=&70CO&7dSk9F@2Y#0xj(lvFGo!#^!Y!B?_Epg?a&=qU;X)voZNKC8PQUPjJC=9HW)EEQ-*PwKb~oR2Hx~k->}p;MS3_ZFQZM?bNP{6X zlyyhpCpF4Gfj`yFtQNYeZ$ut$gF)X+thCH-f?&;(=dRKoTM;IOJ1#lvJH3V~(6T(Y zbLO}iLSIb_Zg;BYrTsm~yDTmkXE%L%fr54Te%xER8CK3u={m6%AxsJduX;|IZOeNb zZ+bUeQm;g=FV1TlZrVGstgh-XYzy|*X>14Ij%-e{9@ZR#E5R7M0r_AYC5fT!5ptf! zxS#ml#9yFhDI5$nvM=GCP>j`H`!)O>TSVsER<aBERu!faRzCW~yW z$W9ovMBXU3jNCi!|F^u6%psi*ji=ZP0(K8s z5KnnR_msf={i%82^+@YPJC1?Z6GREj8-*On&0A(EMKr;poJjPilZMfsN~aSEbWaGg zrg6HF5D2lql*TC)Q%C+X*D50vNC3&EqS7F3$ w1g7p+DWYE$vz9;Xox}RTNIJEN?}zpEZ*P9t!cg0P#EdjJ3c diff --git a/__pycache__/map.cpython-311.pyc b/__pycache__/map.cpython-311.pyc index b5accb1360d56b98a0bae054f279f188c12d0e42..cb042222574519cc2256496ee5265ca10b527e42 100644 GIT binary patch delta 293 zcmcbp(yzj|oR^o20SM~Exl%QGHu9}tl2&lBiU}=FEsAkTEzT~uQ<7f&4wQ)_<@UoN2tSY^F20q#`-Vhd>V0?pDctS~6Tu0muVettjAYO4-Y)32=1AaA delta 363 zcmeBIxv0XooR^o20SJOVbERJ7-pIFt$;ezkv^ce>SU)2*uPC#yG_@!(H!&w8U*9Fa zJTE6dF{M~PD77HJSU)T?xg;|;I5Ss&^F<~HX2v&@h1hJ=KQORxYMo#MQ#V8fil{+{+YNrv4-8DaT9fnHY{Zb&e&Ax@5dsOQZQjM^&RE|MbW{Vw4Q{~+ z!Ckf=7z8l$HS!7MXPQA;`*HO|_bCFx- V3b)Jx#!K9a9~eNoRRvx#0swY29YgdJ52Ui?6En) zcE#HNLO|dZ>!3@9K^F{zHeY9#W0jO=1REm4z{58|u*`LcUMUIijd|7Zp{yD3_Sc3RHkTL5z@HCt#N@{WAjDH z*G!CAllRIHQphH|g^|%`@@_e8rjGi_XBE^Zo5*gQd|3Vlqu=B?3OdXe_~kdBRoKV` E0PI?w!2kdN delta 466 zcmdn&_Ro!bIWI340}!ZfXWz&j#BAiGA6lGRRIHzonpc!rSejatn46fBk+1KPU!Iqf zpO{jtACy{h+))dea`G?wVBsJWtKb4khuEO>zRgy11AF!My|h4APr;qh0( zlP{zcUI{O{r%NIfSECfwu7K&2U{1vLs?j%m$q+s`i&; z?7@NuOivgdvIH|HHwcRYT>(@%d4{ku$UVGzoA(KKF)?~g_7qbBJJ5P_p4eR`#;VCa zlIltzuWH>DlD;COd4XH=0~-Sm{{)pO8drogE^%vsB*ivQkbKR=m_NBjh6vS?n-9or gVPy25Tq>sxwq0rSBDoEWi~*B_6?C8iO$r;C0Gn5k#sB~S diff --git a/__pycache__/rescuer.cpython-311.pyc b/__pycache__/rescuer.cpython-311.pyc index 3dbb39f4368fc354874e0245e79e0fc99dc2b28d..ff4acc997d8c83c334a85e593310d680a0048830 100644 GIT binary patch delta 1277 zcmZ`%PfQb87=Ld%Qz*2ZaV!l}gA@>Cr0woz4`vPi0g2IrJ?QEtq^7Cu6D$3fH-#l; z3>-WRgahW0h>0;h?P@%kp1gbU){-VPlbCqfP4?o}>>h{*^?O4>NbsA<@4fH$z3=

)21PIp>p0Z)6bBfZ1! zxJHch9HD6!_iKv?E7$+~%znnN!!yW4Nzbm)(VQ%tF;S(P4Tu4D3HzBUJi}i0N|?|* zvxVaCg=9WevVA+-`E0tJ%^U2aFnR36)S1K$gV4kjF=orfQsSm#yq?V`7;%kY%2r)* zxv3qq#8rQ@uip|IouR7jx{3RGAg3*sQsujLM?0j!uNn@Asm9_`6b~{}irftWcX&;I zgXJ+QV_4c^;y*xpxyMYQTcZg9p$D!9qA8l_-kxP1)6jmsBJkQ1rg$&_MyvXP1j0f4 zz66pfLBPG{AD&>*lnw^q2{H%{txXBaHpy}Jg2C>!}DeLjI-a*^Eh#E@bW{0+yOhyH28aH_sWw@mU5{=fzbO$t`Vkq zWc(uwd;Z0ts?t>za1VRq)v?Atc!zo?!Od6!SVAoYd6m^)HiVV))_E53OiK zov$URlGZ|pz^Ev}+}fbVT3$ET_dsFO{ U#W>JHhohDM=ve;$j@>E$D`ZeEQ2+n{ delta 670 zcmZ{f%WD%+6vpSyBgr(G%-F$YoQ9=)2 Date: Wed, 20 Sep 2023 18:21:06 -0300 Subject: [PATCH 08/19] A estrela --- __pycache__/explorer.cpython-311.pyc | Bin 8185 -> 15249 bytes explorer.py | 186 ++++++++++++++++++++------- 2 files changed, 143 insertions(+), 43 deletions(-) diff --git a/__pycache__/explorer.cpython-311.pyc b/__pycache__/explorer.cpython-311.pyc index 3b417fb627a38961914c9e2d6648e212431e6f8c..b15e228c32c2384e4639e6d679481928ac695109 100644 GIT binary patch literal 15249 zcmdrzTWlLwb~AiP!a`LbTVB~p;y8-evgN#N%ZV*NqS#?5&Pbw7k@5`X z*eaE%MHWlDLPLAyngv{d3nZzGcu{TP52M(kMzJW;q9|sF0YnTCKtK^-{ZlCLF0jZ? zd(ItlI77)^If=JGhvb<%ckbidbI@NkeH8Uy_)xs8g~X%3fW$3| zrC2&jjjDHglqS!nQ4`!vQS+2#)I#GsbJRLjF=mT2V^Gs=*(HENr(kJ_gkqYm;+ zN1dZiC|?nEO;wFn(UggLjbbZ5rdWovd~T+wFW{$Mqi&WyK?Q6N@o_jnE3UyYA;E{j ziNOgjmVgY~Ta#CW;)D5UXgXk0%!3CGDpjFE$tf-|8E2uWWjM}q;X=#gW-2^9`VbO7 zgOPF+j&9VHqQ+^K{+JmxvnI|mZeq=ZvZ#xTU3IEMB(}z?q3uisI2admPsY)r0H`Q=@-S(QZ$t`C#j(JoTScc6o-85 zkz6bdPZ}=dslxECviLMXK}p8&WGgz9T{5&_#@mwq% z3HhPc)K~=Tl?sOAvGK@6a6A&__WBc(oFBL)9-V=vr$dQJeNPIQH8n0L1q|I?%2%K7{>?W@b zV!=z1Fw_zhoBB8vnpWK75nf1;V!^Rc_yUg;tC-A~mT@CV zg428iFi1q86I(DCj)nvw7!;5n2=V8??Hby9_N2h^XNNf9LLxqW_7p+lL}co0k&eC7 zS9llHn5{0ddT(*e9>^9h0{Fu`_4_KyR&}*

l<(&oT8GU*>|uY?GO7BC~C+f~svu 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 diff --git a/explorer.py b/explorer.py index bc4b42a..8cee74a 100644 --- a/explorer.py +++ b/explorer.py @@ -9,7 +9,8 @@ from physical_agent import PhysAgent from map import Map from abc import ABC, abstractmethod - +import heapq +from node import Node class Explorer(AbstractAgent): def __init__(self, env, config_file, resc, path_priorities): @@ -24,11 +25,12 @@ def __init__(self, env, config_file, resc, path_priorities): # Specific initialization for the rescuer self.resc = resc # reference to the rescuer agent self.rtime = self.TLIM # remaining time to explore - self.horizontal = 0 #Incrementa se andar para a direita e decrementa se andar para a esquerda + self.horizontal = 0 # Incrementa se andar para a direita e decrementa se andar para a esquerda self.vertical = 0 # Incrementa se andar para baixo e decrementa se andar para cima self.number_of_moves = 0 - self.known_map = [] self.known_victims = [] + self.known_map = [] + self.first_move_back = True self.map = Map(path_priorities) @@ -87,10 +89,17 @@ def deliberate(self) -> bool: """ The agent chooses the next action. The simulator calls this method at each cycle. Must be implemented in every agent""" + self.update_known_map() # Adiciona base na lista + if self.time_to_get_back(): # Returns to base and notify the rescuer # If agent is not at the base, returns True - return self.get_back_to_base() + if self.first_move_back: + graphed_map = self.graph_known_map() + best_route = self.calc_best_return_route(graphed_map) + self.first_move_back = False + + return self.get_back_to_base(best_route) # Check the neighborhood obstacles obstacles = self.body.check_obstacles() @@ -99,7 +108,7 @@ def deliberate(self) -> bool: dy = mov[0] dx = mov[1] - while not self.authorize(obstacles,dx,dy): + while not self.authorize(obstacles, dx, dy): mov = self.map.get_action() dy = mov[0] dx = mov[1] @@ -129,48 +138,133 @@ def deliberate(self) -> bool: # print(vs) return True - - def get_back_to_base(self): - # Moves the agent to the base - dx = 0 - dy = 0 - if self.horizontal < 0: - dx = 1 - elif self.horizontal > 0: - dx = -1 - if self.vertical < 0: - dy = 1 - elif self.vertical > 0: - dy = -1 - - movx = dx - movy = dy - - while not self.authorize(self.body.check_obstacles(), movx, movy): - movy = random.choice([-1, 1, 0]) - movx = random.choice([-1, 1, 0]) - - self.update_distance_to_base(movx, movy) - # Moves the body to another position - result = self.body.walk(movx, movy) - self.update_known_map() + def calc_best_return_route(self, graphed_map): + init_pos, init_neighbours = list(graphed_map.items())[-1] + base_pos = (0, 0) + return self.astar(graphed_map, init_pos, base_pos) + + def astar(self, graph, start, goal): + open_list = [] # Lista de nós a serem avaliados + closed_set = set() # Conjunto de nós já avaliados + heur = self.get_heuristic_estimate(start[0], start[1]) + + start_node = Node(start, None, 0, heur) + heapq.heappush(open_list, start_node) + + while open_list: + current_node = heapq.heappop(open_list) + + if current_node.state == goal: + # Se chegamos ao objetivo, reconstrua o caminho e retorne-o + return self.build_path(current_node) + + closed_set.add(current_node.state) + + for neighbor, cost in graph[current_node.state]: + if neighbor not in closed_set: + # Cria um novo nó para o vizinho + neighbor_node = Node(neighbor, current_node, current_node.cost + cost, + self.get_heuristic_estimate(neighbor[0], neighbor[1])) + + # Se o vizinho já está na lista aberta com um custo menor, ignore-o + if not any(neighbor_node.state == node.state and neighbor_node.cost >= node.cost for node in + open_list): + heapq.heappush(open_list, neighbor_node) + + # Se não encontramos um caminho, retornamos None + return None + + def build_path(self, node): + # Reconstrói o caminho de volta do objetivo para o início + path = [] + while node: + path.append(node.state) + node = node.parent + return list(reversed(path)) + + def movement_cost(self, pos1, pos2): + if pos1[0] != pos2[0] and pos1[1] != pos2[1]: # Diagonal + return self.COST_DIAG + return self.COST_LINE + + def graph_known_map(self): + for i, coord in enumerate(self.known_map): + neighbours = [] + if any(sublist[:2] == list([coord[0] - 1, coord[1]]) for sublist in self.known_map): + neighbours.append([coord[0] - 1, coord[1], self.COST_LINE]) + if any(sublist[:2] == list([coord[0], coord[1] - 1]) for sublist in self.known_map): + neighbours.append([coord[0], coord[1] - 1, self.COST_LINE]) + if any(sublist[:2] == list([coord[0] - 1, coord[1] - 1]) for sublist in self.known_map): + neighbours.append([coord[0] - 1, coord[1] - 1, self.COST_DIAG]) + if any(sublist[:2] == list([coord[0] + 1, coord[1]]) for sublist in self.known_map): + neighbours.append([coord[0] + 1, coord[1], self.COST_LINE]) + if any(sublist[:2] == list([coord[0], coord[1] + 1]) for sublist in self.known_map): + neighbours.append([coord[0], coord[1] + 1, self.COST_LINE]) + if any(sublist[:2] == list([coord[0] + 1, coord[1] + 1]) for sublist in self.known_map): + neighbours.append([coord[0] + 1, coord[1] + 1, self.COST_DIAG]) + if any(sublist[:2] == list([coord[0] - 1, coord[1] + 1]) for sublist in self.known_map): + neighbours.append([coord[0] - 1, coord[1] + 1, self.COST_DIAG]) + if any(sublist[:2] == list([coord[0] + 1, coord[1] - 1]) for sublist in self.known_map): + neighbours.append([coord[0] + 1, coord[1] - 1, self.COST_DIAG]) + + coord.append(neighbours) + + # Transforma para formato em dicionario + graph = {} + for node_data in self.known_map: + x, y, neighbors = node_data + node_coords = (x, y) + neighbor_info = [((neighbor[0], neighbor[1]), neighbor[2]) for neighbor in neighbors] + graph[node_coords] = neighbor_info + + return graph + + + # # Moves the agent to the base + # dx = 0 + # dy = 0 + # if self.horizontal < 0: + # dx = 1 + # elif self.horizontal > 0: + # dx = -1 + # if self.vertical < 0: + # dy = 1 + # elif self.vertical > 0: + # dy = -1 + # + # movx = dx + # movy = dy + # + # while not self.authorize(self.body.check_obstacles(), movx, movy): + # movy = random.choice([-1, 1, 0]) + # movx = random.choice([-1, 1, 0]) + # + # self.update_distance_to_base(movx, movy) + # + # # Moves the body to another position + # result = self.body.walk(movx, movy) + # self.update_known_map() + # + # # Update remaining time + # self.update_remaining_time(dx, dy) + # + # if result == PhysAgent.EXECUTED: + # # check for victim returns -1 if there is no victim or the sequential + # # the sequential number of a found victim + # self.map.update_agent_position(dx, dy) + # seq = self.body.check_for_victim() + # if seq >= 0: + # vs = self.body.read_vital_signals(seq) + # self.rtime -= self.COST_READ + # # print("exp: read vital signals of " + str(seq)) + # # print(vs) + # + # # self.resc.go_save_victims([],[]) + def get_back_to_base(self, movements): - # Update remaining time - self.update_remaining_time(dx, dy) - if result == PhysAgent.EXECUTED: - # check for victim returns -1 if there is no victim or the sequential - # the sequential number of a found victim - self.map.update_agent_position(dx, dy) - seq = self.body.check_for_victim() - if seq >= 0: - vs = self.body.read_vital_signals(seq) - self.rtime -= self.COST_READ - # print("exp: read vital signals of " + str(seq)) - # print(vs) - #self.resc.go_save_victims([],[]) if not self.at_base(): return True else: @@ -202,6 +296,12 @@ def update_known_map(self): if [self.horizontal, self.vertical] not in self.known_map: self.known_map.append([self.horizontal, self.vertical]) + def get_heuristic_estimate(self, dx, dy): + # Estima o gasto necessário para voltar para a base a partir da coord atual + valor = min(abs(dx), abs(dy)) * self.COST_DIAG # Anda o máximo que pode na diagonal + valor += abs((abs(dx) - abs(dy))) * self.COST_LINE # Anda o restante na vertical/horizontal + return valor + def authorize(self, obstacles, x, y): if x == 0 and y == -1: if obstacles[0] != 0: From b037f5df79ff8a6df0a9dc77d2c80b5404013554 Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 20 Sep 2023 18:25:36 -0300 Subject: [PATCH 09/19] Added node file --- node.py | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 node.py diff --git a/node.py b/node.py new file mode 100644 index 0000000..c098790 --- /dev/null +++ b/node.py @@ -0,0 +1,11 @@ + +class Node: + def __init__(self, state, parent=None, cost=0, heuristic=0): + self.state = state # O estado deste nó no grafo + self.parent = parent # O nó pai (nó anterior) neste caminho + self.cost = cost # Custo acumulado para alcançar este nó + self.heuristic = heuristic # Valor heurístico estimado para o objetivo + + def __lt__(self, other): + # Comparação com base no custo total (f = custo + heurística) + return (self.cost + self.heuristic) < (other.cost + other.heuristic) \ No newline at end of file From 08354ca1e75f4ace7d1daffffd7b31b604f41045 Mon Sep 17 00:00:00 2001 From: Henrique Date: Wed, 20 Sep 2023 19:37:08 -0300 Subject: [PATCH 10/19] A* para voltar a base --- __pycache__/explorer.cpython-38.pyc | Bin 3784 -> 8463 bytes __pycache__/node.cpython-38.pyc | Bin 0 -> 630 bytes __pycache__/rescuer.cpython-38.pyc | Bin 2433 -> 2756 bytes explorer.py | 85 +++++++++++++++++++++------- rescuer.py | 2 + 5 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 __pycache__/node.cpython-38.pyc diff --git a/__pycache__/explorer.cpython-38.pyc b/__pycache__/explorer.cpython-38.pyc index 4e683bda8a0f3913aa6009511bb923ce947b34ec..cc2afce6495ecc4704851e077e205482944ec612 100644 GIT binary patch literal 8463 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 diff --git a/__pycache__/node.cpython-38.pyc b/__pycache__/node.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a82cb390cd1918ea8726464f66383573624366f GIT binary patch literal 630 zcmY*WJx{|h5IyIsX-gNDG9VsfwmVQ|qkpD<$tz-D zW@F;crBE)q=jXHU?wxZt81w+`z3j_j0PseeeG74OiEa)NZa{!wYxLKk01=EK3rmdu zv)_yp3`;1OfFckb5sGNdicrKNSwj&ChS{l$@b~F+$5);Lrw$ ztPK%^HbM*qjA6s_EON22Q!8Dvm}*&D7nO~%t~--Ut&CM=7Q4vE`GbzInx^_XA?P4% zKzDKZI=w!d+{#5`lx?(X%;a8`R#jtFO={FRTD-WFb5$$LIn8NO1Yn8(Rs))4v^y_J z{?3R~f*0y)W5k|t6iv6X;7=NIYU1L?&ZPD-w?O~RC7jPu3yC+rU$E-` zsGxWj=93n;l`*eRmKvnmE8fu0>6%D;&%6f^9 Wmd8P{GysAGq9S|sEu zLR5llwO0=5H{=J9$`^3-AHY8#n6-nNGLqlCoq4mnGv1GvzArh?Y}+DezeI&^+b7N$ zY@YnMz7muJc1*gImjm-F1XfTv*1PO8(Mi{QLONAhhc(!g_u*EpM^fUNIa(>1ROD-z zKvkBtN6Y4Z6u*z$fj7+Tf*$t$QGbxgZ7r-j>RiJqQDC|Q6zKGuwg~qc7|rydH+qwm zXL4~FV+Ax-cA*!$iFe4|S$4L)sj_Lcxfn@Cmla%k~THsC1;KdP?5HepxW( zCt9kX0+4qMb=sWHNDa)FP`5GD8MzKu6TL@z-wRWBt8#A*PR>Kl2WS&At-{4U!vYJgX$uq%#y#^)7tsrIcrMKT=@%# CR->%| delta 446 zcmX>i+9=Ey%FD~e00eH+*-|%hPvkqyXf^SYx5Dlc&NO>WGfbx%{i>WjP=qWl^{Zs z2}~6+BG@ng0|8JRBvd2=5eHE)HDETfILI77paxDLeTyxzpdd9bMU$}zkV1CynNEu9VcA%%s$!#FA9Y$x}G>8965(;neb$0-4AU zvV|onKR>5P6U5|=k5A4?EG|w?&B=+6N3u{Dq#6_uMQlKV7l?~FfCL94j}Qm@WCyMg O0fen!me}MaTnYdxp bool: if self.time_to_get_back(): # Returns to base and notify the rescuer # If agent is not at the base, returns True - if self.first_move_back: - graphed_map = self.graph_known_map() - best_route = self.calc_best_return_route(graphed_map) - self.first_move_back = False - - return self.get_back_to_base(best_route) + init_pos = (self.horizontal, self.vertical) + return self.get_back_to_base(self.best_route, init_pos) # Check the neighborhood obstacles obstacles = self.body.check_obstacles() @@ -189,30 +186,38 @@ def movement_cost(self, pos1, pos2): return self.COST_LINE def graph_known_map(self): - for i, coord in enumerate(self.known_map): + + map_copy = [] + + for c in self.known_map: + x = c[0] + y = c[1] + map_copy.append([x, y]) + + for i, coord in enumerate(map_copy): neighbours = [] - if any(sublist[:2] == list([coord[0] - 1, coord[1]]) for sublist in self.known_map): + if any(sublist[:2] == list([coord[0] - 1, coord[1]]) for sublist in map_copy): neighbours.append([coord[0] - 1, coord[1], self.COST_LINE]) - if any(sublist[:2] == list([coord[0], coord[1] - 1]) for sublist in self.known_map): + if any(sublist[:2] == list([coord[0], coord[1] - 1]) for sublist in map_copy): neighbours.append([coord[0], coord[1] - 1, self.COST_LINE]) - if any(sublist[:2] == list([coord[0] - 1, coord[1] - 1]) for sublist in self.known_map): + if any(sublist[:2] == list([coord[0] - 1, coord[1] - 1]) for sublist in map_copy): neighbours.append([coord[0] - 1, coord[1] - 1, self.COST_DIAG]) - if any(sublist[:2] == list([coord[0] + 1, coord[1]]) for sublist in self.known_map): + if any(sublist[:2] == list([coord[0] + 1, coord[1]]) for sublist in map_copy): neighbours.append([coord[0] + 1, coord[1], self.COST_LINE]) - if any(sublist[:2] == list([coord[0], coord[1] + 1]) for sublist in self.known_map): + if any(sublist[:2] == list([coord[0], coord[1] + 1]) for sublist in map_copy): neighbours.append([coord[0], coord[1] + 1, self.COST_LINE]) - if any(sublist[:2] == list([coord[0] + 1, coord[1] + 1]) for sublist in self.known_map): + if any(sublist[:2] == list([coord[0] + 1, coord[1] + 1]) for sublist in map_copy): neighbours.append([coord[0] + 1, coord[1] + 1, self.COST_DIAG]) - if any(sublist[:2] == list([coord[0] - 1, coord[1] + 1]) for sublist in self.known_map): + if any(sublist[:2] == list([coord[0] - 1, coord[1] + 1]) for sublist in map_copy): neighbours.append([coord[0] - 1, coord[1] + 1, self.COST_DIAG]) - if any(sublist[:2] == list([coord[0] + 1, coord[1] - 1]) for sublist in self.known_map): + if any(sublist[:2] == list([coord[0] + 1, coord[1] - 1]) for sublist in map_copy): neighbours.append([coord[0] + 1, coord[1] - 1, self.COST_DIAG]) - + coord.append(neighbours) # Transforma para formato em dicionario graph = {} - for node_data in self.known_map: + for node_data in map_copy: x, y, neighbors = node_data node_coords = (x, y) neighbor_info = [((neighbor[0], neighbor[1]), neighbor[2]) for neighbor in neighbors] @@ -261,9 +266,19 @@ def graph_known_map(self): # # print(vs) # # # self.resc.go_save_victims([],[]) - def get_back_to_base(self, movements): + def get_back_to_base(self, movements, init_pos): + mov = movements.pop(0) + dx = mov[0] - init_pos[0] + dy = mov[1] - init_pos[1] + + self.update_distance_to_base(dx, dy) + + # Moves the body to another position + result = self.body.walk(dx, dy) + # Update remaining time + self.update_remaining_time(dx, dy) if not self.at_base(): return True @@ -273,7 +288,37 @@ def get_back_to_base(self, movements): return False def time_to_get_back(self): - return (abs(self.horizontal) + abs(self.vertical) + self.number_of_moves/5 >= self.rtime) + + if self.returning_to_base: + return True + + graphed_map = self.graph_known_map() + self.best_route = self.calc_best_return_route(graphed_map) + cost = self.calculate_cost_to_base(list(self.best_route)) + if(cost + self.COST_DIAG >= self.rtime): + self.returning_to_base = True + self.best_route.pop(0) + return True + + return False + + def calculate_cost_to_base(self, best_route): + cost = 0 + for i in range(len(best_route) - 1): + x1 = best_route[i][0] + y1 = best_route[i][1] + x2 = best_route[i + 1][0] + y2 = best_route[i + 1][1] + + mov = (x2 - x1, y2 - y1) + + if(mov == (0,1) or mov == (0,-1) or mov == (1,0) or mov == (-1,0)): + cost += self.COST_LINE + else: + cost += self.COST_DIAG + + return cost + def update_remaining_time(self, dx, dy): # Update remaining time diff --git a/rescuer.py b/rescuer.py index 2289b80..af46fa6 100644 --- a/rescuer.py +++ b/rescuer.py @@ -44,6 +44,8 @@ def merge_maps(self, path, victims): for i, victim in enumerate(victims): if victim not in self.known_victims: self.known_map.append(victim) + + self.go_save_victims([],[]) def __planner(self): """ A private method that calculates the walk actions to rescue the From 76074d9fbc491b6bc4a644838d74efe3ff1f7289 Mon Sep 17 00:00:00 2001 From: Henrique Date: Wed, 20 Sep 2023 21:40:56 -0300 Subject: [PATCH 11/19] =?UTF-8?q?Corre=C3=A7=C3=A3o=20condi=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20seguran=C3=A7a=20de=20retorno=20=C3=A0=20base?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/explorer.cpython-38.pyc | Bin 8463 -> 8698 bytes explorer.py | 182 ++++++++-------------------- 2 files changed, 49 insertions(+), 133 deletions(-) diff --git a/__pycache__/explorer.cpython-38.pyc b/__pycache__/explorer.cpython-38.pyc index cc2afce6495ecc4704851e077e205482944ec612..372bcd2cee91034fd5ce1bbb3b8a52032e8565c5 100644 GIT binary patch delta 2421 zcma)8OKe+36rGv(@$=uYlQ?!hc4?B>H9MD^FJ!A_ z=xxjKSj&~AGPl+#?}qhw?-uld()$w$Q>J}WT_HuszR zP{MEWT>#^v%g57hhwpAaNm&Y z-id8z-MaWQb~cV4<&&G9%79Z*enwpE9H2Kuy>p`XSx`7$t8}#}!-+qQ1Po+8A)L;= z^oTIJj`T`r%g_ri@Lc6`woocxD`kthiYYF3 z)LD(0G(qYL^bC3xGDEG=np#s@iaquJyeorpHBB;EU4wagO>Mw5CezK+PCKLBdtD;f zw5o5>Uts(%xp-hpkDCj^mh_r#(t;-Kq#3H|En4@~Ak!DaFe5S!8JCNjGTp_D zXFS4pfMN}rjrm5HxZ_C<`jim$QG*6(ghpw%x)M3=779Mvt{C%F-0SLTd z9HmmO@G~IsQwXOK&Y{7R!@_A>`~_6`0cLy<$O{b%W7C$Ugh$baKF)aEYMMcww^)AN zDniY&`2{3o5iTOkBD@UXQ2u!RN`ra>nwKS~+E@w*)8VvkEc$2&B2uSG zaiZtf2F5$onyuL1lm}fsnxzr+sB&f1(Ri-3U^&W?Rccot5qA@x#O1ND8m+fafE1i2Gc2sr0qm z5h||^i}Jc&hi8l`!&9txy(PY4y4Z>IU;`d%Jj?`3lBK?Mj<6}?tsZD9Mz$iZIj5C4 zXO4yq)ZxCq8j#pB_MBiU(G0alcU%T>BSQ$~@LZ~poVBlHl7%H)^C?-6Zuq3(3_NeR z+g?i?kDbeV+hj{~U(qYZ`)Q|`9Fm!u{`JMGS&mJyh4DNdG@Xw&x z%tqe8VA-0zv2e{v=Ip|JS+gBS4#6Wc)iQ)J86|j=ppD=)g!>Tn-D*98R>F`6$g8q= za<)um3vvLS`5HTpp}(wC%1R2AN2PchBcH?Hz7Kf}verrd<@#3^2;7_w*r6B(pK>`s zi;zd*S)kJx#?3eIN8t9JDYWD{g7*l{6YL}=-nZ}|Xzzme9rAkMS|A1&LM^-Ce_!Rd z!7ricF8Dtne*`Xs+jqhJ5xL{=SGax`+@DllyLLBue}+=+xd?Ssp55wH0-H+qDG1iZ z_-}BaZa7L;SoWo|Hx|{ClP8F9hF}72*B#*Rz((C*R5hC}upF9`c5XhI$u516O)lEG zuOV1(uWA_D`jNhP@UQgcAsQ|(GKb>;R<*(vq!`WHnt^*%4&0M=a94MYk{}64i=tN9 zDRIzuB1NOb@)v0)3n&|D@9G*KVV8O?iWM(Sc^c=xg%!<$4{d9WtF>kgC5*G{R~>zl zISj|y7+0e#sYz3#34dA3E#+hn?qnCiUV?oHWv@*`jl(=mt{Q}C3;Q*fq7LNcK$6^b z1T^5)!JhUlF1?>x#Hq-uF_gVT=qKnSc$wfbLYd3|j!7Kd0hE|LDFhSnFfzu^!|#!S zBN1whH)F^t2gNx_JFRFsLWvZ|FH=G_KBYcw6iaEq1X2|^2v3^hahfhUK@cFAK}cvy ziRA0#7=j1w^{t&~c2NOzoCy!tg{h<^3E$F*PfQWc&n81LgyY<(P26;qa{)nY4+R5ZGy z;~ZpkCOl6Ju_MUvuF>R`HhNER_$NADL&_!71PkgcUH2&tAGO&5^-)}gDVR~g7toyG zAlmb7O7Zla#Fgt-0;sq~2Xd$2Y5T|fD%7&JxR6Cfoy}LeO|>WVN~5c_PsCb{5p bool: - # """ The agent chooses the next action. The simulator calls this - # method at each cycle. Must be implemented in every agent""" - - # # No more actions, time almost ended - # if self.rtime < 10.0: - # # time to wake up the rescuer - # # pass the walls and the victims (here, they're empty) - # print(f"{self.NAME} I believe I've remaining time of {self.rtime:.1f}") - # self.resc.go_save_victims([],[]) - # return False - - # dx = random.choice([-1, 0, 1]) - - # if dx == 0: - # dy = random.choice([-1, 1]) - # else: - # dy = random.choice([-1, 0, 1]) - - # # Check the neighborhood obstacles - # obstacles = self.body.check_obstacles() - - - # # Moves the body to another position - # result = self.body.walk(dx, dy) - - # # Update remaining time - # if dx != 0 and dy != 0: - # self.rtime -= self.COST_DIAG - # else: - # self.rtime -= self.COST_LINE - - # # Test the result of the walk action - # if result == PhysAgent.BUMPED: - # walls = 1 # build the map- to do - # # print(self.name() + ": wall or grid limit reached") - - # if result == PhysAgent.EXECUTED: - # # check for victim returns -1 if there is no victim or the sequential - # # the sequential number of a found victim - # seq = self.body.check_for_victim() - # if seq >= 0: - # vs = self.body.read_vital_signals(seq) - # self.rtime -= self.COST_READ - # # print("exp: read vital signals of " + str(seq)) - # # print(vs) - - # return True def deliberate(self) -> bool: """ The agent chooses the next action. The simulator calls this method at each cycle. Must be implemented in every agent""" self.update_known_map() # Adiciona base na lista - + if self.time_to_get_back(): # Returns to base and notify the rescuer # If agent is not at the base, returns True - init_pos = (self.horizontal, self.vertical) - return self.get_back_to_base(self.best_route, init_pos) - - # Check the neighborhood obstacles - obstacles = self.body.check_obstacles() - - mov = self.map.get_action() - dy = mov[0] - dx = mov[1] - - while not self.authorize(obstacles, dx, dy): - mov = self.map.get_action() - dy = mov[0] - dx = mov[1] - - # Moves the body to another position - result = self.body.walk(dx, dy) - - # Updates travel information - self.update_distance_to_base(dx, dy) - self.update_known_map() - self.update_number_of_moves() - - # Update remaining time - self.update_remaining_time(dx, dy) + return self.get_back_to_base() - if result == PhysAgent.EXECUTED: - # check for victim returns -1 if there is no victim or the sequential - # the sequential number of a found victim - self.map.update_agent_position(dx,dy) - seq = self.body.check_for_victim() - if seq >= 0: - vs = self.body.read_vital_signals(seq) - self.rtime -= self.COST_READ - if [self.horizontal, self.vertical] not in self.known_victims: - self.known_victims.append([self.horizontal, self.vertical, vs]) - # print("exp: read vital signals of " + str(seq)) - # print(vs) - - return True + return self.explore() def calc_best_return_route(self, graphed_map): init_pos, init_neighbours = list(graphed_map.items())[-1] @@ -224,50 +136,50 @@ def graph_known_map(self): graph[node_coords] = neighbor_info return graph + + def explore(self): + # Check the neighborhood obstacles + obstacles = self.body.check_obstacles() + + mov = self.map.get_action() + dy = mov[0] + dx = mov[1] + + while not self.authorize(obstacles, dx, dy): + mov = self.map.get_action() + dy = mov[0] + dx = mov[1] + + # Moves the body to another position + result = self.body.walk(dx, dy) + + # Updates travel information + self.update_distance_to_base(dx, dy) + self.update_known_map() + self.update_number_of_moves() + # Update remaining time + self.update_remaining_time(dx, dy) - # # Moves the agent to the base - # dx = 0 - # dy = 0 - # if self.horizontal < 0: - # dx = 1 - # elif self.horizontal > 0: - # dx = -1 - # if self.vertical < 0: - # dy = 1 - # elif self.vertical > 0: - # dy = -1 - # - # movx = dx - # movy = dy - # - # while not self.authorize(self.body.check_obstacles(), movx, movy): - # movy = random.choice([-1, 1, 0]) - # movx = random.choice([-1, 1, 0]) - # - # self.update_distance_to_base(movx, movy) - # - # # Moves the body to another position - # result = self.body.walk(movx, movy) - # self.update_known_map() - # - # # Update remaining time - # self.update_remaining_time(dx, dy) - # - # if result == PhysAgent.EXECUTED: - # # check for victim returns -1 if there is no victim or the sequential - # # the sequential number of a found victim - # self.map.update_agent_position(dx, dy) - # seq = self.body.check_for_victim() - # if seq >= 0: - # vs = self.body.read_vital_signals(seq) - # self.rtime -= self.COST_READ - # # print("exp: read vital signals of " + str(seq)) - # # print(vs) - # - # # self.resc.go_save_victims([],[]) - def get_back_to_base(self, movements, init_pos): + if result == PhysAgent.EXECUTED: + # check for victim returns -1 if there is no victim or the sequential + # the sequential number of a found victim + self.map.update_agent_position(dx,dy) + seq = self.body.check_for_victim() + if seq >= 0: + vs = self.body.read_vital_signals(seq) + self.rtime -= self.COST_READ + if [self.horizontal, self.vertical] not in self.known_victims: + self.known_victims.append([self.horizontal, self.vertical, vs]) + # print("exp: read vital signals of " + str(seq)) + # print(vs) + + return True + def get_back_to_base(self): + + init_pos = (self.horizontal, self.vertical) + movements = self.best_route mov = movements.pop(0) dx = mov[0] - init_pos[0] @@ -295,7 +207,11 @@ def time_to_get_back(self): graphed_map = self.graph_known_map() self.best_route = self.calc_best_return_route(graphed_map) cost = self.calculate_cost_to_base(list(self.best_route)) - if(cost + self.COST_DIAG >= self.rtime): + if(cost > self.rtime): + print(f"cost -> {cost}") + print(f"rtime -> {self.rtime}") + exit() + if(cost + 2*self.COST_DIAG + self.COST_READ >= self.rtime): self.returning_to_base = True self.best_route.pop(0) return True From 2e3d0745d9af089f5e274dec6416453570ab02be Mon Sep 17 00:00:00 2001 From: Henrique Date: Thu, 21 Sep 2023 01:53:20 -0300 Subject: [PATCH 12/19] =?UTF-8?q?Agrupamento=20de=20v=C3=ADtimas=20por=20K?= =?UTF-8?q?-Means?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/explorer.cpython-38.pyc | Bin 8698 -> 8700 bytes __pycache__/kmeans.cpython-38.pyc | Bin 0 -> 3314 bytes __pycache__/rescuer.cpython-38.pyc | Bin 2756 -> 2849 bytes explorer.py | 2 +- kmeans.py | 117 ++++++++++++++++++++++++++++ rescuer.py | 20 +++-- 6 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 __pycache__/kmeans.cpython-38.pyc create mode 100644 kmeans.py diff --git a/__pycache__/explorer.cpython-38.pyc b/__pycache__/explorer.cpython-38.pyc index 372bcd2cee91034fd5ce1bbb3b8a52032e8565c5..6a42f76e33416b5d5fce565fb1537dea6ce087cb 100644 GIT binary patch delta 535 zcmez6{KuI$l$V!_0SL_Ya;IL~$a|NWF=g{>=GAPBw>D4by3Q=%29zuE01=)b!fSFJ zUkRol6Mq4wU=ub$CIKwk+pr0831U&%Cz!|RKKZZUH%70?UxcPG{+Qe;Jc04cWGNAO zAZaC{EBd8|Axn6H2#^#6Vxcsq8um1%%~c|;jEoYK#Qw{LfxHm}B0@n#1dzDJo>&r} zlvtcv<(fx0tq)wo+1$tCvfrt2`9D~5Hor6 z3yDrfu>c_Z7E^`cEv8B!t}p`9Mn!RxC&~&lrcItLwSz4Iq&OZd5HUGdI+Zbh@?~ii z#+1oFq*K@mL6QYv$*{>~GHs0EoBzuAF+w$M4wUO+1ctyJc`fc(kV-!g;SW|GGFeq& shOH||AP__-f(Qi=ArB(bKm^FUMJXTx91h_imK=yM0TCgKePx# delta 590 zcmez4{L7g)l$V!_0SIPJ;7+}=k@qe$qs!*k%&XZLqc%_Hy3Q=%3Y05y2N511!gF#R zUkRol6Mq4wU=ub$CIKwk+pr0831U&%Cz!|RHuz1ed=UsDLO?_~khsO3SQ4L< zSe#nqJy~AdS~M0U5f38bKtuwF@ZX#-uD~el24XV;2{%oiA`uWLVDcgfC$?x1GimcH ziB3i>e<1r7Q-xs^Q>7u0HUiQ{MPM_fL8`!n42YFFd9KtBDTGC6(&3ZyrBfMmCSR3S zVN9OZV1Ap(8(1tZH!@?|I7F>vOx^o94yzx2n?!w@>=pSAT7Qi!Vin) w;K}L=Gi+TzG65h$5kx3}2zd~Z3L-$kRFn)Nz~L7LV#$FB6A%%+_>Tf30P#G7LjV8( diff --git a/__pycache__/kmeans.cpython-38.pyc b/__pycache__/kmeans.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf187c55843026ceeb3065b2e56e7e44c1b9e4d1 GIT binary patch literal 3314 zcma)8OK%%h6u$S)(~j*tNt>2HDW#Pw6oJG`D5@$^l?B2=O<`fBn!3Id*NvZdCMB`% zuu1;_5X2XjA06ziEmQ|K)*_7|x@%WLZQf=M$W9~WUJKs4!mdizkU*pe(@Z&|s z{-MF_&%)p?N^~8SWRiDSJ!^TLf6Jth)(a-BV^J59@35+UhJCEoq9Ho8`w0rG12weIKeU9Nmq)tom)4mS)W{7D1J!n`!bC7S(WH8c@Ac`!!f-)Au=M`QQ zqqVURbLx4sJuc&dd3(^aVGFUt6ln(!UM7RL8=c8ZqO>@LQU2})Y*r;yX(4}cbpFYt z^D8J3sgv;%A8n4Gd$FnK-c9n7;Kl?`(aBs&i+k*tR8I!^A+cj}QJy%`PTUwMJEr*? zyCU%t-{8#FK9E4&1TX?+)%xP(?Zxg=o;5a*XW8yuNek$e`3JY zZ43rsPgaY@ZIrRyJGdf4pPPA6TIsfXeHG+4)GN7RK>;#6OnEz#>RmcHk=KZ(NH6c9 zMC+)Ss0g3?+!jkPI$G|EH8EO#P0Bf+tKguAVhsK}I%7UFJWS?>nT528m2(h)RcVy1 z*)YFt%s+tnoy65HpztK|Vj*3e^|b>SI7x91CJRXkFtN0!OMppPm$eU=Jl19GUr36> z$GWHs`{(O%b5+0UBF-1~m7EUm4gGYWLq3Hfd2~kx+0b`zu>kt@eIqy>be-MUSQ8T zLL{;!4H^IV3!N5AEYKg39!T-gABio2dub&uS`V#nNHQk!qliUCyZg4fKOMtMrfWoy zPo`rKWwvJHoR4$AOvku;y5`~B&FMJthBsr55btOgJ_Ub6-!nA4pe^`XQ7`NX<2x1O zIZiEe0nw zWuqfS#!fld?C3nOSFutU z342v1QxOqLy>J*bo+C)K!g}E-?;35K*8_#F7D_}N=mDA_`BzA0F-iXN;4p_#3kN1a zn;bZ%ya=KKK|B}mGIHxxaJaN4v*=~BmylOM7&{Z@jACyF29es`M*I{h>`=v3D-+B( z?gf$7FhY#8dB%EmCiI+-jx literal 0 HcmV?d00001 diff --git a/__pycache__/rescuer.cpython-38.pyc b/__pycache__/rescuer.cpython-38.pyc index f8f1c73ab54f2b6a1d04cf44a7ae037e369b6e0f..86754d927818088aba29ace6f03d46215c8bb173 100644 GIT binary patch delta 980 zcmZ8g>rN9v6rMA?-CMg0A~(fgBt+9_jEO%`QHjAuh}a(}YKmrAIuk5xFV42am?iuG z9)K(l(7uA0_yRnH**D;iub}5_(IC^zxqNfx^qgrTZ1_JRpRnEOnaQrpuic>%9k(K?K0og$>h%U3dJM29~PU?F(|4~GTB z%+JTHTj()hf@7?f?8A|z0RN_3bdw3b>bgo+Wo=suzaF%bHlG8LeCN~SHpUF#js{V% zoTnLJ=^hx#FFszP1b-JtL&rUjJGzM?W}B=FZN91X09ae!V>=K-H;1?(pvV8!GNXOl zJ*BJVqN!Ze$|IqnNR4OnZx-K{ltGRuzsPE*E!8FTid+q&s+iTV6CtLqpw|~yDR^L` z=|{n~^tWr(cC8*wBN$N{M&-lTv1J)mJ5t@HxMW!$-_6k(?yQ3)G-7l&nSdF_na|n~ z^F4UZK2Cn%JKByO>(~k3GSw*Qt`_Um=V$Ve{PZ_2w6lV5^>I=efOuw~$0=DE4`_1L4Y~l?>s%<2KMtlE) zUL2SU^x@#@a%G*kimSdMuF9nYX-jwM2C;I3cgutCZ|VJHgWfh{GR%(%C7FpOL;69g zTZLqWZ6}}D9a>9%vBio8p-q?}3Zj^jN;TO`E=Y6NB}66zb)2g(!!n4N?2#dj*q$_^ z|BvWNU$*O(EDAsnMHJ|hs`pl(Jb1chNdi4nIdGyEX>PyOh+6GXoI_qF=FmFR^zG2u z=k~;Y5x|gvAaXL4FZWf{U}iVj0VN_aJ)kx6y!wpwq@Enha5wrgCp27#ESB+xuQcGX zDV`E5V3&ZmG~p>34|YSjNt$HDATI({rFBb5b>8W=xp4Xs7c+2bsyacyJFY0fMl67^ z)GR%59)WqJ&{nE6d|$Y!I!@+vt_DPGa=YyW;T3QgzX2^#gPLQ>UY8&9u+in>+Jt)e zRe41FM-&fa;u4;P;-5Z+AN_#=I6`7^%)uoC0MGPk9OKl%pd+b@4s@K+$rswvZQTw$ zr_ max_x: + max_x = victim[0][0] + if victim[0][0] < min_x: + min_x = victim[0][0] + if victim[0][1] > max_y: + max_y = victim[0][1] + if victim[0][1] < min_y: + min_y = victim[0][1] + + x = random.randint(min_x, max_x) + y = random.randint(min_y, max_y) + centroids.append((x, y)) + + return centroids + + def centroid(self, group): + x_average = 0 + y_average = 0 + + for victim in group: + x_average += victim[0][0] + y_average += victim[0][1] + + x_average /= len(group) + y_average /= len(group) + + return (x_average, y_average) + + def distance_to_centroid(self, victim, centroid): + return math.sqrt((centroid[0] - victim[0][0])**2 + (centroid[1] - victim[0][1])**2) \ No newline at end of file diff --git a/rescuer.py b/rescuer.py index af46fa6..3669cb2 100644 --- a/rescuer.py +++ b/rescuer.py @@ -7,6 +7,7 @@ from abstract_agent import AbstractAgent from physical_agent import PhysAgent from abc import ABC, abstractmethod +from kmeans import KMeans ## Classe que define o Agente Rescuer com um plano fixo @@ -27,25 +28,32 @@ def __init__(self, env, config_file): self.body.set_state(PhysAgent.IDLE) self.known_map = [] self.known_victims = [] + self.received_maps = 0 # planning self.__planner() - def go_save_victims(self, path, victims): + def go_save_victims(self): """ The explorer sends the map containing the walls and victims' location. The rescuer becomes ACTIVE. From now, the deliberate method is called by the environment""" self.body.set_state(PhysAgent.ACTIVE) + cluster = KMeans() + cluster.execute(self.known_victims, 4) def merge_maps(self, path, victims): - for i, coord in enumerate(path): - if coord not in self.known_map: - self.known_map.append(coord) + # for i, coord in enumerate(path): + # if coord not in self.known_map: + # self.known_map.append(coord) + self.received_maps +=1 + for i, victim in enumerate(victims): if victim not in self.known_victims: - self.known_map.append(victim) + self.known_victims.append(victim) - self.go_save_victims([],[]) + if self.received_maps == 4: + self.go_save_victims() + #self.go_save_victims() def __planner(self): """ A private method that calculates the walk actions to rescue the From c56af6dc24d95e74452e19ec3adf5f883ceee775 Mon Sep 17 00:00:00 2001 From: Henrique Date: Thu, 21 Sep 2023 01:59:18 -0300 Subject: [PATCH 13/19] =?UTF-8?q?Corrigindo=20c=C3=A1lculo=20do=20centr?= =?UTF-8?q?=C3=B3ide=20quando=20n=C3=A3o=20h=C3=A1=20v=C3=ADtimas=20no=20g?= =?UTF-8?q?rupo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kmeans.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/kmeans.py b/kmeans.py index bca4c0a..ab6fa58 100644 --- a/kmeans.py +++ b/kmeans.py @@ -19,7 +19,8 @@ def update_groups(self, groups): for group in groups: new_centroid = self.centroid(group[1]) - group[0] = new_centroid + if(new_centroid != None): + group[0] = new_centroid return self.redistribute(groups) @@ -101,16 +102,19 @@ def initial_centroids(self, victims, n): return centroids def centroid(self, group): + # Caso não haja ninguém no grupo + if(len(group == 0)): + return None + x_average = 0 y_average = 0 for victim in group: x_average += victim[0][0] y_average += victim[0][1] - + x_average /= len(group) y_average /= len(group) - return (x_average, y_average) def distance_to_centroid(self, victim, centroid): From 3e4fe755e888d1b98eb501a41c6f2452752324fe Mon Sep 17 00:00:00 2001 From: henriqueramalho1 Date: Thu, 21 Sep 2023 09:54:57 -0300 Subject: [PATCH 14/19] =?UTF-8?q?Corrigindo=20condi=C3=A7=C3=A3o=20para=20?= =?UTF-8?q?c=C3=A1lculo=20do=20centr=C3=B3ide?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/abstract_agent.cpython-311.pyc | Bin 3818 -> 3859 bytes __pycache__/environment.cpython-311.pyc | Bin 22205 -> 22264 bytes __pycache__/explorer.cpython-311.pyc | Bin 15249 -> 17319 bytes __pycache__/kmeans.cpython-311.pyc | Bin 0 -> 5853 bytes __pycache__/map.cpython-311.pyc | Bin 4623 -> 4689 bytes __pycache__/node.cpython-311.pyc | Bin 0 -> 918 bytes __pycache__/physical_agent.cpython-311.pyc | Bin 9011 -> 9086 bytes __pycache__/rescuer.cpython-311.pyc | Bin 4592 -> 4851 bytes kmeans.py | 2 +- 9 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 __pycache__/kmeans.cpython-311.pyc create mode 100644 __pycache__/node.cpython-311.pyc diff --git a/__pycache__/abstract_agent.cpython-311.pyc b/__pycache__/abstract_agent.cpython-311.pyc index f2165ea7572252e794b3c93f3689724219b0629b..0d908efe5c5eb2aedef00c9e897435bff24e3919 100644 GIT binary patch delta 257 zcmaDQJ6Vo^e83Yy*p>P%hXxFlmC{}O(X z{)u4y*_T8$KQOQZ`dY44?J}@u?t^3F& P3$&O~&~&pP_f2L1i@{nf delta 208 zcmbO%_ez#~IWI340}$x(aBbvX#v!fkViglwoLUs)l3JWyl3x%LmYH0VnH!v$8#DPa zhXrHrWEsw>QWNZND5x$-T*5KIWs2tn&l{pLGtw`Ks$LLPoqT~akNJYAHjs{(Jex~A zc0&AJpwiS8j!QBY@-N{BX_yGskbOy1^Ma`6T~)0WrW*v;SS*ZR5)YL1o9G8J4zKJ5 ZIlW7wdKX0XCQES30&UaWY{h+(82}9kOr`(; diff --git a/__pycache__/environment.cpython-311.pyc b/__pycache__/environment.cpython-311.pyc index 7e8815b26077a997a07713b494c978490a0bcd64..27eb6d49eccb89cec5e9df6bbd51e62815632a51 100644 GIT binary patch delta 317 zcmdnHmhs10M(*Xjyj%=GpthZTBlkCMBYXYO;?$yI{fyMSqRhh5)S|@P#GH(LeV6?5 zyqx^Rlw$p$)PnqC{jkjBlFZ!T%v}A=GCa%J7;kSrEX2gZ`hkI&Q+V6=>+JZnXBZTV>GJ#iVbG(iVCu7UxC8i630*rzxlReDzSwAue z3TjQRGW)9t64Sb&syV^$=La?h0g;}H8SGd16&4s?;#UEgrMG#Cxh${r1~vwU28OSE v3_ScD<()P?HZv42aZ7(>kmJd}7-x6YCVZOj^IQgNN4T#>XES}B6s4}@YGGE|Vnry41Fj-AUkokh33Xts$6w}?@tK-7SSTp&O z=|Z4doyiqu`pg%F4JWTL`wKMEaPm5HaiB7l&8N&|c_r7eF)%bReC1={;qNH#wCS;# gp?HZ~`XaaVW+vAVUdBh8!-GsfHfe937@W=w0G~=sIRF3v diff --git a/__pycache__/explorer.cpython-311.pyc b/__pycache__/explorer.cpython-311.pyc index b15e228c32c2384e4639e6d679481928ac695109..228ef400d40c52581978eeb11fa8b51fc694d39c 100644 GIT binary patch literal 17319 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 delta 5129 zcmb_gdu*H4760z%NBoHMIkA)2ZS2^I^KhG(q?qPGT9P)j14?O{v;`J$o!Ci}G>=|8 zeFU3yQW5S#L1HI#6T)%!sJUHm z=fO+N!9Iic*gKwp7!iE3I4ubm5-vOu z3i}3!j|P2R{_X*AE8EtWwKjI{3k7*+YcMnr9vw5F5@Q5E(T z8GSXf>WI~$h^Ql~3kuv1{9SlL&Hodnbrs5=6Qvp+tF>EXedyigw1?3wv?iOZDIi;x z%(0BEGc$v{iGM0Lu^bX_Sxr1EY)?5N2>r%Xdq7slU(0Y!n9d~@=V~lBcUhRuleOZu zuGd5~0dYV@oP2;hO0iFyhzUG8DG=30FdX~MsVNl8PqoJ|3cE#L=3GH)4&~A@+KaK< zZ%NG@WxOJ@KW!ytwL<@@Ya`lT#nSj@LO_X!Lj~*A<2gGxZNv=<{tov#cv0=LaN>lt9cZI_K z?!&PSD_ z27gt%vL434kX?lQEcZT*_O5xgU^FMB(s@B)sGhTzT(fVQwQriSdlPnVOh0FHUbEHD z+Unn3KV!Q$VY@e`o2#gbDHBH5byMLrQ{}9w^5VJ~lQ&`V#8@;g@5RTJDXde)bL0njqu$Fp=^ZoUO61iT-LN5 zN5^vRJw9@Hm(q{saGgDCAagFaF{8 zBP7)$ejXeO^A_r8c<^YDhk^mOLVl0@K^j$#_``=nlq}GY1^xT5GiFNb?;7np9Pp9Y zTTo+cM}5xCR``iA#GH_uYiAay$+e*S_vLQr`2{Ww)ghb|=JZmGovn)nrfMg9XZ5zY z-Zt%;KJseC#f~?eR}RdUc;hABIaA@})_AsaPBNW+GOn?4I_%x)RE`}wlVshOlXy;_ z)}0r^On^5V@}WVWv#C{xiI1J`#3K-8XLP+nR1C|f8RhYr(DkqYJEg(HmS%)$Q?aTl zB2FtP3y7z6@T)?TLKjd#BF|mCe6jM|7CTPsGLtg)GE#CtF{Xn*J>B@ZdsOEhPL2tkbSEghR#gvOZ67ojm#=~QL*k~Cl=h)Jp4Sb3TUV1ujm#gJ``O!b>OVp{9wH!X$je-a6s^G; z{cmW|Xlf<-(E?S)W?b!ngT?AK=>C`%AIoHTVhyW4S+R=rHm+f1JY(e>cbH+e_#p>{ z4Ie_dB)CPsi+TqULR2$QwuctS7M6r@N8Nr(yl!<;8yp%P403-s$f?ZX2MFW~rI%Vg zB&A;{16W^DHx%saJ=8Tk%0ry)_@s7dI1uy&{9%8R9Z#|oV0BhHIL?Ih2#)l#c+}cS7ohHrJg{<5Jz0>;J89t#;jBu1#Tk(GIV; zc9zOlDZS~`lZ6fWDxJqh=0}WF5W=sNb|Fl&iw|C!BGl>&pt)LW66M^M=8E9A2sD@3 zjbUv{T%a!*6)jjksFqnitTyF~n9~%yJ9fCUl39K#Lh4WOD5;d6g%1VvLEL?V3I(?c%et-*&&4*+BQO!rCkm!& zsvtw8jE-65rqb;uGP52BFuskZSnK3NGe#HIw6BFOdarDmsc1-4G|U(q-fc}Z?TNST zooU)TW853x|7c?W!CB+MxWFVxlC=Ofd+)7Rh$R@zPYrhfVAF& zlP87idP6MtOx;9Xj8CXYM}D+l9=Jj^TfAkJ~sIogfU~fCR}`d zHU@vGD_yJzOX?r6(H+EpNHB@8)SxOjQ(q=J7`$2U!6n!0ciNmNktLMvcRj&0n>Pa6NZ zZGkMQ80;J3F|s(lv5WD?(;J&q9ra@^zAXCMK;7hG8)0KpC$nFjX!@9qHzUsuPF~4b z_Xb7O4GJLs9JSO0bP7B8lZYujR4?;W1WzF>)3O1F#`11%{Al>lFz*`+){=jBAW)^9 z9b;!UPi!8K`KLCW>y7o!NtUVHvyrJIvyvk&IpzwBVxwuPwF=dq>xuQ;j%kU|_^tFU zkyBIX8 zTmNpYoLZ11@E#_s~{{p#(wD|x4 diff --git a/__pycache__/kmeans.cpython-311.pyc b/__pycache__/kmeans.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0b15f8e5b1ffc6795e1e2c1f9bc12d31473cd9a GIT binary patch literal 5853 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 literal 0 HcmV?d00001 diff --git a/__pycache__/map.cpython-311.pyc b/__pycache__/map.cpython-311.pyc index cb042222574519cc2256496ee5265ca10b527e42..b5accb1360d56b98a0bae054f279f188c12d0e42 100644 GIT binary patch delta 363 zcmeBIxv0XooR^o20SJOVbERJ7-pIFt$;ezkv^ce>SU)2*uPC#yG_@!(H!&w8U*9Fa zJTE6dF{M~PD77HJSU)T?xg;|;I5Ss&^F<~HX2v&@h1hJ=KQORxYMo#MQ#V8fil{+{+YNrv4-8DaT9fnHY{Zb&e&Ax@5dsOQZQjM^&RE|MbW{Vw4Q{~+ z!Ckf=7z8l$HS!7MXPQA;`*HO|_bCFx- V3b)Jx#!K9a9~eNoRRvx#0swuQ<7f&4wQ)_<@UoN2tSY^F20q#`-Vhd>V0?pDctS~6Tu0muVettjAYO4-Y)32=1AaA diff --git a/__pycache__/node.cpython-311.pyc b/__pycache__/node.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb8967df3961d4160ace15743ce30ef84a2c01c6 GIT binary patch literal 918 zcmZ`%J8#oa6h7CFkY_1UTOO)JR3>+*SB9t(sEC1LBqA8HTv@(GaY^j-UPp+?Lxv0; z7?Hxj3{>y~82AyCDe{EG#1<5$PMl-Mg-YdI`8)5Y{Jzns0@6XN?qAgaevnd-u@n|f z6sDlTeGo7K!QNryNBnZ?fY91t>0V(VUU(Oqs7%3!4inJPgemk1>*&ImK*taa^Gd1V zM8bD|QkrKHE{SUB_$_u3rjW1%_|gTCXsEG5O?1?Xo{$)*QD#O0+HlMq%ScTXyRn~^ z2CnqOI5oUT#c8GM4`ra@z_ZNMP=4>3yo7nOOi&@93n?0`NpyPKexiJ-?5-cm;Be?m zx9|44k-Zna2z!w$l>OKrM9O{|cyZ8g2Yoxl{dNW~(=z8l7{r{98np6Gq0*>o3tDJqnlUFj|gcqKSMo)gMv7aE}{VgLBp zdEfIar46!#f~Ec49OW9CQZtIXxHh$JHf5bmCC+=aO>MaiDReP)6JZSBSJz%w-t4_~ zPFA-+3_p!N-~00D#D4JY^8VNIzFff=OLrvwWf|c4@j#*5_c>3iocAL!?2%mO{BY>@ za*u3K{1t>_$ZBMxNV-4? literal 0 HcmV?d00001 diff --git a/__pycache__/physical_agent.cpython-311.pyc b/__pycache__/physical_agent.cpython-311.pyc index 62ff17629ad3d4d1452910bd8b64e9b5a5dcf5c0..ebbf736760480f840e817a8e9baca8357affec94 100644 GIT binary patch delta 466 zcmdn&_Ro!bIWI340}!ZfXWz&j#BAiGA6lGRRIHzonpc!rSejatn46fBk+1KPU!Iqf zpO{jtACy{h+))dea`G?wVBsJWtKb4khuEO>zRgy11AF!My|h4APr;qh0( zlP{zcUI{O{r%NIfSECfwu7K&2U{1vLs?j%m$q+s`i&; z?7@NuOivgdvIH|HHwcRYT>(@%d4{ku$UVGzoA(KKF)?~g_7qbBJJ5P_p4eR`#;VCa zlIltzuWH>DlD;COd4XH=0~-Sm{{)pO8drogE^%vsB*ivQkbKR=m_NBjh6vS?n-9or gVPy25Tq>sxwq0rSBDoEWi~*B_6?C8iO$r;C0Gn5k#sB~S delta 433 zcmez8w%Lt)IWI340}$x(aBbucVwTo+v5E;TPA!UYNiEJU$uEcr%SY29YgdJ52Ui?6En) zcE#HNLO|dZ>!3@9K^F{zHeY9#W0jO=1REm4z{58|u*`LcUMUIijd|7Zp{yD3_Sc3RHkTL5z@HCt#N@{WAjDH z*G!CAllRIHQphH|g^|%`@@_e8rjGi_XBE^Zo5*gQd|3Vlqu=B?3OdXe_~kdBRoKV` E0PI?w!2kdN diff --git a/__pycache__/rescuer.cpython-311.pyc b/__pycache__/rescuer.cpython-311.pyc index ff4acc997d8c83c334a85e593310d680a0048830..f55df78dd3fd4711e2a610fbcde06da5a32c8896 100644 GIT binary patch delta 1432 zcmZ`(-*4Mg6u#Gq9jCElckR+9O{rEa%`jt5}v7^RzF+Ni|3Rxm(Th>e;qzqn4j zQ3YBggvvAo-R-nKMo5gpp2qkGc-m`HEH$#2G?0)eFBrkY#0#A3v=x)aiT&Mkzw_Oj zd(N@#rv5w}{z{fR5ZL^t{xT$Bh;Q=svCNER5-T%jmPr2H1(Rfp*}_~o zbE14ndN0^wraAx*239w1Pykh1SswU}%nZ}VGkIWSoEZ{7* zaUwzb=!g7K;Sfx$N%|e17`lI;cWr2WXf@ChmCux`%7)+W9p0R1ifLO+H})}?80(0wAfEDD5C@43?m@UROUTum4ZTFXGvi?jn zI$}phT*L*BdGN`Z)rr-`mU3|8g595KC>a-F`B+Qsw$w~B#A@RGv2JUmqgf$J?%7#aLR=8b$ z=N~Ze8AXn^c{X?i@Sgu)o^3V-0hx&g*#hi6Hx{ck6b8@<>UyP+rKdtY_&9wt^gE8< zJttMT5L@H;D&-1M>Amo?xaYc};XXR7r25W5$hr;yrBsomUVCnXyLytP(@Ra|MczgJ zV1|C9#GYW)%CsV}_55~3+lpwLsb(Z?N7A4B9w=R_Re0`xR)&|^d*^kPj4&?(;P~Gz zmkVT!xw5Y33R%m_nT3L`Lkclqy%b*XQXoOLib0qKRsbHZz}ebAm+RuAE_w_M3p}(_ z;CnpGxN3-pp6o-MexaTS#bGyZZ%v}Vsi&WIgiA&C>GEDmFYq-Yo`_ZRZ*ja>HWmuz q^WpZ@}w)mi)i delta 1266 zcmZ`&&2JM&6rWk|E}QschhQtV5y2!RWFZc43g0w|p>V*efTAijT8zB}w|2amb<%=@ zl0#KFX)eh`YASKCgaj&_fPa8P)nnx#ONp#Ty;b7WMN}d}i1y9Iv4Rw4XMg+N?|tgc z&YNzxEAYtgZ$+?1k9w`Je?Ab#Bl8DNcS`7UlvRE}S=I79^dR&E-iB`s zVlf(FC)K#x37XTz#?)A`s>NZ`C@`6=4e*?zfxkic8I>@68fy|i1no(aNucY!DG8x_ zo_q2nOzoSdWdhUaR=pyzr~VKd3FsvgfSC*B!SeX39$ZS?PgeDV zuvbZNF|b0qUy|;MwM_bIq_0Z)*4HAPm4W5Rp<3h+kL(vPa}mNPR`t-*)!LrJRh{px z@wb*kBwi!&Dv7VV%4QUeKL1Tylcrwrp&JtAEehC_;b1oTSO38Ro>SD=;Q2=ozzcaR z&yyv=;NwpGr!laYrNfIgM%7}Pc0SEwzIJ?s9rOKzqtAQ&w&dk8b&p-Nsm>ng$8d=K zsT(-LRMHh50-G}nFpXS-d}QwUk~Dj^e3m81kf-WBz Date: Mon, 25 Sep 2023 13:12:34 -0300 Subject: [PATCH 15/19] =?UTF-8?q?C=C3=B3digo=20atualizado=20da=20tarefa=20?= =?UTF-8?q?1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/explorer.cpython-311.pyc | Bin 17319 -> 13701 bytes __pycache__/rescuer.cpython-311.pyc | Bin 4851 -> 4954 bytes datasets/.DS_Store | Bin 6148 -> 6148 bytes datasets/data_teste_sala/env_size.txt | 6 + datasets/data_teste_sala/env_victims.txt | 132 +++ datasets/data_teste_sala/env_walls.txt | 856 +++++++++++++++++++ datasets/data_teste_sala/explorer_config.txt | 8 + datasets/data_teste_sala/rescuer_config.txt | 8 + datasets/data_teste_sala/sinais_vitais.txt | 132 +++ explorer.py | 83 +- main.py | 16 +- rescuer.py | 4 +- 12 files changed, 1190 insertions(+), 55 deletions(-) create mode 100644 datasets/data_teste_sala/env_size.txt create mode 100644 datasets/data_teste_sala/env_victims.txt create mode 100644 datasets/data_teste_sala/env_walls.txt create mode 100644 datasets/data_teste_sala/explorer_config.txt create mode 100644 datasets/data_teste_sala/rescuer_config.txt create mode 100644 datasets/data_teste_sala/sinais_vitais.txt diff --git a/__pycache__/explorer.cpython-311.pyc b/__pycache__/explorer.cpython-311.pyc index 228ef400d40c52581978eeb11fa8b51fc694d39c..d4a3251919998981b92119c33a887e8eeb6f3b58 100644 GIT binary patch delta 3641 zcmcIndrVu`89(Rx+Sp()4mM!ZI1nDeylv|6h)D=Bv`sR!C`q>_TZ!S`fqCa#lK}-e zT2+mvY=s`AGBw?hrnQhw6Dgb2XF@PBm>&rA_<3d%?w& zu)lUJ|9l?b`5xzcoa1-DOJ5ntdN(sOoj@zPZcpDm!- z_m^|2kWTsU=pTX+GDW&Fa0fO?fRR=26A~@h?GZ91zC#K5DSY(?bXoj8;WKLEKQXX$ z%TRc|HM>6%egJ>DlOzK z^)5QgV`;C7)5a+yH=C;sCg$di=73u@Fjx_WLEq5=->#GSxs1phS@139{>X% z-zE>&ev=ud=5mtln29pYM1IEhJ*fd`yhha&9vzj3CDsT-)ifGr@^F+@;=s)0TQXB* z$!lPEU>a9d91TbN6a$Pw30;G8Fqq6qYS29v8I-z^>>97jz6|CSopkZHv-{Im44q6s zP62MWd#Ib&+4JEfp0iibZXUIVfONIiwI-InZYadFyyA7LV)uwNq1t--;g+J9VWgd5 z(uOjanaobwAnV83xAuwm14;|mRw{!+OjD`DYhxHy>}J02udLFjG#RpDlOxGtgRKNNWZ{+8M)k7_d+$D zqL^p>7|>dqG{PZ359ZQ#rgq0>e#%$LAC);9BtvQfQpo7bL=rDUG<9D2o917H4sSZk zhhJ8YkjFpt75Oo)*z*W|2-ygu0A4}28e?6-&AXvh!mIrr(>pjl$1nMFkGMVC?!cxy zuqypxc*EVkj!MOu%>C55InN57~7@rtSQ&3xp)vXfRxr>16A5C8OJG5wI+8#-a@xoC|eD(^$%K)iD!~9NTDc#_!jkU1jVdFDL@wB{@4N+Aw91$N<(F!a}M0U4*xmddjARDMPQYKOj>`g47X}vZNY&Mn;&VMUiTTn%jkh3gn!gzPb;K3E|h9pEAW^TKSYu zH@giMOEG_|`B*IO_S~&qe)?xE>#nAm^KozGOlY=qv3bK<7Iz)J>)CcyZMv#9Ts2#+ zngkIu+o_Io#&}-Ac3$~rUiq?n_3B36sja+Ib7DLvZ}I6jf(atn+iBd9ztFkVyyd9b zb_6yZfz`41rPZMgM`+6tT6cuB<%XremczU4sM~bZtya7*t^3X;2_FA7uV7(f{-uSN zW}d}QA_tUC5CFJwp!~=F17Z3mfr3L_V3^({VKN<}0E*BTbKerCgaOP}!qUKvJCp=` zk-9f^m(J;sy|Mo(_&^qzTUy&M9;jhHRf$8y)7W0SQ@81?4%@tU??HkOo3=yG`pErOUaS8MO&QEwSSe?hB{atwlRzbGH`5 z3lmGe`RTo6`>DQQwsi9cE$bQH<>xmu>XG4-DG%fq`@f4lT*0cn2lHf7TaNZbe9-*Q zHm&lB@Q8{G!+W$_(XVZEoLAH@>*T$q8gGT+@u^^W$GcB2WM{Z3SR(w3@T%Z-xS3~y zf1=h3py*(DrLb{+MmgzY3vL_7yoUm^H~pc zwF|aYw+W)2Fa&(LC?SYDcwp~-5`xoMo*)N64S(uvflV~#LP6dIEAKd4RckFZIuaxa zoz!V`A&VWT$uv3>BncjV|Lg@%x)CaC67ucHAqizXtId~DxT~kv&d;|6uVQ^=c+sFM zdl)|W7{2gWD+2yoVE80vuOVng-o;)a0=_IhHwTACq_IKyG`j~wEDXvf|4ZBVFUCp6 ZZS9i~J46ba9E>y5kF=G4JYiiE^*aaT$2OlmAECP$Nd?}*QD50WA5+Q&isUdN@S$R)HJ{Ip=3?WO_ zWK6SKrs7CV_Oe{`Dmj}~KV(@Z<Ul=m@UbofyxwiNA(3+$9|@! zY^P>2!3dqCe)dS?p7@q_l$)>+o4!n~rI}37 zZ|5Z~cEkdmKhakuRO0A8Y(`(c-jI5J;M~AS$(8wi|DC%N~Dq~IMfscM4!f54X#td9e@=m)N5F?(LxTh z4&x!i%DDx+ z1ra!byc1)o-l%5)MO4Mwu%MRhS|zA6IrgB?;_pNc#(k5!Ou&g$2;3oVOw;&h*{vzQ z4O+*D>@UaEvdfL=q`sqF9g;VqZS#1jFze?|E3R@k^dBgRI_h@n?mh16?D4$T!PdI#Y z@e-vk!w7l=!3hv6Fh57vC^1@n66RQ?zzQeH&7#SJH%gZim|v0G3KBa7)aDh=S-CcW z#p)YOB$rsR`R5O@1#;Vlnz(}89z$#r5P$drKvd71L9^d^XZ=cwcH4BLE4XQ2D8DwG zUptjr8#Ke91ghJjEFh zP+P45`Ioey$Iyh=kj10R@+q^qgxdSp=4WC4HFLY7+WX~5c+KwOb!1dnGq>@~!eJLJ zz*)?Bvy7EP?-loUMQ-Dn_0#gNJ5Ffz8_4LB;5MFF|19^wExg6;Ed&lvlG}J@{fiGz zT0OWtw-~{s!r#Mc0K8WCIHy%{-t#9Igbp!5|1lMO$875{)dkg17K9~g`JUsaXc_bs zfHBUYl7j)-0ACVD3bS{muac@THfZy7_f`*-t|AVI_I?*{g@;p5rL39ajuRD?mZGLQ|QY2Zf zR$`w>%IqNO>gYMnqxG&aZ_1c=W&5b< zhdW2zA6AX0kDt70ncQ}(I+%YTWULPx>x0Jn)lRr*z8A+UuD>)%#*QpGpEKx>9=t6_ z;1CX(onb(OGi-3;3Y*FFq6z00SaTzL(tGR8V18rB*c3K41&vK>U!?#4!u34U{wKwC zO#HGIN&4lzUQU#cIq7n9-ser{8_qS1SVO!$%-e&!J=DV6XA(G5YCt=knK#2}5;w~b zcz)Wp>1-3I^T}bybXN9=dt_svep+!MhhGIh5z2Olv)zFgrt``J`-e+Hye-Jv?iAOfi`$zf*dUPZXJ!Gfe%gEXtNuZ+C*X50IO2SOKul&4Q-t+uSZ_X#Ke!Yv?MDo7Q~Z9PFdYyQ`wtYP`6Gs zNZ13dh1HcASyoPKr^*M3$`hE{l1rxsf9MXcLHS06RHo`Z?)!0xtOb44v9m1M+r)yz zQcgIZN`N%z3FJ~P1F*>1j0l{|vvu%;6S5C;N?3J0;l)Z5W5;;Vf6$){l*~^N`-|}vQ?C(iFYV~@Ml@o7hgUv& z=(n-$JiuJCu?#CP?>V0+#F_%uX|pB#8tebW&f7BbGOTwqil;J)Lm8#vjM6~zwAFUk zx_!#JeY`Vd-5a*rj~h4Tx@-`JP=jWGJzf`*+}p!b-HnsAUAVI#m?5*)vW0b)#c)&w81-xS#8 z1qeBqLZ&}J_z++rK|ecbFC_nBm+hOO_wD2~_TM5cyKgVgkwr#mDvn!B^E4|dw3Gj^ z=EB14ILksikuB>q$1W6>ks|hs!UjKHh2`rouEwE>VJI5%#F5E|t}&+F*9%dMIG=}s z^bsdv=mwc{-Z<1W((=ADm|QZx?Phf_xdu+t#9D$4jd%GxW-D5s7UcKAGo!`^r5Td! zW2KMwDr<_UyE}RyqkmLVlpS>dR=RM%BHB}K@QD&~iLOX-LeH?z%Iqo)VY>2Hz)!Z7 z|CaEmTXnP1CfmIwrM}3;R&wJcMI|jrgGI43kYv74l z%GT}vO*py&0smux)*u{4kc}B#Ikh7cAY4K~FD)w!mEHGg{6rzsXAqETB*o=w>vBs{ zo7mOmaybaifm&JLlmL*TCz4?^Izs6=*aQgh=Kjs7(zHc0+!9dAX0~P-)Y{!(+H;V^ ztd*svq>bA287>OVggslCYcOGD6gINH%6hX(iyIe%diICPieywlc}Wf+uw%|89 zc-+i3iY}aD@{HmwLjL~|ibtQq3T}!Veak!fmA&W2_uk#f)bE86x1+eF-`u! zC^q>AqW~X}1D9IBGWjEi2ww@))>SFj~8GOA3z$sWw8w^^5?lsQQas7;fp2tN4 zZobc!z{sdH*?}XNQD^fMj#B0%6`-spQxS*)6EHRtLj2`_AOMPkgo<<_;vfnv02Bwa zk;OrV`2i((L5kESXY&{{T5X=s^O2d+XYxdW(_%^>acvMG1|)8=B<1Jl6j@I$5{%_% rW7Yq_04D?{-xEB_=rMVTP^n`WBcsR%2JB=B!ku~2NHo+2a5#(>?7iyfGm7+E&+FiA7Y^E0F{Br=o$aXgSrWhe%d z@jyC}A%`JxvH{a^LTWZkFyCg}%+A5j0kmhcA@g_U$^0UY9E=PMObkGB)qu~2NHo+2aD#(>?7lMO^zHuJMcFmASHJHxoKL4 bool: def calc_best_return_route(self, graphed_map): init_pos, init_neighbours = list(graphed_map.items())[-1] base_pos = (0, 0) - return self.astar(graphed_map, init_pos, base_pos) + result = self.astar(graphed_map, init_pos, base_pos) + return result def astar(self, graph, start, goal): + open_list = [] # Lista de nós a serem avaliados closed_set = set() # Conjunto de nós já avaliados heur = self.get_heuristic_estimate(start[0], start[1]) @@ -80,7 +84,6 @@ def astar(self, graph, start, goal): if not any(neighbor_node.state == node.state and neighbor_node.cost >= node.cost for node in open_list): heapq.heappush(open_list, neighbor_node) - # Se não encontramos um caminho, retornamos None return None @@ -97,45 +100,6 @@ def movement_cost(self, pos1, pos2): return self.COST_DIAG return self.COST_LINE - def graph_known_map(self): - - map_copy = [] - - for c in self.known_map: - x = c[0] - y = c[1] - map_copy.append([x, y]) - - for i, coord in enumerate(map_copy): - neighbours = [] - if any(sublist[:2] == list([coord[0] - 1, coord[1]]) for sublist in map_copy): - neighbours.append([coord[0] - 1, coord[1], self.COST_LINE]) - if any(sublist[:2] == list([coord[0], coord[1] - 1]) for sublist in map_copy): - neighbours.append([coord[0], coord[1] - 1, self.COST_LINE]) - if any(sublist[:2] == list([coord[0] - 1, coord[1] - 1]) for sublist in map_copy): - neighbours.append([coord[0] - 1, coord[1] - 1, self.COST_DIAG]) - if any(sublist[:2] == list([coord[0] + 1, coord[1]]) for sublist in map_copy): - neighbours.append([coord[0] + 1, coord[1], self.COST_LINE]) - if any(sublist[:2] == list([coord[0], coord[1] + 1]) for sublist in map_copy): - neighbours.append([coord[0], coord[1] + 1, self.COST_LINE]) - if any(sublist[:2] == list([coord[0] + 1, coord[1] + 1]) for sublist in map_copy): - neighbours.append([coord[0] + 1, coord[1] + 1, self.COST_DIAG]) - if any(sublist[:2] == list([coord[0] - 1, coord[1] + 1]) for sublist in map_copy): - neighbours.append([coord[0] - 1, coord[1] + 1, self.COST_DIAG]) - if any(sublist[:2] == list([coord[0] + 1, coord[1] - 1]) for sublist in map_copy): - neighbours.append([coord[0] + 1, coord[1] - 1, self.COST_DIAG]) - - coord.append(neighbours) - - # Transforma para formato em dicionario - graph = {} - for node_data in map_copy: - x, y, neighbors = node_data - node_coords = (x, y) - neighbor_info = [((neighbor[0], neighbor[1]), neighbor[2]) for neighbor in neighbors] - graph[node_coords] = neighbor_info - - return graph def explore(self): # Check the neighborhood obstacles @@ -203,14 +167,10 @@ def time_to_get_back(self): if self.returning_to_base: return True - - graphed_map = self.graph_known_map() - self.best_route = self.calc_best_return_route(graphed_map) + + self.best_route = self.calc_best_return_route(self.map_graph) cost = self.calculate_cost_to_base(list(self.best_route)) - if(cost > self.rtime): - print(f"cost -> {cost}") - print(f"rtime -> {self.rtime}") - exit() + if(cost + 2*self.COST_DIAG + self.COST_READ >= self.rtime): self.returning_to_base = True self.best_route.pop(0) @@ -256,6 +216,33 @@ def update_number_of_moves(self): def update_known_map(self): if [self.horizontal, self.vertical] not in self.known_map: self.known_map.append([self.horizontal, self.vertical]) + discovered = (self.horizontal, self.vertical) + self.map_graph[discovered] = [] + for coord in self.map_graph.keys(): + cost = self.is_neighbour(discovered, coord) + if cost != None: + self.map_graph[discovered].append([coord, cost]) + self.map_graph[coord].append([discovered, cost]) + end_time = time.time() + + def is_neighbour(self, coord1, coord2): + if (coord1[0] - 1, coord1[1]) == coord2: + return self.COST_LINE + if (coord1[0], coord1[1] - 1) == coord2: + return self.COST_LINE + if (coord1[0] - 1, coord1[1] - 1) == coord2: + return self.COST_DIAG + if (coord1[0] + 1, coord1[1]) == coord2: + return self.COST_LINE + if (coord1[0], coord1[1] + 1) == coord2: + return self.COST_LINE + if (coord1[0] + 1, coord1[1] + 1) == coord2: + return self.COST_DIAG + if (coord1[0] + 1, coord1[1] - 1) == coord2: + return self.COST_DIAG + if (coord1[0] - 1, coord1[1] + 1) == coord2: + return self.COST_DIAG + return None def get_heuristic_estimate(self, dx, dy): # Estima o gasto necessário para voltar para a base a partir da coord atual diff --git a/main.py b/main.py index 6eedff1..a4553f3 100755 --- a/main.py +++ b/main.py @@ -28,11 +28,15 @@ def main(data_folder_name): # Explorer needs to know rescuer to send the map # that's why rescuer is instatiated before - lista = ['E', 'N', 'NW', 'SW', 'NE', 'SE', 'W', 'S'] - exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) - exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) - exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) - exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) + # lista = ['E', 'N', 'NW', 'SW', 'NE', 'SE', 'W', 'S'] + # exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) + # exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) + # exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) + # exp = Explorer(env, explorer_file, [resc], random.sample(lista, len(lista))) + exp = Explorer(env, explorer_file, [resc], ['E', 'N', 'S', 'W', 'NE', 'NW', 'SW', 'SE']) + exp = Explorer(env, explorer_file, [resc], ['N', 'W', 'E', 'S', 'NW', 'NE', 'SE', 'SW']) + exp = Explorer(env, explorer_file, [resc], ['W', 'S', 'N', 'E', 'SW', 'SE', 'NE', 'NW']) + exp = Explorer(env, explorer_file, [resc], ['S', 'E', 'W', 'N', 'SE', 'NE', 'NW', 'SW']) # Run the environment simulator env.run() @@ -45,6 +49,6 @@ def main(data_folder_name): if len(sys.argv) > 1: data_folder_name = sys.argv[1] else: - data_folder_name = os.path.join("datasets", "data_20x20_42vic") + data_folder_name = os.path.join("datasets", "data_teste_sala") main(data_folder_name) diff --git a/rescuer.py b/rescuer.py index 3669cb2..3927477 100644 --- a/rescuer.py +++ b/rescuer.py @@ -37,6 +37,8 @@ def go_save_victims(self): """ The explorer sends the map containing the walls and victims' location. The rescuer becomes ACTIVE. From now, the deliberate method is called by the environment""" + print(len(self.known_victims)) + #exit() self.body.set_state(PhysAgent.ACTIVE) cluster = KMeans() cluster.execute(self.known_victims, 4) @@ -50,7 +52,7 @@ def merge_maps(self, path, victims): for i, victim in enumerate(victims): if victim not in self.known_victims: self.known_victims.append(victim) - + if self.received_maps == 4: self.go_save_victims() #self.go_save_victims() From 71215c305b92005790448b2a7c2c57d09990754e Mon Sep 17 00:00:00 2001 From: henriqueramalho1 Date: Mon, 6 Nov 2023 19:32:14 -0300 Subject: [PATCH 16/19] Initial files from genetic algorithm --- genetic.py | 9 +++++++++ rescue_route.py | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 genetic.py create mode 100644 rescue_route.py diff --git a/genetic.py b/genetic.py new file mode 100644 index 0000000..b7016c1 --- /dev/null +++ b/genetic.py @@ -0,0 +1,9 @@ +import math + +class Genetic: + + def __init__(self): + pass + + def fitness(self, individual): + pass \ No newline at end of file diff --git a/rescue_route.py b/rescue_route.py new file mode 100644 index 0000000..50304b2 --- /dev/null +++ b/rescue_route.py @@ -0,0 +1,26 @@ +import math + +class RescueRoute: + + def __init__(self): + self.victim_sequence = [] + + def fitness(self): + pass + + def add_victim(self, victim): + self.victim_sequence(victim) + + def total_distance(self): + + distance = 0 + + for i in range(len(self.victim_sequence) - 1): + distance += self.distance_between_victims(self.victim_sequence[i], self.victim_sequence[i + 1]) + + return distance + + + def distance_between_victims(self, v1, v2): + #A* para encontrar a melhor rota entre duas vítimas + pass \ No newline at end of file From 7f5776b3318ca25e440b18b6158063d1d3cbc687 Mon Sep 17 00:00:00 2001 From: pedro-cfg Date: Tue, 7 Nov 2023 04:31:34 -0300 Subject: [PATCH 17/19] Inferencia Fuzzy e Wang-Mendel --- __pycache__/abstract_agent.cpython-311.pyc | Bin 3859 -> 3849 bytes __pycache__/environment.cpython-311.pyc | Bin 22264 -> 22969 bytes __pycache__/explorer.cpython-311.pyc | Bin 13701 -> 13583 bytes __pycache__/fuzzy.cpython-311.pyc | Bin 0 -> 12447 bytes __pycache__/kmeans.cpython-311.pyc | Bin 5853 -> 5842 bytes __pycache__/map.cpython-311.pyc | Bin 4689 -> 4654 bytes __pycache__/node.cpython-311.pyc | Bin 918 -> 926 bytes __pycache__/physical_agent.cpython-311.pyc | Bin 9086 -> 9042 bytes __pycache__/rescuer.cpython-311.pyc | Bin 4954 -> 4948 bytes datasets/data_20x20_42vic/env_size.txt | 2 +- environment.py | 15 +- fuzzy.py | 187 +++++++++++++++++++++ main.py | 1 - results.txt | 125 ++++++++++++++ 14 files changed, 325 insertions(+), 5 deletions(-) create mode 100644 __pycache__/fuzzy.cpython-311.pyc create mode 100644 fuzzy.py create mode 100644 results.txt diff --git a/__pycache__/abstract_agent.cpython-311.pyc b/__pycache__/abstract_agent.cpython-311.pyc index 0d908efe5c5eb2aedef00c9e897435bff24e3919..e072b81e07d71486c8f588dfeaed775591ab6cd6 100644 GIT binary patch delta 228 zcmbO%*D1%noR^o20SGKa*fw%6$kxPtg287EB=E?w#Vg|AVxMhJXMnTif2HZE90m6huFaQ7m diff --git a/__pycache__/environment.cpython-311.pyc b/__pycache__/environment.cpython-311.pyc index 27eb6d49eccb89cec5e9df6bbd51e62815632a51..78506f78470d48eb4e8ff78269c85c4854165e92 100644 GIT binary patch delta 3316 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 Nzr_*1dA?x*GXQgG3HAU0 diff --git a/__pycache__/fuzzy.cpython-311.pyc b/__pycache__/fuzzy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b87d4b82f036e157399bebe7c8015335722a6b4 GIT binary patch literal 12447 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 literal 0 HcmV?d00001 diff --git a/__pycache__/kmeans.cpython-311.pyc b/__pycache__/kmeans.cpython-311.pyc index b0b15f8e5b1ffc6795e1e2c1f9bc12d31473cd9a..5ee5f0ac9e139486c68569da94c7c0d34b36f341 100644 GIT binary patch delta 192 zcmcbsdr6mjIWI340}$92dv4?wWYl-k&&bbB)h|d*DazM($xklLP0cGQ)(lf`(CF<%h3nf#Df94PFt`7iHPCPvoDmjyzAT=mHXg0k4?&65O|Gm16<9oN9{ Yl$)=kw9~4`YKCB!eTV(#K;a%{0Kh^%+5i9m delta 221 zcmcbldsmlxIWI340}!0F;n~P7$f$0mA6lGRRIHzonpc!rSejatn46fBk+1KPU!Iqf zpO{jtACy{Kmk#M8=AH=_-^RwUy#uL@qvv&ME!!6!zEz{pl(6E&3}2XGBNT_zAO*|GEPu) svX-DMZr0{5!R3q+%|K^2Fg)ev>nQEC>am(3*kupY%PFzhO}K{{0M>Lu%>V!Z diff --git a/__pycache__/map.cpython-311.pyc b/__pycache__/map.cpython-311.pyc index b5accb1360d56b98a0bae054f279f188c12d0e42..681204f9051a9b4a2dd099ab17023f76b7aaaeca 100644 GIT binary patch delta 309 zcmcbpvQC9-IWI340}xmlZ{%9Tq;IdEk)NBYUyzzol&|lSpIn-onpaY+A5fH^UX+-d zn4Fle@0nMUnvO}`x+Q-a0^Zd?y~K$y&)_%!T1KR@Pv}CxQ@6R!r~K5K)m9v z*p65#$~^!&z^zD;fnoC=j@L|#zbCKYHetTNZ8rHKcQVkuI-5Ot7+Iu^z;3(C&DT-V aQ*)79<_fpW0>(?+iWj&QH>V4{VgvvSPi%t# delta 348 zcmZ3da#4kAIWI340}up#-pI9vN!?sOv^ce>SU)2*uPC#yG_@!(H!&w8U*9FaJTE6d zF{M~PD77HJc=J;xZ)V0flMUHy)ITt=aB7`k15-CdC8xw*7uCBYs&`S;;EJe0huaN) z(GLtvyjqj{*lfg*)qdb&;1L1|sBON<=FV8(4|GKX!wqi13Bg^q9~cBVg>MLpO)$Q} zD?Fj3EA9gWKS)4)f(b~VxGVMp124J?Zgdr#=qlLJRj|TUa6zqM<`mvMk>e*5AwIWI340}y1{@NDGPWK_4%4=qkDD%Q_P%`3_*EKMy+%uUS6$k%ttFVD-# TPfRJ+4@xb_FW#KYXw3uwPnHxb diff --git a/__pycache__/physical_agent.cpython-311.pyc b/__pycache__/physical_agent.cpython-311.pyc index ebbf736760480f840e817a8e9baca8357affec94..acdf4f51ea081dddde31eee6d60362e909ef9b60 100644 GIT binary patch delta 453 zcmez8cFB!q;wzCQmjX&I z1e8p^Ags)MLC|RP58*B*MvuwOVoJ;xxb-)$61&U9SUR~wQeC#g?yivZ6(P+F+?pTQ z7xQ^3nQb?_kUJ`n~Uz6pX|<{ucCIrSzK%?O-S4rWdk;57#;*P86ft7i9s zfsIpThUx;9B^pa~R@7WkvbiK>0~S2MdP49J7npgX^g?*_mGJm0;mH?L3a^A0UGgsi zOH5wOYsm~WVDm#>S60TmlhuWzRe`qf>dkOn5V9m@><_9(g9{vd`Q#7s!XsSDpOK%Ns$YxlA4p5o|>1OnYj5J^C=d__Q^9j9GNfh>rcMVp{#s?Tj>Umz;zylOFRk} zd6cg3C|!V|56lcaAo|&FE r7Bnz?5MbaD=&_u^)MXEnlbF0pzzL{@g;Rg>djTo1G5VXi1wEMni6boF diff --git a/datasets/data_20x20_42vic/env_size.txt b/datasets/data_20x20_42vic/env_size.txt index 17a7317..55312f8 100644 --- a/datasets/data_20x20_42vic/env_size.txt +++ b/datasets/data_20x20_42vic/env_size.txt @@ -3,4 +3,4 @@ GRID_WIDTH 20 GRID_HEIGHT 20 WINDOW_WIDTH 400 WINDOW_HEIGHT 400 -DELAY 0.1 \ No newline at end of file +DELAY 0.01 \ No newline at end of file diff --git a/environment.py b/environment.py index 7a30200..c733b43 100644 --- a/environment.py +++ b/environment.py @@ -9,6 +9,7 @@ import time from abstract_agent import AbstractAgent from physical_agent import PhysAgent +from fuzzy import Fuzzy ## Class Environment @@ -47,6 +48,8 @@ def __init__(self, data_folder): self.found = [[]] # positional: Physical agents that found each victim [[ag1] [ag2, ag3], ...] ag1 found vict 0, ag2 and 3, vict 1, ... self.saved = [[]] # positional: Physical agents that saved each victim + self.fuz = Fuzzy() #Cria objeto fuzzy + # Read the environment config file self.__read_config() # print(self.dic) @@ -104,6 +107,15 @@ def __init__(self, data_folder): if self.nb_of_victims < len(self.signals): print("from env: nb of victims of env_victims.txt less than vital signals") print("from env: Assuming nb of victims of env_victims.txt") + + victims = [[var[3], var[4], var[5]] for var in self.signals] #Cria vetor de vitimas contendo variaveis pressao, batimentos e respiração + out = self.fuz.defuzzyfy(victims) #Saida do fuzzy + + real_gravity = [] #Vetor com grupos originais, para comparação + for vic in self.signals: + real_gravity.append(vic[7]) + + self.fuz.measurement(out,real_gravity) #Realiza as contas entre o vetor inferido e o original # Set up found and saved victims' lists self.found = [[] for v in range(self.nb_of_victims)] @@ -343,6 +355,3 @@ def print_results(self): saved = body.get_saved_victims() self.__print_victims(saved, "saved","s") - - - diff --git a/fuzzy.py b/fuzzy.py new file mode 100644 index 0000000..17aa7bf --- /dev/null +++ b/fuzzy.py @@ -0,0 +1,187 @@ +from enum import Enum +from collections import defaultdict +import os +import csv + +class Fuzzy: + def __init__(self): + self.rules = {} #Mapa das regras inferidas pelo Wang-Mendel + self.dic = defaultdict(int) #Dicionario, conta quantas vezes uma regra aparece - 2 passo do wang mendel + self.wang_mendel("datasets/data_800vic/sinais_vitais_com_label.txt") #Treina com varios arquivos + self.wang_mendel("datasets/data_12x12_10vic/sinais_vitais.txt") + self.wang_mendel("datasets/data_20x20_42vic/sinais_vitais.txt") + self.wang_mendel("datasets/data_teste_sala/sinais_vitais.txt") + #self.teste_800vit() + + def fuzzyfy(self,max,var): #Divide cada variavel em 17 grupos - fuzzy triangular + fuz_vec = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #Cada posicao indica o valor fuzzy + if(var < max/8): + fuz_vec[0] = -(1600/max) * var + 100 + fuz_vec[1] = (1600/max) * var + elif(var >= max/16 and var < max/8): + fuz_vec[1] = -(1600/max) * var + 200 + fuz_vec[2] = (1600/max) * var - 100 + elif(var >= max/8 and var < max*3/16): + fuz_vec[2] = -(1600/max) * var + 300 + fuz_vec[3] = (1600/max) * var - 200 + elif(var >= max*3/16 and var < max/4): + fuz_vec[3] = -(1600/max) * var + 400 + fuz_vec[4] = (1600/max) * var - 300 + elif(var >= max/4 and var < max*5/16): + fuz_vec[4] = -(1600/max) * var + 500 + fuz_vec[5] = (1600/max) * var - 400 + elif(var >= max*5/16 and var < max*3/8): + fuz_vec[5] = -(1600/max) * var + 600 + fuz_vec[6] = (1600/max) * var - 500 + elif(var >= max*3/8 and var < max*7/16): + fuz_vec[6] = -(1600/max) * var + 700 + fuz_vec[7] = (1600/max) * var - 600 + elif(var >= max*7/16 and var < max/2): + fuz_vec[7] = -(1600/max) * var + 800 + fuz_vec[8] = (1600/max) * var - 700 + elif(var >= max/2 and var < max*9/16): + fuz_vec[8] = -(1600/max) * var + 900 + fuz_vec[9] = (1600/max) * var - 800 + elif(var >= max*9/16 and var < max*5/8): + fuz_vec[9] = -(1600/max) * var + 1000 + fuz_vec[10] = (1600/max) * var - 900 + elif(var >= max*5/8 and var < max*11/16): + fuz_vec[10] = -(1600/max) * var + 1100 + fuz_vec[11] = (1600/max) * var - 1000 + elif(var >= max*11/16 and var < max*3/4): + fuz_vec[11] = -(1600/max) * var + 1200 + fuz_vec[12] = (1600/max) * var - 1100 + elif(var >= max*3/4 and var < max*13/16): + fuz_vec[12] = -(1600/max) * var + 1300 + fuz_vec[13] = (1600/max) * var - 1200 + elif(var >= max*13/16 and var < max*7/8): + fuz_vec[13] = -(1600/max) * var + 1400 + fuz_vec[14] = (1600/max) * var - 1300 + elif(var >= max*7/8 and var < max*15/16): + fuz_vec[14] = -(1600/max) * var + 1500 + fuz_vec[15] = (1600/max) * var - 1400 + else: + fuz_vec[15] = -(1600/max) * var + 1600 + fuz_vec[16] = (1600/max) * var - 1500 + return fuz_vec + + def wang_mendel(self, path): + rules = [] #Todas as regras geradas, mesmo as repetidas + signals = [] #Vetor das caracteristicas da vitima (pressão, batimentos, etc) + + vs_file = os.path.join(path) #Arquivo de teste + + with open(vs_file, 'r') as csvfile: + csvreader = csv.reader(csvfile) + for row in csvreader: + qp = float(row[3]) #Pressao + pf = float(row[4]) #Batimentos + rf = float(row[5]) #Respiração + lb = int(row[7]) #Grupo verdadeiro + + signals.append([qp, pf, rf, lb]) + + for vic in signals: + fuz_qPA = self.fuzzyfy(20,vic[0]+10) #Chama a fuzzyfy para as tres caracteristicas + fuz_pulse = self.fuzzyfy(200,vic[1]) + fuz_fResp = self.fuzzyfy(22,vic[2]) + rules.append([fuz_qPA.index(max(fuz_qPA)),fuz_pulse.index(max(fuz_pulse)),fuz_fResp.index(max(fuz_fResp)),vic[3]]) #cria uma regra, usando o grupo com maior valor obtido para cada variavel + + for rule in rules: + precedent = tuple(rule[:3]) #A tupla das variaveis precedentes + consequent = rule[3] #O grupo de gravidade (Verdadeiro) + + if precedent not in self.rules or self.dic[precedent] < self.dic[precedent + (consequent,)]: #Adiciona as regras unicas se for a primeira aparição, ou se a regra apareceu mais vezes + self.rules[precedent] = consequent + + self.dic[precedent + (consequent,)] += 1 + + + def defuzzyfy(self,vec): #Para um vetor de vitimas com pressao, batimentos e respiração, retorna um vetor com os grupos inferidos pelo processo fuzzy + out = [] + for vic in vec: + grav = [0,0,0,0] #Vetor que armazena a maior inferencia para cada grupo, dentre todas as regras + fuz_qPA = self.fuzzyfy(20,vic[0]+10) + fuz_pulse = self.fuzzyfy(200,vic[1]) + fuz_fResp = self.fuzzyfy(22,vic[2]) + for rule, value in self.rules.items(): #Testa todas as regras + smallest_fuzzy = min(fuz_qPA[rule[0]], fuz_pulse[rule[1]], fuz_fResp[rule[2]]) #Como é um and, pega sempre o menor valor + if smallest_fuzzy > grav[value - 1]: #Armazena se o resultado for maior que o ja existente (para o grupo) + grav[value - 1] = smallest_fuzzy + out.append(grav.index(max(grav))+1) + return out + + def measurement(self, generated, original): #Calcula as métricas + matrix = [[0 for _ in range(4)] for _ in range(4)] + + for i in range(len(original)): + matrix[original[i]-1][generated[i]-1] += 1 + + precision_1 = matrix[0][0]/sum(matrix[0]) + precision_2 = matrix[1][1]/sum(matrix[1]) + precision_3 = matrix[2][2]/sum(matrix[2]) + precision_4 = matrix[3][3]/sum(matrix[3]) + + recall_1 = matrix[0][0]/sum(line[0] for line in matrix) + recall_2 = matrix[1][1]/sum(line[1] for line in matrix) + recall_3 = matrix[2][2]/sum(line[2] for line in matrix) + recall_4 = matrix[3][3]/sum(line[3] for line in matrix) + + accuracy = (matrix[0][0] + matrix[1][1] + matrix[2][2] + matrix[3][3])/ len(original) + + f_measure_1 = 2 * precision_1 * recall_1 / (precision_1 + recall_1) + f_measure_2 = 2 * precision_2 * recall_2 / (precision_2 + recall_2) + f_measure_3 = 2 * precision_3 * recall_3 / (precision_3 + recall_3) + f_measure_4 = 2 * precision_4 * recall_4 / (precision_4 + recall_4) + + print("\n\n*****MEASUREMENT*****") + print("Inferred groups:") + print(generated) + print("Real groups:") + print(original) + print("\nConfusion Matrix:") + print(matrix[0]) + print(matrix[1]) + print(matrix[2]) + print(matrix[3]) + print("\nPrecision:") + print(f"Group 1: {precision_1:.3f}") + print(f"Group 2: {precision_2:.3f}") + print(f"Group 3: {precision_3:.3f}") + print(f"Group 4: {precision_4:.3f}") + print("\nRecall:") + print(f"Group 1: {recall_1:.3f}") + print(f"Group 2: {recall_2:.3f}") + print(f"Group 3: {recall_3:.3f}") + print(f"Group 4: {recall_4:.3f}") + print("\nF-Measure:") + print(f"Group 1: {f_measure_1:.3f}") + print(f"Group 2: {f_measure_2:.3f}") + print(f"Group 3: {f_measure_3:.3f}") + print(f"Group 4: {f_measure_4:.3f}") + print(f"\nTOTAL ACCURACY: {accuracy:.3f}\n") + + # def teste_800vit(self): + # signals = [] + + # vs_file = os.path.join("datasets/data_800vic/sinais_vitais_com_label.txt") + + # with open(vs_file, 'r') as csvfile: + # csvreader = csv.reader(csvfile) + # for row in csvreader: + # qp = float(row[3]) #Pressao + # pf = float(row[4]) #Batimentos + # rf = float(row[5]) #Respiração + # lb = int(row[7]) #Grupo verdadeiro + + # signals.append([qp, pf, rf, lb]) + + # original = [] + # saida = [] + # for x in signals: + # original.append(tuple(x[:3])) + # saida.append(x[3]) + + # teste = self.defuzzyfy(original) + + # self.measurement(teste,saida) \ No newline at end of file diff --git a/main.py b/main.py index a4553f3..0ffad15 100755 --- a/main.py +++ b/main.py @@ -14,7 +14,6 @@ def main(data_folder_name): # Set the path to config files and data files for the environment current_folder = os.path.abspath(os.getcwd()) data_folder = os.path.abspath(os.path.join(current_folder, data_folder_name)) - # Instantiate the environment env = Env(data_folder) diff --git a/results.txt b/results.txt new file mode 100644 index 0000000..587a7d9 --- /dev/null +++ b/results.txt @@ -0,0 +1,125 @@ +pygame 2.4.0 (SDL 2.28.4, Python 3.11.5) +Hello from the pygame community. https://www.pygame.org/contribute.html +from env: ag EXPLORER succesfully terminated, it is at the base +from env: ag EXPLORER succesfully terminated, it is at the base +from env: ag EXPLORER succesfully terminated, it is at the base +35 +from env: ag EXPLORER succesfully terminated, it is at the base +from env: ag RESCUER succesfully terminated, it is at the base +from env: no active or idle agent scheduled for execution... terminating + + + +*** Numbers of Victims in the Environment *** +Critical victims (V1) = 5 +Instable victims (V2) = 21 +Pot. inst. victims (V3) = 8 +Stable victims (V4) = 8 +-------------------------------------- +Total of victims (V) = 42 + + +*** Final results per agent *** + +[ Agent RESCUER ] + +*** Used time *** +15.0 of 400.0 +No found victims + +saved victims: (id, severity, gravity) +(9, 3, 73.4) (15, 1, 24.4) + +Critical victims saved (Vs1) = 1 out of 5 (20.0)% +Instable victims saved (Vs2) = 0 out of 21 (0.0)% +Pot. inst. victims saved (Vs3) = 1 out of 8 (12.5)% +Stable victims saved (Vs4) = 0 out of 8 (0.0)% +-------------------------------------- +Total of saved victims (Vs) = 2 (4.76%) +Weighted saved victims per severity (Vsg) = 0.07 + +Sum of gravities of all saved victims = 97.77 of a total of 1983.64 + % of gravities of all saved victims = 0.05 + +[ Agent EXPLORER ] + +*** Used time *** +95.0 of 100.0 + +found victims: (id, severity, gravity) +(7, 3, 56.7) (8, 2, 43.8) (15, 1, 24.4) (21, 1, 13.3) (25, 4, 81.5) (31, 3, 68.3) (41, 4, 85.2) + +Critical victims found (Ve1) = 2 out of 5 (40.0)% +Instable victims found (Ve2) = 1 out of 21 (4.8)% +Pot. inst. victims found (Ve3) = 2 out of 8 (25.0)% +Stable victims found (Ve4) = 2 out of 8 (25.0)% +-------------------------------------- +Total of found victims (Ve) = 7 (16.67%) +Weighted found victims per severity (Veg) = 0.18 + +Sum of gravities of all found victims = 373.21 of a total of 1983.64 + % of gravities of all found victims = 0.19 +No saved victims + +[ Agent EXPLORER ] + +*** Used time *** +96.5 of 100.0 + +found victims: (id, severity, gravity) +(0, 1, 19.1) (12, 3, 61.6) (23, 2, 39.9) (26, 2, 49.0) (27, 3, 57.6) (28, 4, 77.6) (29, 4, 77.2) (34, 3, 56.4) (36, 2, 41.5) (40, 2, 27.1) + +Critical victims found (Ve1) = 1 out of 5 (20.0)% +Instable victims found (Ve2) = 4 out of 21 (19.0)% +Pot. inst. victims found (Ve3) = 3 out of 8 (37.5)% +Stable victims found (Ve4) = 2 out of 8 (25.0)% +-------------------------------------- +Total of found victims (Ve) = 10 (23.81%) +Weighted found victims per severity (Veg) = 0.22 + +Sum of gravities of all found victims = 506.83 of a total of 1983.64 + % of gravities of all found victims = 0.26 +No saved victims + +[ Agent EXPLORER ] + +*** Used time *** +96.5 of 100.0 + +found victims: (id, severity, gravity) +(6, 2, 37.2) (10, 3, 50.3) (16, 2, 40.5) (30, 4, 76.5) (38, 2, 42.8) (39, 2, 25.6) + +Critical victims found (Ve1) = 0 out of 5 (0.0)% +Instable victims found (Ve2) = 4 out of 21 (19.0)% +Pot. inst. victims found (Ve3) = 1 out of 8 (12.5)% +Stable victims found (Ve4) = 1 out of 8 (12.5)% +-------------------------------------- +Total of found victims (Ve) = 6 (14.29%) +Weighted found victims per severity (Veg) = 0.13 + +Sum of gravities of all found victims = 272.98 of a total of 1983.64 + % of gravities of all found victims = 0.14 +No saved victims + +[ Agent EXPLORER ] + +*** Used time *** +97.5 of 100.0 + +found victims: (id, severity, gravity) +(3, 2, 47.1) (4, 2, 25.2) (5, 2, 28.0) (9, 3, 73.4) (11, 4, 80.2) (13, 4, 85.1) (17, 2, 36.3) (19, 1, 13.3) (32, 2, 36.8) (33, 2, 44.0) (35, 2, 28.1) (37, 3, 68.2) + +Critical victims found (Ve1) = 1 out of 5 (20.0)% +Instable victims found (Ve2) = 7 out of 21 (33.3)% +Pot. inst. victims found (Ve3) = 2 out of 8 (25.0)% +Stable victims found (Ve4) = 2 out of 8 (25.0)% +-------------------------------------- +Total of found victims (Ve) = 12 (28.57%) +Weighted found victims per severity (Veg) = 0.28 + +Sum of gravities of all found victims = 565.54 of a total of 1983.64 + % of gravities of all found victims = 0.29 +No saved victims + +-------------- +from env: Tecle qualquer coisa para encerrar >> \ No newline at end of file From 4b782007d04b76ea7b06e2a80c4d2c56d9c32b66 Mon Sep 17 00:00:00 2001 From: pedro-cfg Date: Tue, 7 Nov 2023 13:37:16 -0300 Subject: [PATCH 18/19] cruzamento --- __pycache__/abstract_agent.cpython-311.pyc | Bin 3849 -> 3847 bytes __pycache__/environment.cpython-311.pyc | Bin 22969 -> 22967 bytes __pycache__/explorer.cpython-311.pyc | Bin 13583 -> 13581 bytes __pycache__/fuzzy.cpython-311.pyc | Bin 12447 -> 20063 bytes __pycache__/kmeans.cpython-311.pyc | Bin 5842 -> 5840 bytes __pycache__/map.cpython-311.pyc | Bin 4654 -> 4652 bytes __pycache__/node.cpython-311.pyc | Bin 926 -> 924 bytes __pycache__/physical_agent.cpython-311.pyc | Bin 9042 -> 9040 bytes __pycache__/rescuer.cpython-311.pyc | Bin 4948 -> 4946 bytes fuzzy.py | 162 ++++++++++++++++----- 10 files changed, 127 insertions(+), 35 deletions(-) diff --git a/__pycache__/abstract_agent.cpython-311.pyc b/__pycache__/abstract_agent.cpython-311.pyc index e072b81e07d71486c8f588dfeaed775591ab6cd6..1b310e64fb07ced282704ad16e3a39f349d09543 100644 GIT binary patch delta 71 zcmeB_YnS6*&dbZi00c7oJT`JKy+bO&dbZi00b5yY#X_kap-&LXXNLm>KCM@6y@u?jxC&rxzvW bCMGB5>wD&vq~>I%r{*PRCT_mRp~(gS2Im*J diff --git a/__pycache__/environment.cpython-311.pyc b/__pycache__/environment.cpython-311.pyc index 78506f78470d48eb4e8ff78269c85c4854165e92..3d366fd208b0ddbfff020ecf56895f3e092d2de4 100644 GIT binary patch delta 73 zcmdnFnQ{AOM(*Xjyj%=G;27<-k(--W*Hu3wKQ~psAT^~ZU*9D^ximL5uOz=%KcFZ- by(lp^F*z|`KP)r3Br`WSGk3EqZ;1~8M%Nf{ delta 75 zcmdnKnQ`Z4M(*Xjyj%=Gkn`MgBR4m%zPo-#er~FML261-zP?L-a%paAUP-ZjKv8~r dQDSala$>%|XI@EaPG)*)UUFvQW@p|K9{{5P8SnrA diff --git a/__pycache__/explorer.cpython-311.pyc b/__pycache__/explorer.cpython-311.pyc index 0e218850565400657015f7bbc82cd53ed9b57cf1..de0223fc2605217459c1dcb1c79103f485f3c183 100644 GIT binary patch delta 71 zcmeCr>doR_&dbZi00c7oJT`JqV9|Bb&&bbB)h|d*DazM($xklLP0cIGFV+tz%1d)d{&dbZi00g$ho*TI*u;{z!XXNLm>KCM@6y@u?jxC&rxzvW bCMGB5>wD&vq~>I%r{*PRCT>2#;%Wc@Q{ov9 diff --git a/__pycache__/fuzzy.cpython-311.pyc b/__pycache__/fuzzy.cpython-311.pyc index 5b87d4b82f036e157399bebe7c8015335722a6b4..854f675a356a5db5e5220721f7872445e777c9a5 100644 GIT binary patch literal 20063 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 diff --git a/__pycache__/kmeans.cpython-311.pyc b/__pycache__/kmeans.cpython-311.pyc index 5ee5f0ac9e139486c68569da94c7c0d34b36f341..7b43dd355990257e4ac53bb3b41921e406ec6686 100644 GIT binary patch delta 71 zcmcbldqJ0bIWI340}#mU^VrBO$f)a}pOK%Ns$YxlA4p5o|>1OnYj5elP5m_C2kl` diff --git a/__pycache__/node.cpython-311.pyc b/__pycache__/node.cpython-311.pyc index 5f217d28f50c8c39f4c992ad74b8d9fabd564b48..007f52e31bf650e1cdcee62530d9a2fc6dbeaea9 100644 GIT binary patch delta 71 zcmbQoK8KxqIWI340}#mU^VrC($*60mpOK%Ns$Y|7`7PbHY delta 73 zcmbQkK98MyIWI340}$92dv4^`WYl-i&&bbB)h|d*DazM($xklLP0cGQ)(sSDpOK%Ns$YxlA4p5o|>1OnYj51a~(ebSE3m{ diff --git a/fuzzy.py b/fuzzy.py index 17aa7bf..848e2c4 100644 --- a/fuzzy.py +++ b/fuzzy.py @@ -5,15 +5,63 @@ class Fuzzy: def __init__(self): - self.rules = {} #Mapa das regras inferidas pelo Wang-Mendel - self.dic = defaultdict(int) #Dicionario, conta quantas vezes uma regra aparece - 2 passo do wang mendel + self.small_rules_set = {} #Mapa das regras inferidas pelo Wang-Mendel + self.medium_rules_set = {} + self.big_rules_set = {} + self.small_dictionary = defaultdict(int) #Dicionario, conta quantas vezes uma regra aparece - 2 passo do wang mendel + self.medium_dictionary = defaultdict(int) + self.big_dictionary = defaultdict(int) self.wang_mendel("datasets/data_800vic/sinais_vitais_com_label.txt") #Treina com varios arquivos self.wang_mendel("datasets/data_12x12_10vic/sinais_vitais.txt") self.wang_mendel("datasets/data_20x20_42vic/sinais_vitais.txt") self.wang_mendel("datasets/data_teste_sala/sinais_vitais.txt") #self.teste_800vit() - def fuzzyfy(self,max,var): #Divide cada variavel em 17 grupos - fuzzy triangular + def small_fuzzyfy(self,max,var): #Divide cada variavel em 5 grupos - fuzzy triangular + fuz_vec = [0,0,0,0,0] #Cada posicao indica o valor fuzzy + if(var < max/4): + fuz_vec[0] = -(800/max) * var + 100 + fuz_vec[1] = (800/max) * var + elif(var >= max/4 and var < max/2): + fuz_vec[1] = -(800/max) * var + 200 + fuz_vec[2] = (800/max) * var - 100 + elif(var >= max/2 and var < max*3/4): + fuz_vec[2] = -(800/max) * var + 300 + fuz_vec[3] = (800/max) * var - 200 + else: + fuz_vec[3] = -(800/max) * var + 400 + fuz_vec[4] = (800/max) * var - 300 + return fuz_vec + + def medium_fuzzyfy(self,max,var): #Divide cada variavel em 9 grupos - fuzzy triangular + fuz_vec = [0,0,0,0,0,0,0,0,0] #Cada posicao indica o valor fuzzy + if(var < max/8): + fuz_vec[0] = -(800/max) * var + 100 + fuz_vec[1] = (800/max) * var + elif(var >= max/8 and var < max/4): + fuz_vec[1] = -(800/max) * var + 200 + fuz_vec[2] = (800/max) * var - 100 + elif(var >= max/4 and var < max*3/8): + fuz_vec[2] = -(800/max) * var + 300 + fuz_vec[3] = (800/max) * var - 200 + elif(var >= max*3/8 and var < max/2): + fuz_vec[3] = -(800/max) * var + 400 + fuz_vec[4] = (800/max) * var - 300 + elif(var >= max/2 and var < max*5/8): + fuz_vec[4] = -(800/max) * var + 500 + fuz_vec[5] = (800/max) * var - 400 + elif(var >= max*5/8 and var < max*3/4): + fuz_vec[5] = -(800/max) * var + 600 + fuz_vec[6] = (800/max) * var - 500 + elif(var >= max*3/4 and var < max*7/8): + fuz_vec[6] = -(800/max) * var + 700 + fuz_vec[7] = (800/max) * var - 600 + else: + fuz_vec[7] = -(800/max) * var + 800 + fuz_vec[8] = (800/max) * var - 700 + return fuz_vec + + def big_fuzzyfy(self,max,var): #Divide cada variavel em 17 grupos - fuzzy triangular fuz_vec = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #Cada posicao indica o valor fuzzy if(var < max/8): fuz_vec[0] = -(1600/max) * var + 100 @@ -66,7 +114,9 @@ def fuzzyfy(self,max,var): #Divide cada variavel em 17 grupos - fuzzy triangular return fuz_vec def wang_mendel(self, path): - rules = [] #Todas as regras geradas, mesmo as repetidas + s_rules = [] #Todas as regras geradas, mesmo as repetidas + m_rules = [] + b_rules = [] signals = [] #Vetor das caracteristicas da vitima (pressão, batimentos, etc) vs_file = os.path.join(path) #Arquivo de teste @@ -82,32 +132,74 @@ def wang_mendel(self, path): signals.append([qp, pf, rf, lb]) for vic in signals: - fuz_qPA = self.fuzzyfy(20,vic[0]+10) #Chama a fuzzyfy para as tres caracteristicas - fuz_pulse = self.fuzzyfy(200,vic[1]) - fuz_fResp = self.fuzzyfy(22,vic[2]) - rules.append([fuz_qPA.index(max(fuz_qPA)),fuz_pulse.index(max(fuz_pulse)),fuz_fResp.index(max(fuz_fResp)),vic[3]]) #cria uma regra, usando o grupo com maior valor obtido para cada variavel + fuz_qPA = self.small_fuzzyfy(20,vic[0]+10) #Chama a fuzzyfy para as tres caracteristicas + fuz_pulse = self.small_fuzzyfy(200,vic[1]) + fuz_fResp = self.small_fuzzyfy(22,vic[2]) + s_rules.append([fuz_qPA.index(max(fuz_qPA)),fuz_pulse.index(max(fuz_pulse)),fuz_fResp.index(max(fuz_fResp)),vic[3]]) #cria uma regra, usando o grupo com maior valor obtido para cada variavel + fuz_qPA = self.medium_fuzzyfy(20,vic[0]+10) #Chama a fuzzyfy para as tres caracteristicas + fuz_pulse = self.medium_fuzzyfy(200,vic[1]) + fuz_fResp = self.medium_fuzzyfy(22,vic[2]) + m_rules.append([fuz_qPA.index(max(fuz_qPA)),fuz_pulse.index(max(fuz_pulse)),fuz_fResp.index(max(fuz_fResp)),vic[3]]) + fuz_qPA = self.big_fuzzyfy(20,vic[0]+10) #Chama a fuzzyfy para as tres caracteristicas + fuz_pulse = self.big_fuzzyfy(200,vic[1]) + fuz_fResp = self.big_fuzzyfy(22,vic[2]) + b_rules.append([fuz_qPA.index(max(fuz_qPA)),fuz_pulse.index(max(fuz_pulse)),fuz_fResp.index(max(fuz_fResp)),vic[3]]) - for rule in rules: + for rule in s_rules: precedent = tuple(rule[:3]) #A tupla das variaveis precedentes consequent = rule[3] #O grupo de gravidade (Verdadeiro) - if precedent not in self.rules or self.dic[precedent] < self.dic[precedent + (consequent,)]: #Adiciona as regras unicas se for a primeira aparição, ou se a regra apareceu mais vezes - self.rules[precedent] = consequent + if precedent not in self.small_rules_set or self.small_dictionary[precedent] < self.small_dictionary[precedent + (consequent,)]: #Adiciona as regras unicas se for a primeira aparição, ou se a regra apareceu mais vezes + self.small_rules_set[precedent] = consequent - self.dic[precedent + (consequent,)] += 1 + self.small_dictionary[precedent + (consequent,)] += 1 + + for rule in m_rules: + precedent = tuple(rule[:3]) #A tupla das variaveis precedentes + consequent = rule[3] #O grupo de gravidade (Verdadeiro) + + if precedent not in self.medium_rules_set or self.medium_dictionary[precedent] < self.medium_dictionary[precedent + (consequent,)]: #Adiciona as regras unicas se for a primeira aparição, ou se a regra apareceu mais vezes + self.medium_rules_set[precedent] = consequent + + self.medium_dictionary[precedent + (consequent,)] += 1 + + for rule in b_rules: + precedent = tuple(rule[:3]) #A tupla das variaveis precedentes + consequent = rule[3] #O grupo de gravidade (Verdadeiro) + + if precedent not in self.big_rules_set or self.big_dictionary[precedent] < self.big_dictionary[precedent + (consequent,)]: #Adiciona as regras unicas se for a primeira aparição, ou se a regra apareceu mais vezes + self.big_rules_set[precedent] = consequent + + self.big_dictionary[precedent + (consequent,)] += 1 def defuzzyfy(self,vec): #Para um vetor de vitimas com pressao, batimentos e respiração, retorna um vetor com os grupos inferidos pelo processo fuzzy out = [] for vic in vec: grav = [0,0,0,0] #Vetor que armazena a maior inferencia para cada grupo, dentre todas as regras - fuz_qPA = self.fuzzyfy(20,vic[0]+10) - fuz_pulse = self.fuzzyfy(200,vic[1]) - fuz_fResp = self.fuzzyfy(22,vic[2]) - for rule, value in self.rules.items(): #Testa todas as regras - smallest_fuzzy = min(fuz_qPA[rule[0]], fuz_pulse[rule[1]], fuz_fResp[rule[2]]) #Como é um and, pega sempre o menor valor + big_fuz_qPA = self.big_fuzzyfy(20,vic[0]+10) + big_fuz_pulse = self.big_fuzzyfy(200,vic[1]) + big_fuz_fResp = self.big_fuzzyfy(22,vic[2]) + medium_fuz_qPA = self.medium_fuzzyfy(20,vic[0]+10) + medium_fuz_pulse = self.medium_fuzzyfy(200,vic[1]) + medium_fuz_fResp = self.medium_fuzzyfy(22,vic[2]) + small_fuz_qPA = self.small_fuzzyfy(20,vic[0]+10) + small_fuz_pulse = self.small_fuzzyfy(200,vic[1]) + small_fuz_fResp = self.small_fuzzyfy(22,vic[2]) + for rule, value in self.big_rules_set.items(): #Testa todas as regras + smallest_fuzzy = min(big_fuz_qPA[rule[0]], big_fuz_pulse[rule[1]], big_fuz_fResp[rule[2]]) #Como é um and, pega sempre o menor valor if smallest_fuzzy > grav[value - 1]: #Armazena se o resultado for maior que o ja existente (para o grupo) grav[value - 1] = smallest_fuzzy + if grav == [0,0,0,0]: + for rule, value in self.medium_rules_set.items(): #Testa todas as regras + smallest_fuzzy = min(medium_fuz_qPA[rule[0]], medium_fuz_pulse[rule[1]], medium_fuz_fResp[rule[2]]) #Como é um and, pega sempre o menor valor + if smallest_fuzzy > grav[value - 1]: #Armazena se o resultado for maior que o ja existente (para o grupo) + grav[value - 1] = smallest_fuzzy + if grav == [0,0,0,0]: + for rule, value in self.small_rules_set.items(): #Testa todas as regras + smallest_fuzzy = min(small_fuz_qPA[rule[0]], small_fuz_pulse[rule[1]], small_fuz_fResp[rule[2]]) #Como é um and, pega sempre o menor valor + if smallest_fuzzy > grav[value - 1]: #Armazena se o resultado for maior que o ja existente (para o grupo) + grav[value - 1] = smallest_fuzzy out.append(grav.index(max(grav))+1) return out @@ -161,27 +253,27 @@ def measurement(self, generated, original): #Calcula as métricas print(f"Group 4: {f_measure_4:.3f}") print(f"\nTOTAL ACCURACY: {accuracy:.3f}\n") - # def teste_800vit(self): - # signals = [] + def teste_800vit(self): + signals = [] - # vs_file = os.path.join("datasets/data_800vic/sinais_vitais_com_label.txt") + vs_file = os.path.join("datasets/data_800vic/sinais_vitais_com_label.txt") - # with open(vs_file, 'r') as csvfile: - # csvreader = csv.reader(csvfile) - # for row in csvreader: - # qp = float(row[3]) #Pressao - # pf = float(row[4]) #Batimentos - # rf = float(row[5]) #Respiração - # lb = int(row[7]) #Grupo verdadeiro + with open(vs_file, 'r') as csvfile: + csvreader = csv.reader(csvfile) + for row in csvreader: + qp = float(row[3]) #Pressao + pf = float(row[4]) #Batimentos + rf = float(row[5]) #Respiração + lb = int(row[7]) #Grupo verdadeiro - # signals.append([qp, pf, rf, lb]) + signals.append([qp, pf, rf, lb]) - # original = [] - # saida = [] - # for x in signals: - # original.append(tuple(x[:3])) - # saida.append(x[3]) + original = [] + saida = [] + for x in signals: + original.append(tuple(x[:3])) + saida.append(x[3]) - # teste = self.defuzzyfy(original) + teste = self.defuzzyfy(original) - # self.measurement(teste,saida) \ No newline at end of file + self.measurement(teste,saida) \ No newline at end of file From 9b27bb3eaf32c4c2f2423adb57b8d95a924a162a Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 8 Nov 2023 12:18:57 -0300 Subject: [PATCH 19/19] Deleting pycache --- __pycache__/abstract_agent.cpython-310.pyc | Bin 2159 -> 0 bytes __pycache__/abstract_agent.cpython-311.pyc | Bin 3847 -> 0 bytes __pycache__/abstract_agent.cpython-38.pyc | Bin 2126 -> 0 bytes __pycache__/environment.cpython-310.pyc | Bin 9918 -> 0 bytes __pycache__/environment.cpython-311.pyc | Bin 22967 -> 0 bytes __pycache__/environment.cpython-38.pyc | Bin 9879 -> 0 bytes __pycache__/explorer.cpython-310.pyc | Bin 4300 -> 0 bytes __pycache__/explorer.cpython-311.pyc | Bin 13581 -> 0 bytes __pycache__/explorer.cpython-38.pyc | Bin 8700 -> 0 bytes __pycache__/fuzzy.cpython-311.pyc | Bin 20063 -> 0 bytes __pycache__/kmeans.cpython-311.pyc | Bin 5840 -> 0 bytes __pycache__/kmeans.cpython-38.pyc | Bin 3314 -> 0 bytes __pycache__/map.cpython-310.pyc | Bin 2646 -> 0 bytes __pycache__/map.cpython-311.pyc | Bin 4652 -> 0 bytes __pycache__/map.cpython-38.pyc | Bin 2587 -> 0 bytes __pycache__/node.cpython-311.pyc | Bin 924 -> 0 bytes __pycache__/node.cpython-38.pyc | Bin 630 -> 0 bytes __pycache__/physical_agent.cpython-310.pyc | Bin 6470 -> 0 bytes __pycache__/physical_agent.cpython-311.pyc | Bin 9040 -> 0 bytes __pycache__/physical_agent.cpython-38.pyc | Bin 6524 -> 0 bytes __pycache__/rescuer.cpython-310.pyc | Bin 2665 -> 0 bytes __pycache__/rescuer.cpython-311.pyc | Bin 4946 -> 0 bytes __pycache__/rescuer.cpython-38.pyc | Bin 2849 -> 0 bytes 23 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 __pycache__/abstract_agent.cpython-310.pyc delete mode 100644 __pycache__/abstract_agent.cpython-311.pyc delete mode 100644 __pycache__/abstract_agent.cpython-38.pyc delete mode 100644 __pycache__/environment.cpython-310.pyc delete mode 100644 __pycache__/environment.cpython-311.pyc delete mode 100644 __pycache__/environment.cpython-38.pyc delete mode 100644 __pycache__/explorer.cpython-310.pyc delete mode 100644 __pycache__/explorer.cpython-311.pyc delete mode 100644 __pycache__/explorer.cpython-38.pyc delete mode 100644 __pycache__/fuzzy.cpython-311.pyc delete mode 100644 __pycache__/kmeans.cpython-311.pyc delete mode 100644 __pycache__/kmeans.cpython-38.pyc delete mode 100644 __pycache__/map.cpython-310.pyc delete mode 100644 __pycache__/map.cpython-311.pyc delete mode 100644 __pycache__/map.cpython-38.pyc delete mode 100644 __pycache__/node.cpython-311.pyc delete mode 100644 __pycache__/node.cpython-38.pyc delete mode 100644 __pycache__/physical_agent.cpython-310.pyc delete mode 100644 __pycache__/physical_agent.cpython-311.pyc delete mode 100644 __pycache__/physical_agent.cpython-38.pyc delete mode 100644 __pycache__/rescuer.cpython-310.pyc delete mode 100644 __pycache__/rescuer.cpython-311.pyc delete mode 100644 __pycache__/rescuer.cpython-38.pyc diff --git a/__pycache__/abstract_agent.cpython-310.pyc b/__pycache__/abstract_agent.cpython-310.pyc deleted file mode 100644 index 5963c642c01d0a2594d96b7b7ef38fd7269ea35b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2159 zcmbtV&ube;6rR~%TFJ8FIBrRxl%de1D#g%4p_me^%1$asoFJ?3`~NOg5nx zZv${-eD@uO`z~{s`vmnp?lX@ELx=e+c;cO4@L2($p3KFNZD2U`^ z$qVpT5K6!=mq|>hxd5R#BiW=-WWY(1jZ>Zh%NZF=VQVb%SaQWnGwUQaVLERnpds`& z^x`>2XohDfg3tkC<^aN#0bPrpMc-mzvBEr94Ve#ERkfMJf)nSPACBFbyM;de?%11o zPnVvdV}Ite$~ANx%mNl3IC2B#)oaMue{>zV8gQSfddWUrW=qfT2|lh^rhW}wFrj6Z z=a}lOG7D$bp}A#fZ8gBwSO42q)!MoQw!T%3@?IwMfd77h_bh)I_@5Sd-}0-# zKVRT0mcIi0&kKC;==wv5zlS_@;$oDC@1o+@#~35?`vm$7KfN?VYUT6G&&>P5R<3JD zzmXa_Ypr~GrWrM&iX{06v;wjjN|6y|6eV&_9w%u^M)Z&a1-c?sDVYo=ii5rmX_C@G z%GWP!ZjPy>8R7XM2yw_I&*Ov=L1;EejM!e@2&x+<`_V8-`G#>oAb~^**2$Qv5mBNf zjeKu_!tHKic3&9U(P;l%rcL*h!B|$#0f?{7*l5>+#!`ZOk@j|4cehXN&~M+nbFX{k zz14h&oI0?0YNW51dfirgJF<(~>)q+x)z$XB-ClI3v$K6R-0HM$>xN}-b-J+D>TI1Y zb+=nv%~kC}D6}^aY${C>$rS^a4XheiGjPQ~-M}RP?TInZwO@?WL}@q46^tR~W9<)9 zL6xpj#v+^1(v%P#wA#JSgY9Nbdj(I2@)aQaOLLLco{5_ z3B0fI;726igvnnw+Z%fy7hD#5LrL>^9iq@}?cVQnx8K{_;>CdyI~bX&Vjz-%Ts^eT{L;RK}{>BS?F#GHtso#p%ssF?7S zB43AXoD@kmNvRT9IKk)*g#VOj4XIS8lm2((WNk>^RiPvU8uLb)xCmUS5Xm9OkY z-rW6(tjn@AtPY>(M@O_(6H)n?^^aGv8>lj#u4( E0OdR?_5c6? diff --git a/__pycache__/abstract_agent.cpython-311.pyc b/__pycache__/abstract_agent.cpython-311.pyc deleted file mode 100644 index 1b310e64fb07ced282704ad16e3a39f349d09543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3847 zcmdT{UuYZ28K0F_e{DI5BgM+u7sgG}L`iGYOWj_M(mU015*@K~bHZlz~522)>3x)WO!08~QK9WKn`gk1l@m`7@{2&$rg+BSEDC7$1J@xx`rIqD# z19hJ|D}DQY^UZwU%r`T?`Sy>gRFXg$`SKE*O%d{U6gow0GcPU!bC0M*6?8K1zlC`L zAhs%m%FsEXvIl)c5S6R063(Rzsc2DmWZVNAd2+Tdg2##Vtqzdz4HFS&2i!7ps zS+pDi-{M1P^Qhf{5bzv9&u%K;cIKI1nWJ+R&8CVj+cxE_%9#ybZ7Ngn&bX#f8HYh- zQ>DhD?a&gVno-r60kuq}rDbTUSf;|6!+bMiROt*9-N)dM@{7R;4!S1Ph=lcCQBe{C zDFjjwEHw;LV9Ap@O9G(=9oX}WCq;WC^y(E=gqHC@ihz{pNKU515mF1O(cZ+hQ1m%aEdd#V4?UZNJO#cPQ&u4%ARcfNp# z474M1YnR6zQQX%I{+}We?AE$)=K{p!KszQQ&gdS+w5Y_RcHuyMF;jaCAH9iQIQFA%fuIQapw z#ih`P;Sb1?AdnA;08dS59Oy>A%hiZOyV9=?b@*Ppuo}TR^)7?-$_7o+cFCK|Z7g;w zvO_hq0vHT%T;`TR9Yku&WOPZ>by|^cFsK5&rn2L3t+ePc!0j8drpqOrjRiK}smfe7 zC^K&Wz?T_krlQHzqOwua5X5&k1T-&e3sPCr*<0vY@pSHc zbQ_i1xP{%mx!L^Wl;kO0aqe<)+D%MexjH9ZF3wD~*+MaY(H-z=FBE4%moFCDs@bW0 zAvfrTAr!7yveadcaLNxONh87gfDa)#f&`bD4+3#TtIA9_Vpny|al@MF01q**x{su?@D zPKM!+ajd%R#wAHJHAj+Gj`U;%W1aeg;Mx8?#Qr8}4UqKEZShXLna;v1(M%ulUs#!F z9vy+#z^>P^(c9uye7KqU4k(k&;nOH){~09%gY~m(_Gaq%R_b_*97{|zoK}<^eZ577 zQxngT)WyGLM?Ot{lKi;;et$gz+F{xd?w_v5nulLoyKwjI`rA!n@MZ+<2{kU%^0(G2!{rFP@k*wf6|MrQ2Uneiu)C-R@; zpN~HtN5`i&)2Ck5{a>vg!*aD^u!!DDdgM8->DNfQb$f9yU%uR{x>XQJCVOxC?sVhC zpAuWA-`q@}-%6jyjdmLz8xQMWhAy5f4u!uO5{tvJuZ{^o-6$lWi`-NKaD{frd#NYl zJ!J5hdxzvKRQp*kz$xOJQn56JQLF4pCi@W5T{uFPIR?!bwKZc=mmP~!Mb>rfqS*n| z`6)XfFlDk*0f3cl%QQ7}fhx<24!N>#)K8+ppN|V&aGu^Hr`Al$ZZHm+HDYYw>K%WE zbdE3jz|0xoFWv_*G{fQm)ZVCJgcen;Z}qz%>-LV0rnR$^--ph8PI3Ytg>cyzJj!!G z-K5HNt;D$Ou$62tT68s+uoEULfENczB6VAQ0RnvG#1U&u*m zQ%!@Nu>=17@%4`RoA^)sng5iZht3#X`!_&ZVL=dD{X|IKOyJWbshi%@B*!=Q`ZdXk Yjox1?S`Y-7(BAa9SO4{Y(0bGSH+R!<&;S4c diff --git a/__pycache__/abstract_agent.cpython-38.pyc b/__pycache__/abstract_agent.cpython-38.pyc deleted file mode 100644 index 17849c4d916997cad4511cc805166a2f72d34270..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2126 zcmbtVPjeeJ6qoj&*G}T5X<-@;j4n_No!ppVI!q_VNlTd41=keDQ)ZD@axA*LaFM|0e!I5TK+tx7jd*Vj zp}*~9x%n{JhF;zQV2I%i4XS@Uz%chRFZTz29t;9(<$f0C(ICR;9%2CtPY?@_y+MuP zN2nE@f(_JddB$&l(J@UrEVZJk&bb~-*21R#^>|jc_j#dHyK=b&FxiG)ehk2o^*!(y z9{9{-{s|fcJme7ze#0ze(MfQO!DkJ8#%8U3=EfO5?34ajlqAh)SrWx3ikIN8B$R+( zu0%?xJpiEvBl)z{WXOrgCmGK{${88XU}-9gRB_EKGg~CJVOlgB&^q)E^zsjk&>YWE z0-*!M%maiY1NsgFhoQsBVT}c#jadj-*NwTyqGRtR{-t~5&;1?r692G$6wHHHE3eT} zI1gEE6CFkKh{aDm^#bPgO=NvM>w>HSvOo1|C4IHVR$k*{d{lFi)lGCRiJfF^Nm8HJ z=JC8fvL}t5t>#lWh1&Sv*6PmM6=&_1ZdPYIw$bsOX5DG-UeW|kbJb~nyrc=8X2WR? zFKKE{a}6TUy(EvGb-zQOqHjdGAH^`EZ3wl9MnQLi8VMH=L+wTsyqTlAP} zB8oAv1PC)yGAG({Nfw+u7gnh%Ag*_#W2ZzHjvj6}w7TL%PEM`mE1OsF0cEi0iV?oHsfTTSfhb3J|nZ9mvOb;Gdp@czTzVenDw7CH4md1^^-R{Fhm zXE$+56ZG%zJuvmo!$6;;e`pyNhY-MMWJB~F`t-llu4>hoidiVTvoPtn5f<9 z?>*jaHB3(*GeIT_Zo=nMvC`C@@|hheo6rXD8$A3SsSjZC&nG*# zpY-@dmO@J={LOCk8zAw zp>Mcf6E~Jd>oB|MF@7&NeD_j?+giASf*L`QnyMnT54dP{Y`ZH@HZqR#9=!p=sx|_p zEyvQa6e%Zi!4 zU*%#^7d}eBhl1ujNlYV2a>=Hd9j_+IvnkEaG_@pQGEEY76YMFMY>*)`Q!P8U99#l> z5)}g21SxGI$2jog&phm;;L?*N@Buz+GB-XQrplhPGTWTMcUQnOF6E2cw&cM1bN7uu QuMT`Cx^NW(Cs+M{0iypR6#xJL diff --git a/__pycache__/environment.cpython-310.pyc b/__pycache__/environment.cpython-310.pyc deleted file mode 100644 index a6db2747495efe21455aac20aaba9dee3517ca70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9918 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 E2mA+3YybcN diff --git a/__pycache__/environment.cpython-38.pyc b/__pycache__/environment.cpython-38.pyc deleted file mode 100644 index 44f48506739003137b6f6232a853edfb50e79dcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9879 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 diff --git a/__pycache__/explorer.cpython-310.pyc b/__pycache__/explorer.cpython-310.pyc deleted file mode 100644 index 11b5fb24b1a747079823eb94c24861857d05db21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4300 zcma)9UvJyi73U=>iIOE*@t-6{x|VITb=np;`_nB5y26g*rU4o+h}~ikJTNrxwM?5L zl}pNv4H*dL4B5-DuORQuAE3bA2JB(L9`*(Jx+i~y0bBPwmozOaDNqVL_ug~vpQCfn z@0`P^(Wq&7{#=_9>+fjVziBZ3m>4YKjh}*Wjk7@OWG(A3HP$;iT0Jm&X2)bCGlEjD z+$pQR8B}^!$5Q=LQ0>(^wcb=`ifIotUgnjT8m|cR*yz+bTi4pw8BWpG+AM7>Z^emp zy=1v7!UT-!yG|P+h&|` z{iW40xFO7KotwP$((IHntvY3H@#;&hQ{go}h1TMA-auRBO+Jmb##{Uf+9^K6XVKRA z9G^$qc%_+Ir-}b^HMLfs_k&0Z>6OM5qCQ!b^ol>V<6xVU0ahTdGQ3$&Yl1SP-vRyKsu%#RFsAosvt-udO z&CZ{tzAN3HEy8_Uifti9==rXVRlO~r)?G~WqHx>qI@^9A?%K(YuwnBk7+~wZo9x(0 zq?jWAyC1}Mw!o$Z7rSJ~NfCRO&m+!2NbDtDyB~3MT`!W{y%j{oYRO=#wRSx%#e=?( zspU9+=qHYonzTMOH$H#(C@smv?}@aw6G{It3KKU-t$hKehu(BJ=xqtpcwvO?xJ~B?UBRJBoIVz#24|UEKv?Bwpj@HE7G91(#8Yf2l(RZ6C-&H$T)GGa` zggvaR4=2|~)e}v%wY;4wWTm9O+t}0PD|Jq@;FF%y(5^fL6!uC=u8&&7@(DYt41uZL zD_AjeN7FTjdb4=vx&)>9eWqs5kFK8chn22z!Vs1W0LMH$vNy=92`;v`6GgFzl}m@> zc>-rl{3u*hQ)0h22wZ{}JSw0`eq8uy7J+Oxv4!jH*xrE`h(-I+AWrNpVf(#)AbJEW zZu_Av;Fky4k;=Ev=+-vc*U}cbu#-eiS0v7s>+Pkj^B!@x+*qXMR>Tj|X>Uh(drpJ^ z=;EkYlB;xTG&|Edt-1pQMPLC-zH)=T^xB}$-9$Lt$C}Vn=cpZ9x!?j4S98uJYUXpk z6g?LZ47&~~EGeELcoCG zbc0ydX|L+aZ`L=QC#%c%Wdmc`Byxo$Ww+lKA#Yo9R!uAn&@lk)REKGF{yYU7;z5w4 zMl7DC`hG00(+-L((7GBIfscRydwhv;{4)^Cw2Ycj(=BGPrd|U@``>1{4)|HD4oTA> zZk@H*47CWKAV`6tfZ#n`GiOK0K7g6Fi~gP_>s&u#A)Hu^O*zXA1xL(+ z^aiB5lG50e??I{$8NpLQQ)P>hc|y6v1VBGaN~3aD&4N!W#{o)m-l^c6#iHa=}H zj5&@?!ncW_%z+DKIWa8*?Y<}Edn9?6$ooXTPlP;L{(uPKN`64(heX;$$VcUmK+=j! zI0Y)J0$5T0lqH8623!Pnn$X zTlqam{(v|B1jN)$RzqH>v5S^?b9$3C+1&r?W)rS^*>SCs$!7Gou;Or`aNfxnbIFA% zHjz12=-8Ve2{{ToW~$YX*)`=joZZk=&)mbcw)M3$@_Xb^0|mp_Wl&yI20Ue%F)kxh zz6JT$cw-&p=D3!VvC$)~&L8R*THe86NPscq4COP`QkGDft1N+HmGWQC(=T|Zdgfkm zsqr_I_g&ea+}(0A=(!bYOCd z7kWhapudKyPyQN$Q+>?1AA>Qe$}hqD8(wA5Id<48)X07J+wEv$S#BftE6T0e2<568 zp`2dVPT87V#yq)1Wa2UjT7SnIQ&H7K)I79{({m$CW~0~4P~0jZG1G?U+R*v%GzI)N zlghQ;WCHTqe~=nvQYi7xq!JT(?lm1qeRUOtT)GOn1XW+?s4wO*LLGI%SJee{BmLw( zENPo#m!!hMkHM91()E1^{)tz4&J4TG%x}h!nj5Xi)E;Se{!pL(q0$uJW18}PUABe> z*AcW^goy=mBSW^R`hna8-_GSW(u`L2^C?|ETBb zf>Ok%S<)aQosnOik;&v;>Jd=SDj*xmiE(38V91|s_K(u;opSwfQW)xKj&sZgSd ZHS6Qd5T8&giU~f@L=|FnRgBFU{|5qk;Lrd7 diff --git a/__pycache__/explorer.cpython-311.pyc b/__pycache__/explorer.cpython-311.pyc deleted file mode 100644 index de0223fc2605217459c1dcb1c79103f485f3c183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13581 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 diff --git a/__pycache__/explorer.cpython-38.pyc b/__pycache__/explorer.cpython-38.pyc deleted file mode 100644 index 6a42f76e33416b5d5fce565fb1537dea6ce087cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8700 zcmb_iOKcoRdhX{;&u~bND2kH2irm)P@{V`S*h=Cx97T{;53d88>sYe0Xh>-_r<&xD zGtM?rBn5)of&UNjrDfTt6_hsJ=>Y{=5+0CO_YW6 zNE1$I?U~-Z&~Iyv$|2sYtu*v(_S$Nk$e@{ATMxSlCMxf5?8L)?`Cia#7@2wPN7u8t zpxD_7lZ{AVtF;n|u*oM){>)+!{~bD^#v6IYr`nn>bYVPlJTtU}`3qfG!hU3VwkV16 zBh4!bM^w<3MODn8bwo|fqOFKIF^{$?>f!|28L=QvqOFNVaSH9MSQ4kv&WSVPEZTYT zocIpfx;Q6(2ki-QUObO>LAc@tv?s*{@m;iw;zjWi+EbrumgX%1Cl@p4=EGh)lA&zc z6BlBi6yv?(JE#(EPutg1Jv9ytT}#bW^Nm#7WNQf>wXN!ss>|ydW*k*lR9zL=?aw5& z)Y{|jSz+Ss)^6rrkGh~mKZ&F(A~zsGLRSV|5p~?C`)a$@4XbYPyV?t6&~d}=16PJ? zp$xmtR^S4vv)Urucw;l_uC>y7j%r;eLT7sBpYrLsmZXo`pdDK1Goej zKP7*i4CCg}_i?5lN<2#jZV&t*-Jlss5xm-tM$l3R+HS2h<}y3(_d=ODzTfJ$65r1( zJ|MI1y!+03nJtr6C(NoFk!P4wow{myDA{bJ{2zSg*$S~>4ZmYZQCy~Dz#GxcHGZPydc4oz4do448#%yK+ zQE~=*ym=zX@5vUutUxhZma8tpxaLV%7&HI`#ljP zp+6>3os=d;*24r;X>MipVQ)yMtXv@Ru`Y=@`JGX94!x`@!gdQBfd^m2ICfBJmSZ@k zW9*(B;d8vJNxThzlxh}*N5UsssuP2I&{Jo%yT-s6n8FxX#3yAvwGJq!=E~vM_%#g0 z)2eEinbmH^NoKc_5S(ZSaT3UetxlcItjnOc5elE2=_sxT$9VIq*9}|i8>>-Y#-2mo z^szL3&n3{J>E|r1csb|n-@}>X5-Lq!)GdAY`O%G!-`^zL4}WBDvZc~#|AfxEHn6DI z1~&O9HHZV$##!ya7?ctNeb}kAv}X;aZ>Xf)S4pd<6)&e1b%siQhCSae|?-{90ypq4FN<-fTfh z>2o3{q2kiYWr!UZSzdV`Z;MF;3j)0R!iZdoTb3`kBhW3rvOL<~n90mIOtK{k#zxqe zV6j%yhiYqea12?-qcVFV40_v{!=~4dH?p$oMLqc{m#eG&R$KVgW0@HUA(uI82Hl;; zOwOLRVo!B7nRwQE6tulc)C;>lS=y^M+fWz6$3Z-chw!Ro?nGVFt2O%)mM0%&&JYLc zEjbQe$NMA^Azw!ICQAH0R2n$8q%RtCdd;x(s=>dSv7kGcS@_zrYP#{YW7N&vxua-0 zBEqC2%XJj>R4_3_Rh~YWo~Qo2Y`U`F9By^SLCQF!Ghr` z@+GWgj-&#^#T#a>dtT$LMLbT4r{taf6eXrSX}FE0*P!1gG|-p^O&)jnJ92!UC{>y# zm%S}hUc?ykmrJ15ocvkDknsfQuV-;ZJP{e=7mOz8;Bzm8$X?GET%LNE@z(A)*<*?#)LYzRu1`?+=f$x;A2qm z9~<&_(Rk&!ze@cF&2Bd%xU*x8F8Rs`Wvt7;KN1tAOvi4{FMXP^6ym41fOHIKvnZ&m<3nZ#@Hpg4^8jA}R*# z_s-=K0b8RC^cpM{Ezg?qSH`wQQ#@89@@)Vq@k4+>O(OqjI58H=ta_Qcr5Sa4S3bqE zlFbsG!XG?^A{l`;N^*e@zk({Ogb0sSEF|CJBz+?JBUFu=a$r0M;RkGdZzt26nf@@- z(P??raR4I!5WBq!-B%yMT7YgIoFF!tQL{=B#uKh?tGgEE*HT(X`MdK|Dp265F^>q> z$f&|Ga`ZYJJxgEG&llx_eg^%#u&;_yGcD{T1f9g)GfzUz5rxJWa1_=3Ck8NvDlS$o ziNT2Y7?(stJfkC`F%Qgm1rSfzxBa4e8e$#ngsXxWrZsSUE80d`Gny_oUl2MJ@q%i8a{g`P!`siYdVRTiBCJZ zzc`!+Tb9?9Q#jx`@zj?H{=|~ za-P)*R^+*clLtAK(S?!si5_GIP+^FNOt8fLcEUJo+cO?ahu-o9JmYhenC`j8D1{7+ z7=>-soHOa^J7U(MC@y1t;Fv3Bbtb`A5y+7ULb;AwPWD5de=q5=_FbofQ|osoP% z3}XsJFz}qw4t38Ngy|U5?^QYoW3nN`al2qCTQMa@U@HdUqm_LyX51xnBo(})O0WCg zMfluhcxM==<+Iv8(~{ce?4GXLxjkKl)ei;q++<*_!j3z)8uJraKZ$!}W)Gp~N9f59 zSbfOqr(7rp%<~}o_AaMXdaVkESPz*OiIww}t1}X>QOTpO2KruQ7<&j@>;6(bcH zuwq!9=`ztE^e<83=TK=z4dG1Hs6+SE%sGUbj&4B+4bOr`_NNE?xEOcWh3rHfSXzLkJ7nGE!cuZwDM0_y~0Y-OeL6@_Y3nNaF{2hL!3*QjT~q<$*k~UD^XTO z-sM^o)i6M2R6h~-j|uTS7Jh{i(>!QK35a(PA=e=5Z)=q{tE~W0!=v05FUn|st>_|z@X1?r&udZjJaM;q16%6lvDc* zj66dZft*(S30kXY?V>F~tADPDYy1$FWqVQe&0$}WW$YaclZJWBp3l?Ez&xka1p1uH z`xa8-L3cgO%y!tFu<3<(ka{`Jl@J&YU(bvkl!uqlUdp9K5n@b@HGupYCC^2}3@-xr zq(rSI#+J=7v5hmajBIsG>=Mlwul==si6!Yq`jt%lS zBrq5DKPW>ajJfG}SK%9H7|Av@6p2AHD6hwW*K-jgn8xwEQi4P5G^_~{jlAPy&q?x3d0}!BmS@A zNlI`H=~78Ty}5bRqlDR|_dx4}`K!hHRjgZ7r4aV36YKY}4%w0Sv2GXZ_b1jr!8)Jw z3D)sRK*4`ftP^g(Sl`DwJQKCPU##<7Ul!|MV%;g$znobAs(AlbSg#c8Uyaw1t;44Z z-ca>)QO);o#9d+r%DYxL(Jul=w{jiL0Pm1ua!AA-k`WH+${m(b-BHvTlI|X6}<4fph(7>>PPgO5MwDG-XVII(QmU~^Zo69 z(9T!X_ejPAQCohO2UDKF%j_|iEpM_?F2W1!xvXf!C2fat=A>Yc`bJXPB}GY+5hX8` z%@*HCn_;`{`xEy*%Pn*RB;z!?>MF>FJFql2>)6ioj)VGp&dbhe=cKdXl<_IgQl+FI z8g+Q;J8@=2F*0SG_|>?WB)wFqQ+)dkR-2NPlcb#d16HrG hA`R7>CJsHaotbkvN9YxT#?&s1X6el2CKNs6{{UvxS$hBg diff --git a/__pycache__/fuzzy.cpython-311.pyc b/__pycache__/fuzzy.cpython-311.pyc deleted file mode 100644 index 854f675a356a5db5e5220721f7872445e777c9a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20063 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 diff --git a/__pycache__/map.cpython-310.pyc b/__pycache__/map.cpython-310.pyc deleted file mode 100644 index a03b312231eccd993c7aab8f9178abf4aca2f00f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2646 zcma)7OK%)S5bo}IdcA&R^E8AIK_pm1Ob{SNC_)LrMnPf~vVkDW(rDQpJL~LY=pILj zwLUrGS8%Y8zH{WpznCkh+&Lj6_`aUq?AnQd8CCVy)!j8cRbN*R=H@B_&u@QJ(t1^h z-`SadJaleC>}9Agg%(;qgY2ty_LTO}^U#ypZ;E=*#;jwHLhmNTehifg%oFQMORb)X zbx(WRN9*fAhiC&G=@@OOXLJQ^q-Wu?T6kZ#vNj!!AL1FvZHWB|O3R^0N)6XqZ9%kj z+Jlyw8lQ8TcF)bhTwwp_7^~HgKD^u?ifwP7IGDnr4q%CN2p#L_A;)KQgtFv{-PK zPQR6>HtDspVj*kg50lJv2BwpDQd`7#2Nr11FXC*B=DIDLCoj6QuG?z6S=Ap}?MJzR z>h!k?4?d4n;oG#kX-;D+N5Wi0^XEsmKi&A&rp9h;npVHPa_jc$y<5$@ckZozvhhV~ zALWB=D#3%Ov1S&qc{5MNe{u=F zU!O4-*jc1HMYTkA7OI%d23fMx&rK)QrbhF5non<~c{0dcD$}G)Vcj#YbIj`v9v5M0 zb4e@J8yu@}T{*Z%5+$5ZuKnrpd-zP~T`*ovVyn(rlYNDKKqT5*GIfEhu* zc6YAL zLp-d88zrwSIUa+aaW!6y&s1w}qz&V-hugXdu~(q}`%dM>WSGa7PV|dA^g2e5-J!hb zr(adxkzlQKccZV#o51nLZ^>D(XA{ud|@VgzG7ty%HvAUVps3s9{!C>UR zf><7IUKtlahKk%hb$4{Tz53=D$IvC5K5}<{_F1PqGl%rc1Eu95>d%Pn<)!NtUN`NV z53z!5&CD{;$vwRZ+cywPCe4GOs1Rpf>}RTSA1e<`DaCDxR{^gG7Kj^e3#JYe*!TgP zaY;wC%sVig+yPVl0OB|~FQ>jfbq*Vd{QF#dm1>2`@sQg$^f2Xh!ah>t4#cv!I`&1? e&=IDAipsdU&a2iI@r{!IpK+RHJ)BpywSNF2oeTp2 diff --git a/__pycache__/map.cpython-311.pyc b/__pycache__/map.cpython-311.pyc deleted file mode 100644 index 97b14329eb518aa340e45550633a4152075c75b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4652 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 PSK&vj`{^|e%*y`*SxCA) diff --git a/__pycache__/map.cpython-38.pyc b/__pycache__/map.cpython-38.pyc deleted file mode 100644 index 062c6d46386b1a1f139b07995ac312ac4a561008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2587 zcmah~OK%)S5bo}I?s{$K;XE8(Rgt~As;{emn4PT)w43+q*`G5) z{KdiP=3%e~%9p^t7FuZe0(77@Ia1og$iql#e?ufe8&+qU!e|YYe+HHb*ojT0rB*M* zrl&paqxW^7L-c`;bc{aKHC;y^=^5HwNZhv2b}o^ZaVBiII=QWkJE zZoY&w;-w_}2kkhvYU7TT8|WTd`OvB+x+Xd(?^v;ZtPBt1SW>r9doVCMeO3w2?Yz@; z`mG|%(_U+6=ZCH0Njfy0f$0>TEVuF9K@MrqxACx&X1lGtNKb|{ZrEx&tHw{Q_HJRo zI{j_yVb5b_{XFYFHkaYbu`q9<`+MoD&$sSpZVUWrkZ=9i!TR1tr?-VAE5qkDPSZ}m zQ>3X6`+NaR$PnLcPy-+3SdJRV-b!WKW@xHLY;mni<8KfqX;k}2*uFw=FFLwOH;7DLishNW&9IHjKFUPP>qo;FjCN{s0#UawY#;;KqvpDqhf`*bjJ~=oJxFTiItLfXE|M*hT>-N*!@)4!>ldbzX>*C{ zYgAv}&Wdy}bivHhG7pJo-r$_q8~kj;Qs*LHvbQ)_=elx=f6JK|#@NSqOV$xxQY`1t zGuop$#(KKwl}kgcxoAIufOyJXWg1#-Q1&2S=PhQOAusFD$r0pFbnIjWc~v7iu<;>( zqdg~wkRRy4$uZ zBBwtdM2SMK!5LwFmrXC6Yn)~7#JK6JpWbPt@biJHKn#&4Dn5$}Pkcu6?Lkc}n? zv3|Fc7dEO&9IKnTK{kzt3kBo$9ms{Ed={<)3Zsj6Cr{MtUxX@xF5SH1g}XfmtW=)4 zf#l0WJm*KKKqu8jm7XV_^}1Q#e2P`X>(JbSbl$Ibpt}dki6w!;*-)c}6Q531?=uC0 zNhLYA_#E(=V2N0DZkPlr;PGR2Rar;G%zIFr_kihs2&zyy{rjn#*hKU{LWR>&L@ t>Av9(r*@sHNU;=`@!cS!a%(6E}E!J!G|sr(A9(~^a<4eQ^juV zr=@`_{eGMpUZmo*a^MeTpyI%@%+yeR?}@yCak5NMA)pN@YOFjhUC)i|$AK3IVJ8SrNqwAhXYevDa~|}AnDbGC2Hz=EYFKR}jA6EU z?a+8toozLd)n*%4kX2?^w~?(K;#uG;@K*DpLc!UtZli#^f@jEcLV2~P5t?ce+;*U*%jQGDP_MWtIUStnD8^Bzr8TTVj??M+=r7{ibCjn|bodvBfN z^_w4tpGKeWe0g|m-~WDb|66%quHhR?cO?C58Q@321@+y~=RB=)9!6r=Be~A`i=o@g zJ+eXXFCiR3mLqFL(grf1{?snQcy;EQVcwX-S*UB~12%{AF;7f69gF3;H>m*ioYgxi i@8<2bsfwmVQ|qkpD<$tz-D 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 HHoHFqq2I6} diff --git a/__pycache__/physical_agent.cpython-38.pyc b/__pycache__/physical_agent.cpython-38.pyc deleted file mode 100644 index a89c42c516b59ef3da51339f8590a2d7f20138a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6524 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 R^FDxGi76Ympvu|L{1@QYs*(Tz diff --git a/__pycache__/rescuer.cpython-310.pyc b/__pycache__/rescuer.cpython-310.pyc deleted file mode 100644 index 65300f5101501770e232348cd478fd9f95715db7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 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 diff --git a/__pycache__/rescuer.cpython-38.pyc b/__pycache__/rescuer.cpython-38.pyc deleted file mode 100644 index 86754d927818088aba29ace6f03d46215c8bb173..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2849 zcmZ`*OK;mo5MI71*;1VJkv@QQ3j{R;1V(`#3K&HZ$8nmViBTj@5D+d1n!B=SlU!w& zax6nW*+uR>_h6rj-1;N>EB4xx|3WYA%#xC27p2YJ+2!nGX1@7GFFTz!f#;V$7x>p* zLjJkASCsEy7kp*Krw+kn7ESz(4x9}p*$ZqZzK@=2W6q>P@w~BVu zw#W~J`7AgkEa1+G6D=_71?hzsushl8S-P{fqbixC)!HsEE0}2gG#IOTU~6aX!Mg4y zjY`3*fncEH|M-k2rAl#=`NwGn>H!Fx;Dsam9qC)lV)khmIm}`1DT!R>F&}!51uTT# z=K*W|X0bL~ICZ1&9dSw2f@?17;5k?6h|6@kHJ*Sn`U!jW7@CTlkTYvyP3&{qBD-Wl zVtYdN9Ozx>y)(ZG_QG?k`PMQTZDzsug$X%ZJSX5Y8xC}iex+^NJokr*ObW`&gH@VP z$@^ULGUc=qG%0CTsw%;u=+kPzQ7x0AEWnF2%@d`r?~{tMpY6u|Ea$6c1-Mn@ql(jE zQVnod+$O;=EGt@TQ`D9gn7G;NXitrXTz3kG4EL+JL?>zY$-}1`y0u@5w`E);L*1#xgDizrN_Qkrd3L}VepLEq+_*iC@r07g zo}*pG^S*Y#PQ5T^%X@%K92<+{_&xdiE?eDx&WA!}m5`ZG+po+SFS24=*0Ed}j%5pO zbpu|t1P$@Jj&Fr-*YfetIa+FtUzu8(q6?;v4FZOL9bWYnG!SA4e`W7E7~;x3A;$oQ zGY{r{W+5b+;Qm3kFj9xZTu3gd;w4kY>tHo{yh^~a<*u1}o8-BIK(kpK8)q%kT%<{r ziE_nk*H}e&cq$66=-T?$lUExn^pO+=1&808ZGiD*JkNHxgvii3ooEKZhO;=MJ7aV5 z9Fi{3&dpvRJJ3tu3sT3^uMd$v%;5p{@Dzjz4EKPnz9lw^Nd<{`Vm%~3-`Td0 zonv=`Noel}@?-4JoQaEZdV?c~%)TujLlU|s2?-|Q<^_gZehy8~leeJLEnbca<2GZZ z_LJcdq9^avI%qOv1LTnorkJ)e?bq^kAGBeoU2dR$4;HFLXuy1X$!c3&yKNoanmXZ9 z@d^U*dYD(n{s{JJU>M{Mg7B|G+cVU#{n|GaJCX zk>}@evrYJb4 z5A{+y;OTzc7qVeO-RfsjRdJHBo^Oz&ZFUIn7^AL6d8Hl2-)IL0*D$5qGo*85Lxq$@ z!nWl)OHS8m1Eqx4qJ2p#m+HMXmh&o2BU8m^OA@8k#2 zV5Jwi{07BNQ-D*R=W#rDyW6OZye|W2uzo1a54g=oVHkG9TV@`9XW2r5nUK?>xct2r zn;=T8x4JuopM@C^N;8S{r=4Ucm564w?k1NNDEzKA@_SrkxHm-i Kz~7R!=>7{0$J*Wi