版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
算法分析與設(shè)計(jì)實(shí)驗(yàn)報(bào)告
第三次實(shí)驗(yàn)姓名學(xué)號(hào)班級(jí)時(shí)間上午地點(diǎn)工訓(xùn)樓實(shí)驗(yàn)名稱動(dòng)態(tài)規(guī)劃法求解背包問題實(shí)驗(yàn)?zāi)康耐ㄟ^上機(jī)實(shí)驗(yàn),要求掌握動(dòng)態(tài)規(guī)劃算法的問題描述、算法設(shè)計(jì)思想、程序設(shè)計(jì)。實(shí)驗(yàn)原理給定任意幾組數(shù)據(jù),利用動(dòng)態(tài)規(guī)劃法的思想,把0-1背包裝滿并使得其價(jià)值最大。程序思路:(1)首先從剩余容量是考慮當(dāng)前物品能不能放入背包;(2)其次從價(jià)值上考慮當(dāng)前物品要不要放入背包,是不是最優(yōu)的。實(shí)驗(yàn)步驟①找出最優(yōu)解的性質(zhì),并刻畫其結(jié)構(gòu)特征(利用反證法)。②遞歸的定義最優(yōu)值。岫力=「1門―(必〕現(xiàn)+L力OMj<明(V/>W飽%j)=:n微您③以自底向上的方法計(jì)算最優(yōu)值。④根據(jù)計(jì)算最優(yōu)值時(shí)的信息構(gòu)造最優(yōu)解。關(guān)鍵代碼voidKnapsack(intv[],intw口,intc,intn,int**m){〃初始化0-1背包表格intjmax=min(w[n],c);〃背包剩余容量上限,范圍[0~亞[口])(左閉右開區(qū)間)for(intj=0;j<jmax;j++)m[n][j]=0;for(intj=w[n];j<=c;j++)//限制范圍[w[n]~c]m[n][j]=v[n];
〃利用最優(yōu)子結(jié)構(gòu)性質(zhì),從最后一個(gè)元素開始,利用遞推公式for(inti=n-1;i>=1;i--){jmax=min(w[n],c);〃第一種情況,背包剩余容量j在區(qū)間[0,jmax),該物品不能放入背包for(intj=0;j<jmax;j++)m[i][j]=m[i+1][j];〃沒產(chǎn)生任何效益for(intj=w[i];j<=c;j++)〃第二種情況,背包剩余容量上在區(qū)間[w[i],c]m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);〃根據(jù)效益值增加vi,選擇該物品放入背包或者不放入背包}不同之在0-1//x口數(shù)組存儲(chǔ)對應(yīng)物品不同之在0-1voidTraceback(int**m,intw[],intc,intn,intx[]){for(inti=1;i<n;i++){if(m[i][c]==m[i+1][c])〃若前一個(gè)和后一個(gè)效益值比沒變化,說明該物品沒放入背包中x[i]=0;else〃否則放入了背包中,由m[2][c-w1]繼續(xù)構(gòu)造最優(yōu)解{x[i]=1;c-=w[i];}}x[n]=(m[n][c])?1:0;〃最后一個(gè)元素需要單獨(dú)判斷}for(inti=n-1;i>1;i--){jmax=min(w[n]-1,c);for(intj=0;j<=jmax;j++)〃背包不同剩余容量j<=jmax<cm[i][j]=m[i+1][j];〃沒產(chǎn)生任何效益for(intj=w[i];j<=c;j++)〃背包不同剩余容量j-w[i]>cm[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);/效益值增加vi}〃之所以講m[1][c]單獨(dú)拿出來計(jì)算,是為了計(jì)算的方便,并不需要在和前面一樣的麻煩,只有判斷最后一步就可以m[1][c]=m[2][c];if(c>=w[1])m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);輸入及背包容量較小的結(jié)果(數(shù)據(jù)手動(dòng)收入):測試結(jié)果B1S&SSkS^^Vs'FO-onelXDebucXzero-cjrelexe輸入及背包容量等大小的結(jié)果(數(shù)據(jù)由隨機(jī)函數(shù)產(chǎn)生):待裝物品的價(jià)值為裝的大的價(jià)值為品編號(hào)為:6LMIV6L^iV3.rtn3—ou.&u46口nn46裝下測試結(jié)果B1S&SSkS^^Vs'FO-onelXDebucXzero-cjrelexe輸入及背包容量等大小的結(jié)果(數(shù)據(jù)由隨機(jī)函數(shù)產(chǎn)生):待裝物品的價(jià)值為裝的大的價(jià)值為品編號(hào)為:6LMIV6L^iV3.rtn3—ou.&u46口nn46裝下八人物&坳6量型瞿71裝71包包E主QE寺?4寺?4匕弓匕弓1日嶄為5?的編答人值50量50一人品16耳/:56值為:1價(jià)號(hào)182441824475tineis0.3621945420732194542073217778177782635B26350輸入及背包容量較大的結(jié)果(數(shù)據(jù)由隨機(jī)函數(shù)產(chǎn)生):S3F謨法實(shí)郢噬二檄]宏郎「7口「el\Debig\zerc-orel.=*xe100121U315941432G22879231139141278B6270512140H?13E2981S19344123314SS62E0874542179恥121U315941432G22879231139141139?606BE85B25884251眄19391203151823?18796疑5603酬4510070191672G933265731G87S18895265171776516445967331235S428105321178317938309S426245255622839432227G66206821383309E323B92295914B501853B107803216109B947015304127172?2055492223551651410427133603049610582247862110828156245M1486324798157S99441255481ES901360S1104116912594E42843635293252449132676摩物品的重量為:121U315941432G278B6270512140H?13E2981S19344123314SS62E0874542179恥22879231139141128356451301164448146422(13B291B0223S82274601827029139?606BE85B25884251眄19391203151823?18796疑5603酬4510070191672G933265731G87S18895265171776516445967331235S428105321178317938309S426245255622839432227G66206821383309E323B92295914B501853B107803216109B947015304127172?2055492223551651410427133603049610582247862110828156245M1486324798157S99441255481ES901360S1104116912594E42843635293252449132676勺:10000B0己Jj■司-1士■.fT-'J-^r-.ii―?,=__nH已不:UT;J口二卅I\i....'J:慳434546474日E05253545E5557E8EB6162636465E66768697071727374?G77?87980818283S485B68?8G的9091929495魅979099100Ihetimeis6.0B1
實(shí)驗(yàn)心得對于這一次的實(shí)驗(yàn),利用動(dòng)態(tài)規(guī)劃的算法求解背包問題,雖然課本上有函數(shù)的實(shí)現(xiàn)但是實(shí)驗(yàn)做起來還是有一定的難度的,畢竟我們追求的不是將代碼敲出來而是真正掌握了這一個(gè)經(jīng)典的算法實(shí)例。首先我是自己寫了主函數(shù),然后照著課本敲的代碼,然后自己一步步分析代碼中的不足的部分,加以完善,后來經(jīng)過自己對于這個(gè)問題的理解,發(fā)現(xiàn)課本上的代碼有一些不太容易理解的地方,就按照自己的理解進(jìn)行了一些改變,最終實(shí)現(xiàn)了將自己的理解與代碼完全融合,后來自己又仔細(xì)研究了一下書上的代碼,發(fā)覺自己的代碼效率不高,就有進(jìn)行了改進(jìn),最終得到了較為滿意的代碼。不過在實(shí)驗(yàn)過程中也遇到了很多的問題,最主要的問題是經(jīng)常出現(xiàn)中斷,這使我很郁悶,不過好在在同學(xué)的幫助下都順利解決了,感覺很開心,然后由于要測試大數(shù)據(jù),所以采用了隨機(jī)生成函數(shù),以及動(dòng)態(tài)分配內(nèi)存,學(xué)的利用到很多以前不太用到的知識(shí),感覺棒棒的。實(shí)驗(yàn)比較觀察上面三種不同數(shù)據(jù)規(guī)模的輸入,我們可以看到當(dāng)物品的數(shù)量比較多的時(shí)候,算法是比較浪費(fèi)時(shí)間的,其次是背包的容量也是一種限制性因素,而且采用隨機(jī)生成函數(shù)有一點(diǎn)不好的就是生成的數(shù)據(jù)都是比較大的,有點(diǎn)不符合實(shí)際,我想在實(shí)際問題處理中應(yīng)該采用的是讀文件的方式輸入的吧,不然采用手動(dòng)輸入,還是十分麻煩的。實(shí)驗(yàn)得分助教簽名附錄:完整代碼//0-1背包問題,動(dòng)態(tài)規(guī)劃算法#include<iostream>#include<time.h>#include<iomanip>usingnamespacestd;constintN=100;voidKnapsack(intv[],intw[],intc,intn,int**m);voidTraceback(int**m,intw[],intc,intn,intx[]);voidran(int*input,intn)//隨機(jī)生成數(shù)組元素函數(shù){inti;srand(time(0));for(i=1;i<=n;i++)input[i]=rand();//input[i]='\0';
intmain()(intc,n;cout<<”請輸入背包的容量:”;cin>>c;cout<<”請輸入物品的個(gè)數(shù):”;cin>>n;int*v=newint[n+1];int*w=newint[n+1];//下標(biāo)從1開始intx[N+1];int**m;inti;m=newint*[n+1];for(i=0;i<n+1;i++)(m[i]=newint[c];}******手動(dòng)輸入的代碼部分******/*cout<<"待裝物品的重量為:"<<endl;for(i=1;i<=n;i++)cin>>w[i];cout<<endl;cout<<"待裝物品的價(jià)值為:"<<endl;for(i=1;i<=n;i++)cin>>v[i];cout<<endl;*/小小小小小小隨機(jī)生成數(shù)據(jù)部分小小小小小小隨機(jī)生成數(shù)據(jù)部分******ran(v,n);cout<<"待裝物品的價(jià)值為:"<<endl;for(i=1;i<=n;i++)cout<<v[i]<<"";cout<<endl;ran(w,n);cout<<"待裝物品的重量為:"<<endl;for(i=1;i<=n;i++)cout<<w[i]<<"";cout<<endl;clock_tstart,end,over;//計(jì)算程序運(yùn)行時(shí)間的算法start二clock();end二clock();over二end-start;start二clock();
Knapsack(v,w,c,n,m);//函數(shù)調(diào)用,求解0-1背包問題cout<<"背包能裝的最大的價(jià)值為:"<<m[1][c]<<endl;Traceback(m,w,c,n,x);//函數(shù)調(diào)用,構(gòu)造最優(yōu)解cout<<"背包裝下的物品編號(hào)為:"<<endl;for(i=1;i<=n;i++){if(x[i]==1)cout<<i<<"";}cout<<endl;cout<<endl;end=clock();printf("Thetimeis%6.3f",(double)(end-start-over)/CLK_TCK);//顯示運(yùn)行時(shí)間for(i=0;i<n+1;i++)//刪除動(dòng)態(tài)分配的內(nèi)存{delete[]m[i];}delete[]m;delete[]v;delete[]w;system("pause");return0;}******課本上的源代碼部分******/*voidKnapsack(intv[],intw[],intc,intn,intm[][10]){intjmax=min(w[n]-1,c);〃背包剩余容量上限,范圍0~w[n]-1for(intj=0;j<=jmax;j++)m[n][j]=0;for(intj=w[n];j<=c;j++)〃限制范圍[w[n]~c]m[n][j]=v[n];for(inti=n-1;i>1;i--){〃背包不同剩余容量j<=jmax<c〃背包不同剩余容量j<=jmax<c//沒產(chǎn)生任何效益for(intj=0;j<=jmax;j++)m[i][j]=m[i+1][j];for(intj=w[i];j<=c;j++)〃背包不同剩余容量^國工for(intj=w[i];j<=c;j++)〃背包不同剩余容量^國工m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);〃效益值增加vi}m[1][c]=m[2][c];if(c>=w[1])m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);}*/voidKnapsack(intv[],intw[],intc,intn,int**m){//初始化0-1背包表格intjmax=min(w[n],c);〃背包剩余容量上限,范圍[0~卬[口])(左閉右開區(qū)間)for(intj=0;j<jmax;j++)m[n][j]=0;for(intj=w[n];j<=c;j++)〃限制范圍[w[n]~c]m[n][j]=v[n];//利用最優(yōu)子結(jié)構(gòu)性質(zhì),從最后一個(gè)元素開始,利用遞推公式for(inti=n-1;i>=1;i--){jmax=min(w[n],c);〃第一種情況,背包剩余容量上在區(qū)間[0,jmax),該物品不能放入背包for(intj=0;j<jmax;j++)m[i][j]=m[i+1][j];//沒產(chǎn)生任何效益for(intj=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生態(tài)園戶外網(wǎng)球場施工合同
- 手術(shù)室護(hù)理工作守則
- 物業(yè)管理智能化施工合同
- 醫(yī)院投訴處理與信息系統(tǒng)
- 旅游住宿合同管理流程
- 項(xiàng)目部進(jìn)度跟蹤系統(tǒng)
- 游戲開發(fā)公司聘用合同范本
- 機(jī)場新建工程塔機(jī)租賃協(xié)議
- 校園網(wǎng)絡(luò)布線工程合同范本
- 化妝品銷售兼職協(xié)議
- LU和QR分解法解線性方程組
- 設(shè)計(jì)后續(xù)服務(wù)承諾書
- 漏油器外殼的落料、拉深、沖孔級(jí)進(jìn)模的設(shè)計(jì)【畢業(yè)論文絕對精品】
- 機(jī)械加工設(shè)備清單及參考價(jià)格
- 北京市西城區(qū)20192020學(xué)年六年級(jí)上學(xué)期數(shù)學(xué)期末試卷
- 加工中心全部的報(bào)警說明
- 【圖文】環(huán)保氣體絕緣環(huán)網(wǎng)柜
- 供應(yīng)室-護(hù)理不良事件報(bào)告表
- 醫(yī)療器械質(zhì)量工作記錄管理制度
- 護(hù)理實(shí)習(xí)生帶教計(jì)劃工作表
- 烤煙漂浮育苗技術(shù)
評(píng)論
0/150
提交評(píng)論