




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Java使用動(dòng)態(tài)規(guī)劃算法思想解決背包問(wèn)題目錄動(dòng)態(tài)規(guī)劃算法動(dòng)態(tài)規(guī)劃算法的思想最優(yōu)性原理動(dòng)態(tài)規(guī)劃算法的三大特點(diǎn)動(dòng)態(tài)規(guī)劃算法中的0/1背包問(wèn)題動(dòng)態(tài)規(guī)劃算法的優(yōu)點(diǎn)小結(jié)
動(dòng)態(tài)規(guī)劃算法
動(dòng)態(tài)規(guī)劃算法的思想
動(dòng)態(tài)規(guī)劃算法處理的對(duì)象是多階段復(fù)雜決策問(wèn)題,動(dòng)態(tài)規(guī)劃算法和分治算法類(lèi)似,其基本思想也是將待求解問(wèn)題分解成若干個(gè)子問(wèn)題(階段),然后分別求解各個(gè)子問(wèn)題(階段),最后將子問(wèn)題的解組合起來(lái)得到原問(wèn)題的解,但是與分治算法不同的是,子問(wèn)題往往不是相互獨(dú)立的,而是相互聯(lián)系又相互區(qū)別的
動(dòng)態(tài)規(guī)劃算法問(wèn)題求解的目標(biāo)是獲取導(dǎo)致問(wèn)題最優(yōu)解的最優(yōu)決策序列(最優(yōu)策略)。對(duì)于一個(gè)決策序列,可以用一個(gè)數(shù)值函數(shù)(目標(biāo)函數(shù))衡量這個(gè)決策的優(yōu)劣。
最優(yōu)性原理
動(dòng)態(tài)規(guī)劃算法的最優(yōu)性原理:一個(gè)最優(yōu)決策序列具有這樣的性質(zhì),不論初始狀態(tài)和第一步?jīng)Q策如何,對(duì)前面的決策所形成的狀態(tài)而言,其余的決策必須按照前一次決策所產(chǎn)生的新?tīng)顟B(tài)構(gòu)成一個(gè)最優(yōu)決策序列。
最優(yōu)性原理體現(xiàn)為問(wèn)題的最優(yōu)子結(jié)構(gòu)特性,對(duì)于一個(gè)問(wèn)題,如果能從較小規(guī)模的子問(wèn)題的最優(yōu)解求得較大規(guī)模同類(lèi)子問(wèn)題的最優(yōu)解,最終得到給定問(wèn)題的最優(yōu)解,也就是問(wèn)題的最優(yōu)解中所包含的子問(wèn)題的最優(yōu)解,這種性質(zhì)被稱(chēng)為最優(yōu)子結(jié)構(gòu)性質(zhì)。最優(yōu)子結(jié)構(gòu)特性使得在從較小問(wèn)題的解構(gòu)造較大問(wèn)題的解時(shí),只需考慮子問(wèn)題的最優(yōu)解,然后以自底向上的方式遞歸地從子問(wèn)題的最優(yōu)解逐步構(gòu)造出整個(gè)問(wèn)題的最優(yōu)解,它保證了原問(wèn)題的最優(yōu)解可以通過(guò)求解子問(wèn)題的最優(yōu)解來(lái)獲得,最優(yōu)子結(jié)構(gòu)的特性是動(dòng)態(tài)規(guī)劃算法求解問(wèn)題的必要條件。
動(dòng)態(tài)規(guī)劃算法的三大特點(diǎn)
如果求解的問(wèn)題滿足最優(yōu)性原理,則說(shuō)明用動(dòng)態(tài)規(guī)劃算法有可能解決該問(wèn)題,在分析問(wèn)題的最優(yōu)子結(jié)構(gòu)時(shí),所使用的方法具有普遍性。要注意一個(gè)問(wèn)題可以有多種方式刻畫(huà)它的最優(yōu)子結(jié)構(gòu),有些表示方法的求解速度更快(空間占用少,問(wèn)題的維度低)。遞歸定義最優(yōu)解決方案。動(dòng)態(tài)規(guī)劃的每一步?jīng)Q策都依賴(lài)于子問(wèn)題的解,動(dòng)態(tài)規(guī)劃算法求解最優(yōu)化問(wèn)題的步驟為:找出最優(yōu)解的結(jié)構(gòu),具體來(lái)說(shuō)就是看這個(gè)問(wèn)題是否滿足最優(yōu)子結(jié)構(gòu)特性;其次遞歸定義一個(gè)最優(yōu)解的值,即構(gòu)造原問(wèn)題和子問(wèn)題之間的遞歸方程,原問(wèn)題的最優(yōu)解可以通過(guò)子問(wèn)題的最優(yōu)解獲得。以自底向上的方式計(jì)算出最優(yōu)解的值(最優(yōu)解的目標(biāo)函數(shù)的值)。對(duì)子問(wèn)題的分解是基于原問(wèn)題的分解的基礎(chǔ)之上進(jìn)行的,而且這些子問(wèn)題的分解過(guò)程是相互獨(dú)立的。在對(duì)原問(wèn)題分解的過(guò)程中,會(huì)出現(xiàn)大量的共享重疊子問(wèn)題,為了避免對(duì)大量重疊子問(wèn)題的重復(fù)計(jì)算,一般動(dòng)態(tài)規(guī)劃算法從自底向上開(kāi)始計(jì)算,對(duì)每一個(gè)問(wèn)題只解一次,并且保存求解子問(wèn)題的最優(yōu)值,當(dāng)再需要求解這個(gè)子問(wèn)題的時(shí)候,可以用常數(shù)時(shí)間查看一下結(jié)果,而不是再遞歸的去求解每一個(gè)問(wèn)題的解,因此提高了動(dòng)態(tài)規(guī)劃算法的效率。
動(dòng)態(tài)規(guī)劃算法中的0/1背包問(wèn)題
0/1背包問(wèn)題的規(guī)則是不允許該物品進(jìn)行拆分,即只有把物品放入和不放入兩個(gè)基本狀態(tài),要使用動(dòng)態(tài)規(guī)劃算法求解決如何放物品才可以是背包中的物品的總價(jià)值達(dá)到最高。
示例
有一個(gè)載重為10的背包,現(xiàn)有4類(lèi)物品,每類(lèi)物品的重量分別為(w0,w1,w2,w3)=(2,3,4,7),它們的價(jià)值分別為(p0,p1,p2,p3)=(1,3,5,9)。試問(wèn)如何裝載能夠使背包容納物品的價(jià)值最大。
package算法設(shè)計(jì)與分析;
importjava.util.Arrays;
importjava.util.Scanner;
//m表示的是背包的容量,a表示有多少種類(lèi)的物品,數(shù)組w用與存放每類(lèi)物品的重量,數(shù)組val用于存放每類(lèi)物品的價(jià)值
publicclassmy{
publicstaticvoidmain(String[]args){
Scannerscanner=newScanner(System.in);
System.out.print("請(qǐng)輸入背包的容量:");
intm=scanner.nextInt();
ScannerinScanner=newScanner(System.in);
System.out.print("請(qǐng)輸入物品的個(gè)數(shù):");
inta=inScanner.nextInt();
int[]w=newint[a+1];
System.out.print("請(qǐng)輸入物品的重量:"+"");
for(inti=1;ii++){
w[i]=inScanner.nextInt();
int[]val=newint[a+1];
System.out.print("請(qǐng)輸入物品的價(jià)值:"+"");
for(inti=1;ii++){
val[i]=inScanner.nextInt();
intn=val.length;
int[][]path=newint[n+1][m+1];
//創(chuàng)建二維數(shù)組
//v[i][j]:表示在前i個(gè)物品中能夠裝入容量為j的背包中的最大價(jià)值
int[][]v=newint[n+1][m+1];
//初始化第一行和第一列
for(inti=0;iv.length;i++){//v.length:獲取二維數(shù)組的行數(shù)
v[i][0]=0;//將第一列設(shè)置為0
for(inti=0;iv[0].length;i++){//v[0].length:獲取二維數(shù)組的列數(shù)
v[0][i]=0;//將第一行設(shè)置為0
for(inti=1;iv.length;i++){//inti=1不處理第一行
for(intj=1;jv[0].length;j++){//intj=1不處理第一列
if(w[i-1]j){
v[i][j]=v[i-1][j];
}else{
if(v[i-1][j](val[i-1]+v[i-1][j-w[i-1]])){
v[i][j]=val[i-1]+v[i-1][j-w[i-1]];
//把當(dāng)前情況記錄到path
path[i][j]=1;
}else{
v[i][j]=v[i-1][j];
//輸出二維數(shù)組:
for(int[]ints:v){
System.out.println(Arrays.toString(ints));
//輸出最后我們是放入的那些商品
inti=path.length-1;//行的最大下標(biāo)
intj=path[0].length-1;//列的最大下標(biāo)
while(i0j0){//從path的最后開(kāi)始找
if(path[i][j]==1){
System.out.printf("第%d個(gè)商品放入背包\n",i-1);
j-=w[i-1];
i--;
}
輸入一個(gè)背包容量為10,里面有4類(lèi)物品,物品的重量分別為2,3,4,7,物品的價(jià)值分別為1,3,5,9
結(jié)果
動(dòng)態(tài)規(guī)劃算法的優(yōu)點(diǎn)
若要解一個(gè)給定問(wèn)題,我們需要解其不同部分(即子問(wèn)題),再合并子問(wèn)題的解以得出原問(wèn)題的解。通常許多子問(wèn)題非常相似,為此動(dòng)態(tài)規(guī)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 肉類(lèi)加工中的低溫加工技術(shù)研究考核試卷
- 肉類(lèi)副產(chǎn)品在營(yíng)養(yǎng)強(qiáng)化食品中的應(yīng)用研究考核試卷
- 磷肥生產(chǎn)技術(shù)基礎(chǔ)考核試卷
- 軟件測(cè)試工具應(yīng)用試題及答案回顧
- 計(jì)算機(jī)三級(jí)嵌入式課程體系設(shè)計(jì)試題及答案
- 深入理解行政組織理論的試題及答案
- 精心準(zhǔn)備公路工程執(zhí)照考試的試題及答案
- 賓館房間裝修管理制度
- 學(xué)校家長(zhǎng)宿舍管理制度
- 客運(yùn)企業(yè)衛(wèi)生管理制度
- 2022-2023學(xué)年高中政治統(tǒng)編版選擇性必修二:第9課 糾紛的多元解決方式 教案
- 術(shù)前停用抗凝藥物
- 法學(xué)本科畢業(yè)論文
- 爆破安全安全規(guī)程
- 首末件檢查記錄表
- DB52∕T 046-2018 貴州省建筑巖土工程技術(shù)規(guī)范
- 真空斷路器課件
- 樓面板靜載試驗(yàn)檢測(cè)報(bào)告
- 用地性質(zhì)分類(lèi)表
- 科目一考試成績(jī)單
- Q∕CR 9604-2015 高速鐵路隧道工程施工技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論