貪心演算法與動態規劃的比較
4
、
1
動態規劃的定義
動態規劃是運籌學的一個分支,
與其說它是一種演算法,
不如說它是一種思維方法更貼切。
因為動態規劃沒有固定的框架,
即便是應用到同一道題上,
也可以建立多種形式的求解演算法。
許多隱式圖上的演算法,例如求單源最短路徑的
Dijkstra
演算法、廣度優先搜尋演算法,都滲透著
動態規劃的思想。
還有許多數學問題,
表面上看起來與動態規劃風馬牛不相及,
但是其求解
思想與動態規劃是完全一致的。
因此,
動態規劃不像深度或廣度優先那樣可以提供一套模式,
需要的時候,取來就可以使用。
它必須對具體問題進行具體分析、
處理,需要豐富的想象力
去建立模型,需要創造性的思想去求解。
4
、
2
動態規劃適於解決的問題
適用動態規劃的問題必須滿足最優化原理和無後效性。
⑴狀態必須滿足最優化原理。
作為整個過程的最優策略具有如下性質:
無論過去的狀態
和決策如何,
對前面的決策所形成的當前狀態而言,
餘下的諸決策必須構成最優策略。
可以
通俗地理解為子問題的區域性最優將導致整個問題的全域性最優,
即問題具有最優子結構的性質,
也就是說一個問題的最優解只取決於其子問題的最優解,非最優解對問題的求解沒有影響。
⑵狀態必須滿足無後效性。
所謂無後效性是指:
過去的決策只能通過當前狀態影響未來
的發展,
當前的狀態是對以往決策的總結。
它說明動態規劃適於解決當前決策和過去狀態無
關的問題。
狀態出現在策略的任何一個位置,
它的地位都是相同的,
都可以實施同樣的決策,
這就是無後效性的內涵。
4
、
3
動態規劃問題的特徵
動態規劃演算法的有效性依賴於問題本身所具有的兩個重要性質:
最優子結構性質和子問
題重疊性質。
①
最優子結構。當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結
構性質。
②
重疊子問題。
在用遞迴演算法自頂向下解問題時,
每次產生的子問題並不總是新問題,
有些子問題被反覆計算多次。
動態規劃演算法正是利用了這種子問題的重疊性質,
對每一個子
問題只解一次,而後將其解儲存在一個表格中,在以後儘可能多地利用這些子問題的解。
4
、
4
設計動態規劃法的步驟
⑴找出最優解的性質,並刻畫其結構特徵;
⑵遞迴地定義最優值
(
寫出動態規劃方程
)
;
⑶
以自底向上的方式計算出最優值;
⑷根據計算最優值時得到的資訊,構造一個最優解。
步驟
1- 3
是動態規劃演算法的基本步驟。
在只需求出最優值的情形下,
步驟
4
可以省略,
步驟
3
中記錄的資訊也較少;
若需要求出問題的一個最優解,
則必須執行步驟
4
,
步驟
3
中
記錄的資訊必須足夠多,以便構造最優解。
4
、
5
動態規劃演算法
[ 0/ 1
揹包問題
]
在該問題中需要決定
n
x
x
,......,
1
的值。假設按
i=1
,
2
,
......
,
n
的次
序來確定
x
i
的值。如果置
x
1
=
0
,則問題轉變為相對於其餘物品(即物品
2
,
3
,
......
,
n
)
,
揹包容量仍為
c
的揹包問題。若置
x
1
=1
,問題就變為關於最大揹包容量為
c-w
1
的問題。現
設
r& Icirc
;
{c-w
1
}
為剩餘的揹包容量。在第一次決策之後,剩下的問題便是考慮揹包容量為
r
時的決策。不管
x
i
是
0
或是
1
,
[x
2
,
......
,
x
n
]
必須是第一次決策之後的一個最優方案,
如果不是,則會有一個更好的方案
[y
2
,
......
,
y
n
]
,因而
[x
1
,
y
2
,
......
,
y
n
]
是一個更好的方
案。
假設
n=3
,
w=[ 100
,
14
,
10]
,
p=[ 20
,
18
,
15]
,
c=116
。若設
x
1
==1
,則在本次決策