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

來源:互聯網
上載者:User

 

動態規劃,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時終止。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.