From c62ba7bbb6e97aba83ca7f40f1b59769a8e5bf36 Mon Sep 17 00:00:00 2001 From: Xuan Trinh <xuan.trinh@student.unimelb.edu.au> Date: Sat, 27 Mar 2021 22:02:48 +1100 Subject: [PATCH] add more rule to rate an action{take travelled path into consideration} <- to avoid infiniteloop XUAN 10:00PM 27 mar 2021 --- Test_case/level_2/14.json | 43 +++++++ Test_case/level_3/13.json | 108 ++++++++++++++++++ search/__pycache__/main.cpython-38.pyc | Bin 1976 -> 2000 bytes search/__pycache__/search_algo.cpython-38.pyc | Bin 8742 -> 9309 bytes search/main.py | 44 +++++++ search/search_algo.py | 41 ++++++- 6 files changed, 234 insertions(+), 2 deletions(-) create mode 100644 Test_case/level_2/14.json create mode 100644 Test_case/level_3/13.json diff --git a/Test_case/level_2/14.json b/Test_case/level_2/14.json new file mode 100644 index 0000000..f95e9c9 --- /dev/null +++ b/Test_case/level_2/14.json @@ -0,0 +1,43 @@ +{ + "upper": [ + [ + "r", + 1, + -1 + ] + ], + "lower": [ + [ + "s", + -3, + 1 + ] + ], + "block": [ + [ + "", + -1, + -1 + ], + [ + "", + -1, + 0 + ], + [ + "", + -1, + 1 + ], + [ + "", + 0, + -2 + ], + [ + "", + 0, + 0 + ] + ] +} \ No newline at end of file diff --git a/Test_case/level_3/13.json b/Test_case/level_3/13.json new file mode 100644 index 0000000..40787b5 --- /dev/null +++ b/Test_case/level_3/13.json @@ -0,0 +1,108 @@ +{ + "upper": [ + [ + "p", + 0, + -3 + ], + [ + "s", + 0, + 0 + ] + ], + "lower": [ + [ + "r", + 0, + 1 + ], + [ + "p", + 0, + 2 + ], + [ + "r", + 2, + 0 + ] + ], + "block": [ + [ + "", + -1, + -3 + ], + [ + "", + -1, + -2 + ], + [ + "", + -1, + -1 + ], + [ + "", + -1, + 0 + ], + [ + "", + -1, + 1 + ], + [ + "", + -1, + 2 + ], + [ + "", + -1, + 3 + ], + [ + "", + 0, + 3 + ], + [ + "", + 1, + -4 + ], + [ + "", + 1, + -3 + ], + [ + "", + 1, + -2 + ], + [ + "", + 1, + -1 + ], + [ + "", + 1, + 0 + ], + [ + "", + 1, + 1 + ], + [ + "", + 1, + 2 + ] + ] +} \ No newline at end of file diff --git a/search/__pycache__/main.cpython-38.pyc b/search/__pycache__/main.cpython-38.pyc index 1ac4f3a1eb06acd9bcb68a9797aeb04de23944bd..306b913ed92d9ff2c02f03382457c5518ae3a453 100644 GIT binary patch delta 146 zcmdnNe}SJbl$V!_fq{XclsP`(lfp*6#mtOelQ%KzF;+}|$ehQL$xy;N*_%a~@y6tQ z7DdKilP9uRYO>X^*f11ss$q6vh?S}3EMZ^3QNvlnB*{?2S;8#IkjAu-k&$5nW1+_8 z&n#t(jGU9R*kt*lc*-)1GfU!&Qj_zGQYN>v^)OmZ7GYOp7GdO?tiUcl*_S;V0BV0H AS^xk5 delta 145 zcmcb>zk{DIl$V!_fq{X+?pIvGMe&V%i<udnCU0WaV=S2bkU4L1IEy^vg~{bCij1Eo z&t$RGWUXPbVJKWx!|cKkD^tr^!nT0DhO>l8lA(sPgjtdyjcFkxBf|v7LWRx0S;`pY zIHFiWA_H7+F&CE<MKK5YhexqF`}>6Y`W5jrFfdG>%htnaF<FaUkx^{2AA1u3tIsE~ diff --git a/search/__pycache__/search_algo.cpython-38.pyc b/search/__pycache__/search_algo.cpython-38.pyc index 9c6190551c3a2812e7abaca1b7123fa02b9eb34a..7f185dc34de8bb722305f1df201ef8f424c48ac6 100644 GIT binary patch delta 1403 zcmZ4Ha@T_|l$V!_fq{YHI%|AFpzTCH8OBo+wZrQ(84`t4*i$%K7@|Z{I8(S<7@|Z| zxKnsq7^1{dcvJXV7^1{e_)`R07@{On1XF}s7@{Oogi}OX7^0+7L{r3C7^0+8#8V_% z7@}lSWm6>QFs4YQNVl*=$)(7o$hI&<$*0Jr$hR;=DWoW*D7G*}DW)g|GiWNm1i3|% zapT)WCPw+q{>+_>jK-U9vg~DIbl5zdy^x79eljPQC8N(|XD&sF66O+?W=2Ma4u%fK z1*{7hve}9}YFM(^HkWW+U{vK{U|=X=sA1?}>|khS4rb6~^wVU##aEP=mmQx}8J}2C zkeZk?IhRL=v2XG$9tTGD$+vmrMQ^bd6lLa>+~O(AEY2*6FG@|$FG`vGizisThJk^h z7-T2|HxIKABL@=?qZm_>;pQY>2_{Cv$<_S1l9NG7_&{FZ=3(SuWMSf96k+0HEHatQ zC?Lz|H(6ewjPcs!X#(1ek0$d8>KT-<)G*YrN;1^2Nix*1HZw6Y<i(V*)-WMNA>t)$ z*-R4{i|jy}gfKO2wh>&zsK$Paxj40?NQr@gp-7Q|f#DW&VoJ&_{*=_@qSVCVRG5eV z3P~{<PnHn2=Q3hoU|0!qvBl&>Va<9LCJ|;CCN4$+CILnkCLu;1rXrAvWG0Y*pcuqv zVPIfz25B>6U|^^L1u>%}!ve;I4B6~Oaw&`@3^k0B3^fck40$3jHY<Z9Lkgog12cmS zLkUALgC>(-5y%)#rXqcib3tzA(`1U`D9A6)EXmBzE8>~_kyBXQoPmMi3CJoAkp0X8 zjC@QYj78>?1sFvpuM_6vo58@qkiuBYT*KhP5F0i5sIZS+CPN8R4T}v!3R5j}Ax8~! z(UcPA8pdYE66PAFX2xumqA6g-Vzn$aEHzBoY(-s#H6<)H;B-`2v)NsQnUR+j5r{?l zlY>Nawcmjpp#X9OI}0NRqZ}g#qYxt-2r_XnvayITaxif)GBI&671?fnA$p&Q(Q@($ z2~{==1_lN`#>t;0bQmo*D@dxaFdA)kmA$~kXg^s@!9nYmKuTtDNn&1dYJ5^^NqK5& z-Yx#pf`Zf{m(1jnfXvk7)Z!uyQ23ZlE>;L&wE;0FpHR?dv;l=cJtzdh5fKDU={1Zs zOp*-EOts7@jI}H^3?*Rx0w!?I(1Y-57$g~LS!$STSi~7>SwT6dhM}1;g-M*Dgr$bH znNgepl%r}`gBdiL{fZbF7#OOUtQ0g^i#$NK!(*#RkD(rv#EMIbG}(&OKyqN0g7U{L zmZZeu)F|Gf)RfZX)cCZ-<dXcND4xWWtkU9=_~PXJqSPWjkPa}x4`Qh@FfhzwWMC); z2{EwnF|sfTF!C^QFiJ2Mf#m!&m7+w8Qxl7lGxT!v%TjYw^GYUjD_YgtgA;m?fA}pn zXMdkiU%w(pka<oZ!V*NdfCx7b;RzyKK?K;PrXZF(hyay;kaQ>j;);O?P+S*@gII<j z!URNsazha)Nfz0HZOzOp5i9~lagi=a8XP^UlaDE?G1^RitEeK)$-=}T!okZS&mqep T&LPHO&B4W?z^B6Dz@Y&EZP_Zf delta 878 zcmccXvCM@pl$V!_fq{WR{dZh~oW(>w8OCiBwZl_V*i$%K7@~wzI8(S<7@|Z{xKnsq z7@|Z|cvJXV7^1{d_)`R07^1{e1XF}s7@{Ongi}OX7@{OoL{r3C7^0+7rBlS`Fs4YP zNVc#<$)rf7NVhOV$)?Dp$hI&<$)(5zGib_h{FTAPD84zFxs#Dmd-GeCy-bW2n^&_J zGBJivmgTZ!beSB^r6|zB(80KXc_BkKTaiNzOBT!K30xN#HTf7A7)lsw7&;g`7$g~* znSvQK8T~XFZwaJi7MCREC8x$GrIwVZrshp<<<a48V_;zT4Dw}_-sCu5naMYJq!d_- z6c`v7Zn33Sl%(dR+!9DkNr^8m&&*4YPfRY!%+H&w&KoRR!oa{#3=SV|9%dnC9!4>y zBK^%1c_o+_^(U|5&z0;3DF8W!ft!bsgOP=agHeQukFm&TvVnjsqt;|UfilKTlaC5$ zGhUedQ9w^F&#Q!`hN*_3hE<ZGhE0+|lA(sRnW=;|n`r`LkrYVD=6=C7jG}C}n2S?O zij)`_7>X1@?qp6(Ntv7|EX8OzxklKY%YcD_VIjzFlgUSgHLcm0Wtg}a1(*aFSr~bk zia@f-%pea#F&hH|0|+~Vv`k=NU`S!CWv*dxVTcWyd_ly=EQP6-xsaoVxu~avsfMwc zv4p9HshKgGrKkt2NUWBnhNXrno2{s+u%v{!hNYR2k)g0;bCf7EBL@rAm6Nl?ay4&) zERX})%Fe>b!6?Vb!6?MY27xRhj2uiHj7&^iOhs0knZ)liF`7+&B&o_~%D}+zonbPs zln$fmW-BQb7DnmK@p2cK7;PpSC_2a%se%H4zqFtrwa6tixg;PnH957oNCOl$CX;6= z2C!N(Ffc?<ey^y_4r2Lf%1@S2_I9-aX=4uZ55L9c?C%rm>sMq4(qa!H%s_-AhyVpi zkt>Mh1R}tu8iQCaAcAZ1Mr8>VeGt<KM1VrJ$O>$5W?o4V$mK=4APLLK-<8!E%_hsK csE9Iih;Z<7$aBbYh;xW>Sa8Vksc<*|0I*rYLI3~& diff --git a/search/main.py b/search/main.py index d463cb9..adf2170 100644 --- a/search/main.py +++ b/search/main.py @@ -76,6 +76,7 @@ def parse_input(data): nums = nums + 1 keyWrite = "S" + str(nums) upperDictPieces[keyWrite] = (piece[ROW], piece[COLUMN]) + visit_record[keyWrite] = {} # parse the Lower player's token nump, numr, nums = 0, 0, 0 @@ -146,3 +147,46 @@ def parse_input(data): # '-._.-'-._.-'-._.-'-._.-'-._.-'-._.-' # | | | | | | # '-._.-'-._.-'-._.-'-._.-'-._.-' + # Situation 2.B (B are blocks) + # how to tell if there are no way to reach the target + # + # .-'-._.-'-._.-'-._.-'-._.-'-. + # | | | | | | + # .-'-._.-'-._.-'-._.-'-._.-'-._.-'-. + # | | | | | | | + # .-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-. + # | | | | | r | | | + # .-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-. + # | B | B | B | B | B | B | B | | + # .-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-. + # | B | P | | | S | r | p | B | | + # '-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-' + # | B | B | B | B | B | B | B | | + # '-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-' + # | | | | | | | | + # '-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-' + # | | | | | | | + # '-._.-'-._.-'-._.-'-._.-'-._.-'-._.-' + # | | | | | | + # '-._.-'-._.-'-._.-'-._.-'-._.-' + # Scenario 3: + # can cause a infinite loops. + # .-'-._.-'-._.-'-._.-'-._.-'-. + # | | | | | | + # .-'-._.-'-._.-'-._.-'-._.-'-._.-'-. + # | | | | | | | + # .-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-. + # | | | | | | | | + # .-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-. + # | | | R1 | | | | | | + # .-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-. + # | | | B | | B | | | | | + # '-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-' + # | | | B | B | B | | | | + # '-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-' + # | | | | | | | | + # '-._.-'-._.-'-._.-'-._.-'-._.-'-._.-'-._.-' + # | | | s1 | | | | + # '-._.-'-._.-'-._.-'-._.-'-._.-'-._.-' + # | | | | | | + # '-._.-'-._.-'-._.-'-._.-'-._.-' diff --git a/search/search_algo.py b/search/search_algo.py index 5b9dfef..9c6415f 100644 --- a/search/search_algo.py +++ b/search/search_algo.py @@ -19,6 +19,14 @@ targetDict = {} targeted_l_piece = set() setBlocks = set() +# to handle the issue of hit dead end by just choose the minimal action. +# { piece_key: { +# (row, column) : #visit +# ... +# } +# } +# each time a token visit a tile: mark it , the more time it visit a tile, the less appeal it is . +visit_record = {} def make_board(lowerPieces, upperPieces, setBlocks): """ @@ -128,10 +136,10 @@ def make_priority_list_of_action(upperDict, piece, targetDict, board): # add all the swing action to queue position_list.extend(add_swing_action(upperDict, piece, board)) - + print(visit_record) # sort the list base on the how close it is to target if piece in targetDict.keys(): - position_list.sort(key=(lambda x: distance_between(x, targetDict[piece]))) + position_list.sort(key=(lambda x: rank_by_appeal(x, targetDict,piece))) return position_list @@ -199,6 +207,8 @@ def choose_optimal_combination(possible_action, upperPieces, board, targetDict): board[possible_action[piece][index]] = piece moved = True + + decrease_appeal(possible_action[piece][index], piece) else: # check if no collision happen: if piece_collision(board[possible_action[piece][index]], piece) == DRAW: @@ -208,11 +218,22 @@ def choose_optimal_combination(possible_action, upperPieces, board, targetDict): board[possible_action[piece][index]] = piece moved = True + + decrease_appeal(possible_action[piece][index], piece) index += 1 return upperPieces +def decrease_appeal(position, piece): + global visit_record + + if position not in visit_record[piece].keys(): + visit_record[piece][position] = 1 + else: + visit_record[piece][position] += 1 + return visit_record + def check_if_piece_hit_target(upperPieces, lowerPieces, targetDict): """ @@ -229,6 +250,8 @@ def check_if_piece_hit_target(upperPieces, lowerPieces, targetDict): removed = removed_piece del targetDict[piece] del lowerPieces[removed] + # reset the visited node since piece start a new journey + visit_record[piece] = {} removed = True # once the piece hit it target, it is free to find a new target. # if there are more lower piece then which already targeted {some lower piece is not target} @@ -383,3 +406,17 @@ def find_target(piece_key): targetDict[piece_key] = lowerDictPieces[targetPiece] targeted_l_piece.add(targetPiece) + +def rank_by_appeal(x, targetDict, piece): + # distance_between(x, targetDict[piece]) + # make_priority_list_of_action(upperDict, piece, targetDict, board) + # the reduce would base on how close it is to its target and how many time we visit this. + base = distance_between(x, targetDict[piece]) + reduce_factor = 0 + + if x in visit_record[piece].keys(): + reduce_factor = visit_record[piece][x] + + adjust_score = base + reduce_factor + print(str(x) + ": " + str(adjust_score)) + return adjust_score -- GitLab