写在前面:个人见解,仅供参考
首先,说明在代码中的实现:
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的路径,如果没有解决随机选择的问题,或者没有进行路径记录的话,将会陷入死循环,从而导致“灾难性”的延迟损耗。