1. 程式人生 > >貪心演算法與動態規劃的比較

貪心演算法與動態規劃的比較

4

動態規劃的定義

動態規劃是運籌學的一個分支,

與其說它是一種演算法,

不如說它是一種思維方法更貼切。

因為動態規劃沒有固定的框架,

即便是應用到同一道題上,

也可以建立多種形式的求解演算法。

許多隱式圖上的演算法,例如求單源最短路徑的

Dijkstra 

演算法、廣度優先搜尋演算法,都滲透著

動態規劃的思想。

還有許多數學問題,

表面上看起來與動態規劃風馬牛不相及,

但是其求解

思想與動態規劃是完全一致的。

因此,

動態規劃不像深度或廣度優先那樣可以提供一套模式,

需要的時候,取來就可以使用。

它必須對具體問題進行具體分析、

處理,需要豐富的想象力

去建立模型,需要創造性的思想去求解。

4

動態規劃適於解決的問題

適用動態規劃的問題必須滿足最優化原理和無後效性。

⑴狀態必須滿足最優化原理。

作為整個過程的最優策略具有如下性質:

無論過去的狀態

和決策如何,

對前面的決策所形成的當前狀態而言,

餘下的諸決策必須構成最優策略。

可以

通俗地理解為子問題的區域性最優將導致整個問題的全域性最優,

即問題具有最優子結構的性質,

也就是說一個問題的最優解只取決於其子問題的最優解,非最優解對問題的求解沒有影響。

⑵狀態必須滿足無後效性。

所謂無後效性是指:

過去的決策只能通過當前狀態影響未來

的發展,

當前的狀態是對以往決策的總結。

它說明動態規劃適於解決當前決策和過去狀態無

關的問題。

狀態出現在策略的任何一個位置,

它的地位都是相同的,

都可以實施同樣的決策,

這就是無後效性的內涵。

4

3

動態規劃問題的特徵

動態規劃演算法的有效性依賴於問題本身所具有的兩個重要性質:

最優子結構性質和子問

題重疊性質。

最優子結構。當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結

構性質。

重疊子問題。

在用遞迴演算法自頂向下解問題時,

每次產生的子問題並不總是新問題,

有些子問題被反覆計算多次。

動態規劃演算法正是利用了這種子問題的重疊性質,

對每一個子

問題只解一次,而後將其解儲存在一個表格中,在以後儘可能多地利用這些子問題的解。

4

4

設計動態規劃法的步驟

⑴找出最優解的性質,並刻畫其結構特徵;

⑵遞迴地定義最優值

寫出動態規劃方程

以自底向上的方式計算出最優值;

⑷根據計算最優值時得到的資訊,構造一個最優解。

步驟

1- 3 

是動態規劃演算法的基本步驟。

在只需求出最優值的情形下,

步驟

可以省略,

步驟

中記錄的資訊也較少;

若需要求出問題的一個最優解,

則必須執行步驟

4

步驟

記錄的資訊必須足夠多,以便構造最優解。

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

或是

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 

,則在本次決策