




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)六 回溯算法(2學(xué)時(shí)) 一、實(shí)驗(yàn)?zāi)康呐c要求1、掌握裝載問題的回溯算法;2、初步掌握回溯算法;二、實(shí)驗(yàn)題有一批共n個(gè)集裝箱要裝上2艘載重量分別為c1和c2的輪船,其中集裝箱i的重量為wi,且 裝載問題要求確定是否有一個(gè)合理的裝載方案可將這個(gè)集裝箱裝上這2艘輪船。如果有,找出一種裝載方案。三、實(shí)驗(yàn)提示void backtrack (int i) / 搜索第i層結(jié)點(diǎn) if (i > n) / 到達(dá)葉結(jié)點(diǎn) 更新最優(yōu)解bestx,bestw;return; r -= wi; if (cw + wi <= c) / 搜索左子樹 xi = 1; cw += wi; ba
2、cktrack(i + 1); cw -= wi; if (cw + r > bestw) xi = 0; / 搜索右子樹 backtrack(i + 1); r += wi; 4、 實(shí)驗(yàn)代碼方法1:import java.util.*;/* * 回溯法解決裝載問題 * author Administrator * */ public class demo public static int n; /集裝箱數(shù) public static int first_weight; /第一艘載重量 public static int beautif_weight; /當(dāng)前最優(yōu)載重量 public
3、static int arr_weight; /集裝箱重量數(shù)組 public static int xx; / public static int bestxx; public static int maxLoadingRE(int w, int c, int bestx) /遞歸回溯 n = w.length; first_weight = c; beautif_weight = 0; arr_weight = w; bestxx = bestx; xx = new intn; int r = 0; /剩余集裝箱重量,未進(jìn)行裝載的重量 for (int i = 0; i < n; i+
4、) r += arr_weighti; trackback(0, 0, r); return beautif_weight; /到達(dá)層數(shù),目前裝載的重量,未裝載的重量 private static void trackback(int i, int cw, int r) if (i = n) /到達(dá)葉結(jié)點(diǎn) for (int j = 0; j < n; j+) bestxxj = xxj; beautif_weight = cw; return; /只是一次出棧操作,棧非空還要繼續(xù)執(zhí)行 if (cw + arr_weighti <= first_weight) /已裝載的加上要裝載的
5、小于第一個(gè)的載重量 xxi = 0; /0代表裝在第一個(gè)上,1代表裝在第二個(gè)上 trackback(i + 1, cw + arr_weighti, r); /試圖裝載下一個(gè)集裝箱,r是針對(duì)第一個(gè)裝的重量,因此裝在第一個(gè)里不需要減,但裝在第二個(gè)時(shí)就要減去該重量 if (r - arr_weighti > beautif_weight) /已裝載的加上要裝載的已經(jīng)大于第一個(gè)的載重量,并且用總的載重量r減去當(dāng)前要裝載的還比最好的載重量大 xxi = 1; /放到第二個(gè)上 trackback(i + 1, cw, r - arr_weighti); public static int maxL
6、oading(int w, int c, int bestx) int i = 0; /當(dāng)前層 int n = w.length; /層總數(shù) int x = new intn; /x0, i為當(dāng)前選擇路徑 Arrays.fill(x, -1); /初始化為-1,0表示選擇第一個(gè),1表示選擇第二個(gè) int bestw = 0; /當(dāng)前最優(yōu)裝載重量 int cw = new intn; /當(dāng)前載重量 int r = new intn; /剩余集裝箱容量 int tor = 0; for (int item : w) /item取出w中的值,進(jìn)行相加 tor += item; r0 = tor;/要
7、裝載的重量 cw0 = 0; /搜索子樹 while (i > -1) do xi += 1; if (xi = 0) /選擇放在第一個(gè)(左子樹) if (cwi + wi <= c) if (i < n - 1) cwi + 1 = cwi + wi; ri + 1 = ri; break; /能放下就直接跳出這個(gè)do-while循環(huán) else /選擇放在第二個(gè)(右子樹) if (ri - wi > bestw) /剪枝函數(shù),沒有最優(yōu)解好的話xi會(huì)自增到2,不會(huì)進(jìn)入下面的if (xi < 2) if (i < n - 1) ri + 1 = ri - wi
8、; cwi + 1 = cwi; break; while (xi < 2); /對(duì)于放不下的在這里判斷后才能取右子樹 if (xi < 2) if (i = n - 1) for (int j = 0; j < n; j+) bestxj = xj; if (xi = 0) bestw = cwi + wi; else bestw = cwi; else i+; xi = -1; else /當(dāng)xi=2時(shí),說明已經(jīng)遍歷完兩個(gè)葉節(jié)點(diǎn),應(yīng)向上一層繼續(xù)遍歷其它節(jié)點(diǎn) i-; return bestw; public static void main(String args) int
9、 w = 0,10,40,40; int n = w.length; int c = 50; int bestx = new intn; System.out.println("重量分別為:"); for(int ws:w) System.out.print(","+ws); System.out.println("n"); int bestw = maxLoadingRE(w, c, bestx); System.out.println("回溯選擇結(jié)果為: " + bestw); System.out.print
10、ln(Arrays.toString(bestx); 方法2:public class demo2 public static void main(String args) int n=3,m;int c=50,c2=50;int w=0,10,40,40;int bestx=new intw.length;demo2 demo2=new demo2(); m=demo2.MaxLoading(w, c, n, bestx); System.out.println("輪船的載重量分別為:");System.out.println("c(1)="+c+&q
11、uot;,c(2)="+c2);System.out.println("待裝集裝箱重量分別為:");System.out.print("w(i)=");for (int i=0;i<=n;i+)System.out.print(","+wi);System.out.println("");System.out.println("最優(yōu)裝載量為:");System.out.println("m(1)="+m);System.out.print("x(i)
12、=");for (int i=0;i<=n;i+)System.out.print(""+bestxi);System.out.println("");int m2=0;for (int j=1;j<=n;j+)m2=m2+wj*(1-bestxj); System.out.println("回溯選擇結(jié)果為:"+m2);if(m2>c2) System.out.println("因?yàn)閙(2)大于c(2),所以原問題無解!");int MaxLoading(int w,int c,int n,int bestx)/迭代回溯法,返回最優(yōu)載重量及其相應(yīng)解,初始化根結(jié)點(diǎn)int i=1;/當(dāng)前層,x1:i-1為當(dāng)前路徑int x=new intn+1;int bestw=0; /當(dāng)前最優(yōu)載重量int cw=0; /當(dāng)前載重量int r=0; /剩余集裝箱重量for (int j=1;j<=n;j+)r+=wj;while(true)/搜索子樹 while(i<=n &&cw+wi<=c)/進(jìn)入左子樹r-=wi;cw+=wi;xi=1;i+;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五股東協(xié)議補(bǔ)充協(xié)議-股東對(duì)公司可持續(xù)發(fā)展戰(zhàn)略的承諾
- 二零二五年度跨境拖車服務(wù)及關(guān)稅代理合同
- 二零二五年度商業(yè)廣場購物中心房屋租賃與商業(yè)數(shù)據(jù)分析服務(wù)合同
- 2025年度閑置校舍租賃合同及校園內(nèi)環(huán)保能源利用合作協(xié)議
- 2025年度美容美發(fā)加盟合同解除書
- Unit 4 Did You Have a Nice Trip?單元基礎(chǔ)知識(shí)復(fù)習(xí)(含答案)
- 2025年度高校學(xué)生實(shí)習(xí)就業(yè)雙選協(xié)議書
- 二零二五年度企業(yè)員工社保權(quán)益自愿放棄協(xié)議范本
- 二零二五年度海洋地質(zhì)調(diào)查海域使用權(quán)租賃與研究開發(fā)協(xié)議
- 二零二五年度交通事故私了賠償處理協(xié)議
- 2023-2024學(xué)年部編版選擇性必修中冊 《小二黑結(jié)婚(節(jié)選)》 教案
- 幼兒社會(huì)教育活動(dòng)設(shè)計(jì)與指導(dǎo)(第3版)中職 PPT完整全套教學(xué)課件
- 做一個(gè)專業(yè)的班主任課件
- 心包填塞-課件
- 小學(xué)道德與法治-征稅和納稅教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- 盟史簡介12.10.18課件
- 《章魚先生賣雨傘》課件1
- 2023年副主任醫(yī)師(副高)-骨外科學(xué)(副高)考試歷年真題薈萃帶答案
- 全過程造價(jià)咨詢服務(wù)實(shí)施方案
- 2023年新改版教科版五年級(jí)下冊科學(xué)全冊教案(附知識(shí)點(diǎn))
- 大學(xué)生勞動(dòng)教育教程全套PPT完整教學(xué)課件
評(píng)論
0/150
提交評(píng)論