動態規劃,Dijkstra演算法,A 演算法的比較

2021-04-30 12:56:29 字數 2287 閱讀 6307

動態規劃,dijkstra演算法,a*演算法的框架是相同的,不同點僅在於「推進點的選取」和「演算法終止條件」。

一,動態規劃:(參見http://blog.csdn.net/iwantnon/archive/2009/07/07/4329269.aspx )

推進點選取:

(1),在粗獷的動態規劃演算法中:

根本不進行選擇,而是對所有已存在節點全部推進一遍。這可能造成如下兩點浪費:

[1],重複推進:對某點v已經作了推進,而下一次在其valu值沒有發生更改的情況下又一次對它進行推進,顯然這第二次推進得不到任何新東西,所以是白費的。

[2],推進失效:對某點v作了推進以後,又對點u作推進,而u恰好將點v的valu值重新整理,於是當初對點v所作的推進失效(應該用點v的新valu值重新推進)。

(2),在帶open標記的動態規劃演算法中:

對點v進行推進後將其關閉(令v.open=false),由於在選擇推進點時只從處於開啟狀態的點中選,這樣就避免了重複推進v點,除非v點valu值被重新整理而再次變為開啟(v.open=true)狀態。即解決了」重複推進「問題,但並沒有解決」推進失效「問題。

終止條件:

無論是在粗獷動態規劃演算法還是在帶open標記的動態規劃演算法中,為了保證得到終點的最優值都必須「充分推進」--即推進|v|-1次。

二,dijkstra演算法:(參見:http://blog.csdn.net/iwantnon/archive/2009/07/07/4329316.aspx )

推進點選取:

dijkstra 演算法建立在帶open標記的動態規劃演算法之上,但在選取推進點時只選取valu值已達終態的點v(稱為"極元")。由於v的valu值已達終態,所以它不 可能再被其它點重新整理,這樣就避免了「推進失效」。那麼,什麼樣的點可以作為「極元」呢?極元是否存在及如何構造,是要根據具體問題來分析的,例如:

(1),在"非負權值最短路徑"問題中,dis最小的點v就可以取作"極元",原因是由於所有權值非負,所以其它點推進後dis值會更加大於v的dis值,所以不可能將v重新整理。

(2),再如「**組合」問題中(注),可以狀態座標距st.loc歐氏距離(或曼哈頓距離)最小的狀態點v為「極元」,原因是其它點推進後其距st.loc的歐氏距離(或曼哈頓距離)定會進一步增大,從而不可能重新整理v點。

(3),再如在"最優排列問題"(例如」旅行商問題「和"工序問題")中,我們可以取已用過的物件集s中物件可個最少的狀態點v作為"極元",原因是其它所有狀態點推進後物件集必將進一步擴大,從而不可能刷到v點。

由此可見,「極元」的構造往往依賴於推進過程中某個特徵量的單調性。

終止條件:

由 於dijkstra演算法中極小元在每次推進後被關閉,並且由於其valu值已達終態,所以不會再被重新整理,因此不會被再次開啟。也就是說:dijkstra 演算法中任何時刻open=false的點都是valu已達終態的點。所以一旦ed.open==false,則可終止程式。這個在某些情況下與動態規劃中 必須推進滿|v|-1次相比要節約。

注:**組合問題:

1),min型:有a,b,c三種商品,1a=3元,1b=2元,1c=4元。另提供下列組合:1a+1b=4元,1a+2b+1c=9元,1b+1c=5元。現要買8a+9b+9c,問最少花多少錢?

2),max型:有a,b,c三種商品,買1a給3個贈品,買1b給2個贈品,買1c給4個贈品。另提供下列組合:買1a+1b給8個贈品,買1a+2b+1c給13個贈品,買1b+1c給7個贈品。現要買8a+9b+9c,問最多可得贈品多少個?

三,a*演算法:(參見:http://blog.csdn.net/iwantnon/archive/2009/07/07/4329286.aspx )

推進點選取:

a*演算法也是每次只推進乙個點,但它是選取當前評價值(注1)最好的點。

由於評價值最好的點未必是極元,所以a*演算法存在「推進失效」,不過只要推進的次數足夠多(例如推進到所有節點都關閉),顯然a*演算法能得到最優解。

不過a*演算法的目的是:較快地(推進次數較少)得到比較滿意的結果。因此往往類似於dijkstra演算法,推進到ed.open=false時就結程式(注2)。由於a*演算法不能像dijkstra演算法那樣保證處於關閉狀態的節點都已達終態,所以得到近似最優解。

注1:評價值=costed+willcost(或者wined+willwin),其中costed(或wined)即為當前valu值,而willcost(或willwin)則需要估計來確定。

注2:如果是在所有節點都關閉時結束,則狀態空間將包含所有狀態,故空間複雜度與動態規劃相同(因而高於dijkstra演算法)。又由於存在「推進失效」,所以時間複雜度也比dijkstra演算法高。

終止條件:

上面已提到,a*演算法往往取ed.open=false時終止。

Dijkstra和動態規劃

如果 在 u中 cdis v dis v 如果 和 中某點 直連 cdis v min dis u w u,v 其他情況 cdis v inf貪心 動態規劃,應該都是這個框架,沒有直接的 迴圈了 import heapq import numpy as np defdijkstra graph,st...

旅遊規劃 Dijkstra演算法

終於又遇到了一遍過的題目了,果然只要不和007對上我還是可以的。有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度 以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。輸入說明 輸入資料的第...

動態規劃之Dijkstra演算法求最短路徑

問題描述 王老師家住在a地,他要去學生b c d e f h家進行家訪,已知每個學生家之間的距離,現在求王老師家到每個學生家的最短路徑,好讓王老師做出計畫。思路分析 用圖的鄰接矩陣matrix表示各地之間的距離,a到j的最短路徑表示為dist j min 動態規劃的遞推公式 dist j 初始化為m...