车载通信与导航(十):python模拟解决死端问题

写在前面:个人见解,仅供参考
首先,说明在代码中的实现:

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的路径,如果没有解决随机选择的问题,或者没有进行路径记录的话,将会陷入死循环,从而导致“灾难性”的延迟损耗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章