一 幾個概念:
最優化問題:有
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**段2 實現函式; 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);
} }
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價值...