寫在前面:個人見解,僅供參考
首先,說明在代碼中的實現:
def search(self,aax,aay,aim):
lx=0
ly=0
ppx=0
ppy=0
nx=0
ny=0
ax=aax
ay=aay
self.n=0
for o in range(99):
le=9999
print(o,ax,ay)
self.n=self.n+1
for i in range(ax-6,ax+6):
if i>=0 and i<64:
for j in range(ay-6,ay+6):
if j>=0 and j<64:
if aim.x==i and aim.y==j:
return self.n
if map[i][j]==2 and i!=ax and j!=ay and i!=ppx and j!=ppy and i!=nx and j!=ny:
if le>=int((aim.x-i)*(aim.x-i)+(aim.y-j)*(aim.y-j)):
le=int((aim.x-i)*(aim.x-i)+(aim.y-j)*(aim.y-j))
lx=i
ly=j
if le!=9999:
ppx=ax
ppy=ay
ax=lx
ay=ly
else:
nx=ax
ny=ay
ax=ppx
ay=ppy
簡單地講,就是記錄了一個死端nx和ny,噹噹前節點陷入死端的時候,就會進行回溯,回到存儲的ppx和ppy這個點,然後把之前的點設置爲死點,並進行新的周邊轉發,直到找到新的路。
這裏講一下什麼時候會陷入死端:
死端大致就是這個意思,想從0到5,但是在0選擇1和2的時候,由於1更近,所以會進入1,而從1會選擇更近的3,那麼,如果3和5的距離過遠,導致無法從3到達5的時候,就會陷入“無路可走”的情況,即死端。
這個時候,就要求能夠從3返回到1,然後再從1開始轉發,並能夠不選擇距離5更近的3,而選擇2,並找到正確路線。
然後,我在思考的時候,想到了另一種可能的“死端情況”:
如這種,想從0到圓心,那麼從0開始,會到2,然後2將會從1和3之間選擇一個作爲下一節點,但是,由於1和3距離圓心距離相等,所以這就牽扯到一個隨機選擇的問題,如果沒有解決這個問題,就有可能陷入2-3-2或者2-1-2的死循環,而我們期望的是2-3-6-7或2-1-4-5-7的路徑,如果沒有解決隨機選擇的問題,或者沒有進行路徑記錄的話,將會陷入死循環,從而導致“災難性”的延遲損耗。