關(guān)于動(dòng)態(tài)規(guī)劃的初步討論

摘要

?? ? 1.01背包問(wèn)題:有n個(gè)物品和一個(gè)容量為c的背包,從n個(gè)物品中選取裝包的物品毫痕。物品i的重量為wi征峦,價(jià)值為pi。一個(gè)最佳背包裝載指消请,物品總價(jià)值最高的可行背包裝載栏笆。max(sum(pi*xi)),約束條件是sum(wi*xi)<=c,xi的01表示物品是否放入背包。? ?

? ? 2.所有定點(diǎn)對(duì)之間的最短路徑:所有頂點(diǎn)對(duì)之間的最短路徑問(wèn)題是指向有向圖G臊泰,尋找每一對(duì)頂點(diǎn)之間的最短路徑蛉加。即對(duì)于每對(duì)頂點(diǎn)(i,j),要尋找頂點(diǎn)i到頂點(diǎn)以及從頂點(diǎn)j到頂點(diǎn)i的最短路徑缸逃。

? ? 3 .網(wǎng)組的無(wú)交叉子集:給定一個(gè)上下兩邊有n個(gè)針腳的布線通道和一個(gè)排列C针饥。頂部的針腳i與底部的Ci相連。數(shù)對(duì)(i需频,Ci)稱為網(wǎng)組丁眼。總共有n個(gè)網(wǎng)組需連接或連通昭殉。假定有兩個(gè)或更多布線層苞七,其中一個(gè)為優(yōu)先層。其連線更細(xì)挪丢,電阻更小蹂风。任務(wù)是盡可能把更多的網(wǎng)組布設(shè)在優(yōu)先層,尋找一個(gè)最大無(wú)交叉子集乾蓬。

解決

1.建立背包問(wèn)題的動(dòng)態(tài)規(guī)劃遞歸公式惠啄。返回值是發(fā)f(1,c)的值,利用全局變量profit,weight和numberofobjects。物體價(jià)值和重量分別用profit[1:numberofobjects]和weight[1:numberofobjects]來(lái)表示撵渡。

遞歸函數(shù):

int f(int i, int thecapacity)

? ? if (i==numberofobjects)

