車載通信與導航(十):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的路徑,如果沒有解決隨機選擇的問題,或者沒有進行路徑記錄的話,將會陷入死循環,從而導致“災難性”的延遲損耗。

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