動態規劃法 01揹包問題

2022-09-18 08:33:44 字數 3323 閱讀 1133

一 幾個概念:

最優化問題:有

n個輸入。它的解由這

n個輸入的乙個子集組成,這個子集必須滿足某些事先給定的條件。這些條件稱為約束條件。滿足約束條件的解稱為問題的可行解。

滿足約束條件的可行解可能不止乙個,為了衡量這些可行解的優劣,事先給出一定的標準,這些標準通常以函式的形式給出。這些標準函式稱為目標函式,使目標函式取得極值的可行解成為最優解。這類問題稱為最優化問題。

二 最優性原理:

對於乙個具有

n個輸入的最優化問題,其求解的過程往往能夠劃分為若干個階段,每個階段的決策僅依賴前一階段的狀態,由決策所採取的動作使狀態發生轉移。成為下乙個階段的根據。從而。乙個決策序列在不斷變化的狀態中產生。

這個決策序列產生的過程稱為多階段決策過程。

在每個階段的決策中有乙個賴以決策的策略或目標,這樣的策略或目標是由問題的性質和特點所確定。通常以函式的形式表示並具有遞推關係。稱為動態規劃函式。

多階段決策過程滿足最優性原理:不管決策過程的初始狀態和初始決策是什麼,其餘決策必須相對於初始決策所產生的當前狀態,構成乙個最優決策序列。

假設乙個問題滿足最優性原理通常稱此問題具有

最優子結構性質

。三 特徵

我們知道動態規劃是求解全域性最優解的有效方法,一般來說能用動態規劃演算法求解的問題具有下面兩個顯著特稱:

四 設計方案

動態規劃法設計方案

五 01揹包問題

0/1揹包問題中,物品

i或者被放入揹包。或者不被放入揹包。設

xi表示物品

i裝入揹包的情況,則當

xi=0

時。表示物品

i沒有被裝入揹包。

xi=1

時,表示物品

i被裝入揹包。依據問題的要求,有例如以下約束條件和目標函式:

圖 1 約束條件

圖2 目標函式

f[i,j]

表示在前i

件物品中選擇若干件放在承重為j

的揹包中,能夠取得的最大價值。

pi表示第i

件物品的價值。

決策:為了揹包中物品總價值最大化,第i

件物品應該放入揹包中嗎?

六 動態規劃法解決方式

有編號分別為a,b,c,d,e

的五件物品。它們的重量各自是2,2,6,5,4

。它們的價值各自是6,3,5,4,6

,如今給你個承重為10

的揹包,怎樣讓揹包裡裝入的物品具有最大的價值總和

name

weight

value12

3456

78910

a260

6699

1212

151515b

2303

3669

991011c6

5000

6666

61011d

5400

0666

661010e4

6000

6666

666表

10/1

揹包問題動態規劃法表1

採用自底向上

自左向右的方式生成的。

e1表示在揹包容量為

1的情況下只放入物品

e的價值,因容量

1<4

因此價值為

0;依此類推當揹包容量為

4時。單元格

e4的價值為

6。容量繼續**也只能放置

e。因此價值持續為6。

d行可參照遞推式

f[i,j]=

max例如以下描寫敘述

i<=5時,d

行**價值與

e行同樣;

i>=6

時,比方第

6行,選取

max即

max=max = 6;

依此類推

d9=max=10;

依次類推可計算

c/b/a的值,

然後依據最大價值返算最優路徑。

d1表示揹包容量為

1的情況下放置物品d和

e後的價值,因

e的重量為

4>1。且d

的重量為

5>1

因此價值為

0。直至第5列

(不包含

d5)d

行**的內容與

e行同樣。

七 程式實現c#

**段1 測試函式

class mainclass

; objs[1] = new obj() ;

objs[2] = new obj() ;

objs[3] = new obj() ;

console.writeline ("dynamicprogramming model:");

dynamicprogramming d = new dynamicprogramming (objs, 10);

int price = d.execute ();

d.printing (price);

} }

**段2 實現函式

public class dynamicprogramming

public dynamicprogramming (obj objs, int w)

m_n = objs.length;

this.objs = objs;

m_w = w;

m_v = new int[m_n + 1, m_w + 1];

for (int i = 0; i < m_w+1; i++)

for (int i = 0; i < m_n+1; i++)

} public int execute()

else }}

//求裝入揹包的物品

int weight = m_w;

for (int i = m_n; i > 0; i--)

}return m_v[m_n, m_w];

} public void printing(int price)

console.writeline(">, price: " + price );

} }

輸出結果:

注:上述程式使用freebsd下mono開發。

0 1揹包問題 動態規劃法

問題描述 給定n種物品和一揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 1揹包問題。資料...

0 1揹包問題 動態規劃法

問題描述 給定n種物品和一揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 1揹包問題。資料...

動態規劃法 0 1揹包問題 二

假如我們用c表示最大價值,那麼c n,w 就表示n個物品,在揹包容量為w時,揹包的最大價值。在求這個最大價值之前,我們可能會考慮某一子問題的最大價值,用c i,w 表示,意思是該子問題中,有i個物品,揹包的最大容量為w時的最大價值。現在,結合具體問題來說明。物品編號12 345重量 3478 9價值...