c 遍歷所有點且距離最短 最短路徑之A 演算法

2021-10-16 10:51:43 字數 2114 閱讀 6707

在求最短路徑問題是,如果去除負權邊的情況,可以使用dijkstra演算法來替代貝爾曼-福特演算法,複雜度更優。接下來介紹的a*演算法,也是一種相對更優的演算法。看下圖:

使用dijkstra演算法來計算ab的最短路徑,基本上要把所有的點、邊都遍歷,才能得到最短路徑——綠線。但是站在人類的角度來看,藍線是不需要考慮的,因為有個成語叫「南轅北轍」,我們非常清楚地知道,按照藍線走,哪怕走一步,都離目標b遠了。所以在搜尋路徑的時候,完全可以拋棄藍線。等於是在眾多分支中,「剪」去一條——這就是「剪枝」。

那麼按照什麼標準「剪」,就很重要了,這裡引出下乙個概念——估價函式。

正如之前所說,我們之所以「剪」去藍線,就是因為我們「估計」走藍線會離目的地的「距離」更大。所以我們可以通過估價函式,先「估」出起點到終點的距離,在搜尋路徑的時候,如果某條路線距離目的地的距離越來越大,則可以「剪」去。

當然,估值對演算法的影響很大。估大了,比如100萬公里,去趟月球再繞回來都有富餘;估小了,比如1公尺,那連門都出不了了。

在a*演算法中,常用的距離估價函式就是之前寫的三個,不再贅述。下面著重講a*演算法。

如上圖,設盡可上下左右移動,距離估價函式使用曼哈頓距離,邊權重統一為10,起點8,終點18,10,16,22為障礙物。

我們要對節點進行鬆弛操作,也就是將節點的權重降至最小。a*演算法相比較貝爾曼-福特演算法、dijkstra演算法重要的不同之一就是對權重值的計算,函式如下:

權重值f=起點到節點的移動代價g+節點到終點的預估距離h。

a*演算法設定兩個集合:open——待處理節點、close——已處理節點。

演算法描述:

0、初始化open集合,將起點放入open中,權重為0。1、遍歷open集合 1.1、如果open為空則說明搜尋完成,跳出。 1.2、不為空,取出權重最小的節點。  1.2.1、節點是終點,跳出。  1.2.2、節點非終點。   1.2.2.1、從open挪入close。   1.2.2.2、遍歷節點的臨近節點。    1.2.2.2.1、臨近節點在close中,跳出。    1.2.2.2.2、臨近節點不在open中:                      計算起點到臨近節點的曼哈頓距離g;計算臨近節點到終點的曼哈頓距離h;總距離f=g+h;放入open集合中;修改節點的g、h值;記錄父節點。    1.2.2.2.3、臨近節點在open中:                      獲取臨近節點原g——tmpg;起點經父節點到臨近節點的新距離g=(父g+10);                      如果tmpg<=g,跳出。                      如果tmpg>g:臨近節點新總距離f=g+原h;放入open集合中;修改臨近節點的g值;記錄父節點。//這一步就是鬆弛操作,三個距離f、g、h,使用g作比較,是因為節點到終點的距離h是固定的,g越小,說明起點到節點的距離越小,總距離f就越小。
**如下:

public void getshortestpath(int start, int end)             // 將最小權重節點從open集合移除,加入close集合            closemap.put(min.getkey(), min.getvalue());            openmap.remove(min.getkey());            // 開始遍歷min的臨近節點。完全可以採用map的資料結構            for (map.entry entry : nodemap.entryset())                 // 臨近節點在close集合中                if (closemap.containskey(entry.getkey()))                 // 臨近節點不在open集合中                if (!openmap.containskey(entry.getkey()))  else                 }            }        }    }
在**中,node就4個屬性:座標x、y;距離h、g——初始值都是integer.max_value。不再贅述。

額外要說的是節點路徑集合table ppw,這個是我沿用以前的**,並不優化,大家完全可以構建乙個map替換。

遍歷所有點的最短路徑python 所有節點最短路徑

如果您嘗試在所有節點上迴圈,可以對初始值current執行迴圈。這將需要對 進行最少的修改 nodes a b c d e f g distances a d g c e f for start in nodes current start currentdistance 0 unvisited v...

最短路徑(C )

描述 給出乙個有向圖g v,e 和乙個源點v0 v,請寫乙個程式輸出v0和圖g中其它頂點的最短路徑。只要所有的有向環權值和都是正的,我們就允許圖的邊有負值。頂點的標號從1到n n為圖g的頂點數 格式輸入格式 第1行 乙個正數n 2 n 80 表示圖g的頂點總數。第2行 乙個整數,表示源點v0 v0 ...

迷宮 最短路徑距離 BFS

已知條件 迷宮地圖 0 不通,1通 二維陣列 n m 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0 0 1 起始點 s 2,2 求解所有可通過的點到起始點的最短距離。演算法 include in...