return(thecapacity

? ? if(thecapacity

return f(i+1,thecapacity);

return max(f(i+1,thecapacity),f(i+1,thecapacity-weight[i])+profit[i]);


? 完整算法:

#include

#include

int V[200][200];//前i個(gè)物品裝入容量為j的背包中獲得的最大價(jià)值

int max(int a, int b)

{

? ? if (a >= b) return a;

? ? else return b;

}

int KnapSack(int n, int w[], int v[], int x[], int C)

{

? ? int i, j;

? ? for (i = 0; i <= n; i++) V[i][0] = 0;

? ? for (j = 0; j <= C; j++) V[0][j] = 0;

? ? for (i = 0; i < n; i++){

? ? ? ? for (j = 0; j < C+1; j++){

? ? ? ? ? ? if (j

? ? ? ? ? ? else

?? ? ? ? ? V[i][j] = max(V[i - 1][j], V[i - 1][j - w[i]] + v[i]);

? ? ? ? } }

? ? j = C;

? ? for (i = n - 1; i >= 0; i--)

? ? {

? ? ? ? if (V[i][j]>V[i - 1][j])

? ? ? ? {? x[i] = 1;

? ? ? ? ? ? j = j - w[i]; }

? ? ? ? Else x[i] = 0;

? ? }

? ? printf("選中的物品是:\n");

? ? for (i = 0; i

? ? ? ? printf("%d ", x[i]);

? ? printf("\n");

? ? for (int i = 0; i < n; i++){

? ? ? ? for (int j = 0; j < C+1; j++){

? ? ? ? ? ? printf("%d\t ", V[i][j]);

? ? ? ? ? ? if (j == C){

? ? ? ? ? ? ? ? printf("\n");

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? return V[n - 1][C];

}

int main()

{

? ? int s;//獲得的最大價(jià)值

? ? int w[5] = {2,2,6,5,4};//物品的重量

? ? int v[5] = {6,3,5,4,6};//物品的價(jià)值

? ? int x[5];//物品的選取狀態(tài)

? ? int n = 5;

? ? int C=10;//背包最大容量

? ? s = KnapSack(n, w, v, x, C);

? ? printf("最大物品價(jià)值為:\n");

? ? printf("%d\n", s);

? ? system("pause");

? ? return 0;

}

2.所有頂點(diǎn)對(duì)之間的最短路徑:當(dāng)邊上的權(quán)都不是負(fù)值的時(shí)候融柬,所有頂點(diǎn)對(duì)之間的最短路徑可以用dijkstra單源算法n次來(lái)求解,每一次都選擇n個(gè)頂點(diǎn)中的一個(gè)頂點(diǎn)作為源點(diǎn)姥闭。這個(gè)過(guò)程的時(shí)間復(fù)雜度為O(n^3)〉ず瑁現(xiàn)采用foly算法,相關(guān)的常數(shù)因子比Dijkstra算法要小棚品。

? ? 假設(shè)G中有n個(gè)頂點(diǎn),從1到n編號(hào)廊敌。c(i,j,k)表示從頂點(diǎn)i到j(luò)到一條最短路徑的長(zhǎng)度铜跑,其中間頂點(diǎn)的編號(hào)不都大于k。因此骡澈,如果邊(i,j)存在锅纺,則c(i,j,0)是該邊的長(zhǎng)度。若i=j,則c(i,j,0)為0肋殴。如果邊(i,j)不存在囤锉,則c(i,j,0)等于∞。c(i,j,n)是從i到j(luò)的最短路徑的長(zhǎng)度护锤。

偽代碼:

for (int i=1; j

? for(int j=1;j

? c(i, j, k)=a(i, j);

for(int k=1, k<=n; k++)

? for(int i=1;i<=n;i++)

for(int j=1;j<=n; j++)

if (c(i, k, k-1)+c(k, j, k-1)

? ? c(i, j, k)=c(i, k, k-1)+c(k, j, k-1);

else c(i, j, k)=c(i, j, k-1);

? ? ? ? Template

void allpairs(T **c, int **kay)

{

? ? ? for (int i=1; i<=n; i++)

for(int j=1; j<=n; j++)

{

c[i][j]=a[i][j];

kay[i][j]=0;

}

for (int i=1; i<=n; i++)

? c[i][i]=0;

for(int k=1; k<=n; k++)

? for(int i=1; i<=n; i++)

for(int j=1; j<=n; j++)

if (c[i][k]!=noEdge&&c[k][j]!=noEdge&&

(c[i][j]==noEdge||c[i][j]>c[i][k]+c[k][j]))

{

c[i][j]=c[i][k]+c[k][j];

kay[i][j]=k;

}}

3.網(wǎng)組的無(wú)交叉子集:令MNS(i,j)代表一個(gè)MNS官地,其中所有的網(wǎng)組(u,Cu)滿足u<=i,Cu<=j。令size(i,j)表示MNS(i,j)的大小烙懦。MNS(n,n)是對(duì)應(yīng)于輸入實(shí)例的一個(gè)MNS驱入。

j=C1, size(1,j)=1.

j

j<=Ci, size(i, j)=max{size(i-1,j),size(i-1,Ci-1)+1}

偽代碼:(查找網(wǎng)絡(luò)中最大的無(wú)交叉子集)

int traceback(int *c, int numberofnets, int **size, int *net)

{

int sizeofmns=0;

for (int i=numberofnets; i>1; i- -)

if(size[i][maxalllowed]!=size[i-1][maxallowed])

{

net[sizeofmns++]=i;

maxallowed=c[i]-1;

}

if(maxallowed>=c[1])

? ? net[sizeofmns++]=i;

}

總結(jié)

動(dòng)態(tài)規(guī)劃算法通常用于求解具有某種最優(yōu)性質(zhì)的問(wèn)題。在這類問(wèn)題中氯析,可能會(huì)有許多可行解亏较。每一個(gè)解都對(duì)應(yīng)于一個(gè)值,我們希望找到具有最優(yōu)值的解掩缓。動(dòng)態(tài)規(guī)劃算法與分治法類似雪情,其基本思想也是將待求解問(wèn)題分解成若干個(gè)子問(wèn)題,先求解子問(wèn)題你辣,然后從這些子問(wèn)題的解得到原問(wèn)題的解巡通。

與分治法不同的是,經(jīng)動(dòng)態(tài)規(guī)劃分解得到子問(wèn)題往往不是互相獨(dú)立的绢记。如果我們能夠保存已解決的子問(wèn)題的答案扁达,需要時(shí)再找出已求得的答案,可避免重復(fù)計(jì)算蠢熄,節(jié)省時(shí)間跪解。可用表來(lái)記錄所有已解的子問(wèn)題的答案。不管該子問(wèn)題以后是否被用到叉讥,只要它被計(jì)算過(guò)窘行,就將其結(jié)果填入表中。這就是動(dòng)態(tài)規(guī)劃法的基本思路图仓。

適用動(dòng)態(tài)規(guī)劃的問(wèn)題必須滿足最優(yōu)化原理和無(wú)后效性和子問(wèn)題的重疊性罐盔。

文獻(xiàn)引用

? 《數(shù)據(jù)結(jié)構(gòu)算法與應(yīng)用:c++語(yǔ)言描述》

?? “CSDN博客摘要 ”

?? 《C語(yǔ)言教程》

????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Jason?

????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????18.8.8

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市救崔,隨后出現(xiàn)的幾起案子惶看,更是在濱河造成了極大的恐慌盹牧,老刑警劉巖膳灶,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拱雏,死亡現(xiàn)場(chǎng)離奇詭異愉粤,居然都是意外死亡望艺,警方通過(guò)查閱死者的電腦和手機(jī)矾麻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門闻蛀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仙蛉,“玉大人主巍,你說(shuō)我怎么就攤上這事冠息。” “怎么了孕索?”我有些...
    開(kāi)封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵逛艰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我檬果,道長(zhǎng)瓮孙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任选脊,我火速辦了婚禮杭抠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恳啥。我一直安慰自己偏灿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布钝的。 她就那樣靜靜地躺著翁垂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪硝桩。 梳的紋絲不亂的頭發(fā)上沿猜,一...
    開(kāi)封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音碗脊,去河邊找鬼啼肩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祈坠。 我是一名探鬼主播害碾,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赦拘!你這毒婦竟也來(lái)了慌随?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤躺同,失蹤者是張志新(化名)和其女友劉穎阁猜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體笋籽,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹦漠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了车海。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隘击,死狀恐怖侍芝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情埋同,我是刑警寧澤州叠,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凶赁,受9級(jí)特大地震影響咧栗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虱肄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一致板、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咏窿,春花似錦斟或、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至根欧,卻和暖如春怜珍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凤粗。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工酥泛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓揭璃,卻偏偏與公主長(zhǎng)得像晚凿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瘦馍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容