![優(yōu)先隊(duì)列式分支限界法求解01背包問題_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/4/463617e3-1c2d-4958-afba-609595ef7b27/463617e3-1c2d-4958-afba-609595ef7b271.gif)
![優(yōu)先隊(duì)列式分支限界法求解01背包問題_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/4/463617e3-1c2d-4958-afba-609595ef7b27/463617e3-1c2d-4958-afba-609595ef7b272.gif)
![優(yōu)先隊(duì)列式分支限界法求解01背包問題_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/4/463617e3-1c2d-4958-afba-609595ef7b27/463617e3-1c2d-4958-afba-609595ef7b273.gif)
![優(yōu)先隊(duì)列式分支限界法求解01背包問題_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/4/463617e3-1c2d-4958-afba-609595ef7b27/463617e3-1c2d-4958-afba-609595ef7b274.gif)
![優(yōu)先隊(duì)列式分支限界法求解01背包問題_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/4/463617e3-1c2d-4958-afba-609595ef7b27/463617e3-1c2d-4958-afba-609595ef7b275.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、算法分析與設(shè)計(jì)實(shí)驗(yàn)報(bào)告第 7 次實(shí)驗(yàn)姓名學(xué)號班級時(shí)間6.4上午地點(diǎn)四合院 實(shí)驗(yàn)名稱優(yōu)先隊(duì)列式分支限界法求解0-1背包問題實(shí)驗(yàn)?zāi)康耐ㄟ^上機(jī)實(shí)驗(yàn),要求掌握優(yōu)先隊(duì)列式分支限界法求解0-1背包問題的問題描述、算法設(shè)計(jì)思想、程序設(shè)計(jì)。實(shí)驗(yàn)原理1、使用優(yōu)先隊(duì)列式分支限界法算法,根據(jù)不同的輸入用例,能準(zhǔn)確的輸出背包能裝的最大價(jià)值,并計(jì)算出程序運(yùn)行所需要的時(shí)間。2、分支限界法常以廣度優(yōu)先或最小耗費(fèi)優(yōu)先(最大效益優(yōu)先)方式搜索問題的解空間樹, 對于0-1背包問題的解空間樹是一個(gè)棵子集樹。3、在分支限界法中有一個(gè)活結(jié)點(diǎn)表,活結(jié)點(diǎn)表中的每個(gè)活結(jié)點(diǎn)只有一次機(jī)會成為擴(kuò)展結(jié)點(diǎn),一旦成為 擴(kuò)展結(jié)點(diǎn)就一次性產(chǎn)生所有兒子結(jié)點(diǎn),
2、在這些兒子結(jié)點(diǎn)中,導(dǎo)致不可行解或?qū)е路亲顑?yōu)解的兒子 結(jié)點(diǎn)被舍棄,其余兒子結(jié)點(diǎn)被加入到活結(jié)點(diǎn)表中。4、為了盡快找到0-1背包問題的解,每次選取下一個(gè)活結(jié)點(diǎn)成為擴(kuò)展結(jié)點(diǎn)的判斷依據(jù)是當(dāng)前情況下 最有可能找到最優(yōu)解的下一個(gè)結(jié)點(diǎn)。因此,每次選擇擴(kuò)展結(jié)點(diǎn)的方法:當(dāng)前情況下,在活結(jié)點(diǎn)表中 選擇活結(jié)點(diǎn)的上界,最大的活結(jié)點(diǎn)成為當(dāng)前的擴(kuò)展結(jié)點(diǎn)。 這一過程一直持續(xù)到找到所需的解或活結(jié)點(diǎn)表為空時(shí)為止。實(shí)驗(yàn)步驟1、定義樹結(jié)點(diǎn)類bbnode,用于構(gòu)造子集樹,以便計(jì)算最優(yōu)解;定義堆結(jié)點(diǎn)類HeapNode,用于定義堆元素類型; 定義最大堆類MaxHeap,用于實(shí)現(xiàn)優(yōu)先隊(duì)列定義.物品類Object,用于保存物品編號和物品的單位
3、重量價(jià)值;定義解決0-1背包問題的主類Knap。2、設(shè)計(jì)求解0-1背包問題的主函數(shù)Knapsack,在其中對物品以單位價(jià)值量排序。3、設(shè)計(jì)負(fù)責(zé)求解0-1背包問題的最優(yōu)值和最優(yōu)解函數(shù)MaxKnapsack在其中調(diào)用計(jì)算結(jié)點(diǎn)價(jià)值上界函數(shù)Bound,向子集樹和最大堆中插入結(jié)點(diǎn)函數(shù)AddLiveNode和釋放最大堆最大結(jié)點(diǎn)的函數(shù)DeleteMax,實(shí)現(xiàn)優(yōu)先級隊(duì)列。4、輸入數(shù)據(jù)到input.txt文件中。5、添加計(jì)算運(yùn)行時(shí)間的代碼,計(jì)算不同規(guī)模數(shù)據(jù)的運(yùn)行時(shí)間,并將結(jié)果輸出到output文件中。6、分析時(shí)間復(fù)雜度:在最壞的情況下所有的節(jié)點(diǎn)都入隊(duì),最后一個(gè)節(jié)點(diǎn)才是最優(yōu)解,這種情況下時(shí)間復(fù)雜度是指數(shù)階。最好的
4、情況是只裝單位價(jià)值最大的物品,其余分支都不符合條件被截去這種情況下時(shí)間復(fù)雜度是常數(shù)時(shí)間。但分支限界法本質(zhì)上還是窮舉法,平均時(shí)間復(fù)雜度仍是指數(shù)階。關(guān)鍵代碼/物品類 class Object friend Typep Knapsack(Typew *, Typep *, Typew, int, int *); public: int operator = a.d); private: int ID; /物品編號 float d; /單位重量價(jià)值 ; /樹結(jié)點(diǎn)類 class bbnode friend class Knap; friend Typep Knapsack(Typew *, Typep
5、*, Typew, int, int *); private: bbnode *parent; /指向父節(jié)點(diǎn)的指針 int LChild; ; /堆結(jié)點(diǎn)類 class HeapNode friend class Knap; friend class MaxHeap; public: operator Typep()constreturn uprofit; private: Typep uprofit, /結(jié)點(diǎn)的價(jià)值上界 profit; /結(jié)點(diǎn)所相應(yīng)的價(jià)值 Typew weight; /結(jié)點(diǎn)所相應(yīng)的重量 int level; /活結(jié)點(diǎn)在子集樹中所處的層序號 bbnode *elemPtr; /指
6、向該活結(jié)點(diǎn)在子集樹中相應(yīng)結(jié)點(diǎn)的指針 ; /最大堆類 class MaxHeap public: MaxHeap(int maxElem) HeapElem = new HeapNode* maxElem+1; /下標(biāo)為0的保留 capacity = maxElem; size = 0; void InsertMax(HeapNode *newNode); HeapNode DeleteMax(HeapNode* &N); private: int capacity; int size; HeapNode *HeapElem; ; /0-1背包問題的主類 class Knap friend Ty
7、pep Knapsack(Typew *, Typep *, Typew, int, int *); public: Typep MaxKnapsack(); private: MaxHeap *H; Typep Bound(int i); void AddLiveNode(Typep up, Typep cp, Typew cw, int ch, int level); bbnode *E; /指向擴(kuò)展結(jié)點(diǎn)的指針 Typew c; /背包容量 int n; /物品總數(shù) Typew *w; /物品重量數(shù)組(以單位重量價(jià)值降序) Typep *p; /物品價(jià)值數(shù)組(以單位重量價(jià)值降序) Type
8、w cw; /當(dāng)前裝包重量 Typep cp; /當(dāng)前裝包價(jià)值 int *bestx; /最優(yōu)解 ; void MaxHeap:InsertMax(HeapNode *newNode) int i = 1; for (i = +size; i/2 0 & HeapElemi/2-uprofit uprofit; i /= 2) HeapElemi = HeapElemi/2; HeapElemi = newNode; HeapNode MaxHeap:DeleteMax(HeapNode *&N) if(size 0 ) N = HeapElem1; int i = 1; while(i si
9、ze) if(i*2 +1) uprofit HeapElemi*2 +1-uprofit) HeapElemi = HeapElemi*2; i = i*2; else if(i*2 = size) HeapElemi = HeapElemi*2; i = i*2; else break; if(i size) HeapElemi = HeapElemsize; size-; return *N; Typep Knap:MaxKnapsack() H = new MaxHeap(10000); bestx = new int n+1; int i = 1; E = 0; cw = 0; cp
10、 = 0; Typep bestp = 0; Typep up = Bound(1); while (i != n+1) Typew wt = cw + wi; if(wt bestp) bestp = cp + pi; AddLiveNode(up, cp + pi, cw + wi, 1, i); up = Bound(i + 1); if(up = bestp) AddLiveNode(up, cp, cw, 0, i); HeapNode* N; H-DeleteMax(N); E = N-elemPtr; cw = N-weight; cp = N-profit; up = N-up
11、rofit; i = N-level + 1; for (int i = n; i 0; i-) bestxi = E-LChild; E = E-parent; return cp; Typep Knap:Bound(int i) Typew cleft = c - cw; Typep b = cp; while (i=n & wi = cleft) cleft -= wi; b += pi; i+; if(iparent=E; b-LChild=ch; HeapNode *N = new HeapNode; N-uprofit=up; N-profit=cp; N-weight=cw; N
12、-level=level; N-elemPtr=b; H-InsertMax(N); /Knapsack返回最大價(jià)值,最優(yōu)值保存在bestx Typep Knapsack(Typew *w, Typep *p, Typew c, int n, int *bestx) Typew W = 0; Typep P = 0; Object *Q = new Objectn; for(int i =1; i=n; i+) Qi-1.ID = i; Qi-1.d = 1.0*pi/wi; P += pi; W += wi; if (W = c) for(int i =1; i=n; i+) bestxi
13、= pi; return P; for(int i = 1; in; i+) for(int j = 1; j= n-i; j+) if(Qj-1.d Qj.d) Object temp = Qj-1; Qj-1 = Qj; Qj = temp; Knap K; K.p = new Typep n+1; K.w = new Typew n+1; for(int i = 1; i=n; i+) K.pi = pQi-1.ID; K.wi = wQi-1.ID; K.cp = 0; K.cw = 0; K.c = c; K.n = n; Typep bestp = K.MaxKnapsack();
14、 for(int i = 1; i=n; i+) bestxQi-1.ID = K.bestxi; delete Q; delete K.w; delete K.p; delete K.bestx; delete K.H; return bestp; 測試結(jié)果1、測試自己輸入的小規(guī)模數(shù)據(jù)2、測試隨機(jī)生成1003、隨機(jī)生成1000數(shù)據(jù)4、隨機(jī)生成1000數(shù)據(jù)實(shí)驗(yàn)心得在做本次實(shí)驗(yàn)之前,我對分支限界法的原理并不是很理解,經(jīng)過查看課件及網(wǎng)上查找資料,同時(shí)結(jié)合自己對回溯法等的理解,我對分支限界法有了一個(gè)較好的理解,知道了兩種主要的分支限界法及分支限界法如何應(yīng)用于解01背包問題。在查找資料的過程中,我查看
15、了許多網(wǎng)上的別人的代碼實(shí)現(xiàn),結(jié)合課本上的代碼完成了該實(shí)驗(yàn)。通過本次試驗(yàn),我基本上掌握了優(yōu)先隊(duì)列分支限界法解0-1背包問題的原理,同時(shí)鍛煉了自己動手編寫及調(diào)試代碼的能力,收獲良多。實(shí)驗(yàn)得分助教簽名附錄:完整代碼#include #include#include#includeusing namespace std; ifstream in(input.txt);ofstream out(output.txt);typedef int Typew; typedef int Typep; /物品類 class Object friend Typep Knapsack(Typew *, Typep *
16、, Typew, int, int *); public: int operator = a.d); private: int ID; /物品編號 float d; /單位重量價(jià)值 ; /樹結(jié)點(diǎn)類 class bbnode friend class Knap; friend Typep Knapsack(Typew *, Typep *, Typew, int, int *); private: bbnode *parent; /指向父節(jié)點(diǎn)的指針 int LChild; ; /堆結(jié)點(diǎn)類 class HeapNode friend class Knap; friend class MaxHeap
17、; public: operator Typep()constreturn uprofit; private: Typep uprofit, /結(jié)點(diǎn)的價(jià)值上界 profit; /結(jié)點(diǎn)所相應(yīng)的價(jià)值 Typew weight; /結(jié)點(diǎn)所相應(yīng)的重量 int level; /活結(jié)點(diǎn)在子集樹中所處的層序號 bbnode *elemPtr; /指向該活結(jié)點(diǎn)在子集樹中相應(yīng)結(jié)點(diǎn)的指針 ; /最大堆類 class MaxHeap public: MaxHeap(int maxElem) HeapElem = new HeapNode* maxElem+1; /下標(biāo)為0的保留 capacity = maxElem
18、; size = 0; void InsertMax(HeapNode *newNode); HeapNode DeleteMax(HeapNode* &N); private: int capacity; int size; HeapNode *HeapElem; ; /0-1背包問題的主類 class Knap friend Typep Knapsack(Typew *, Typep *, Typew, int, int *); public: Typep MaxKnapsack(); private: MaxHeap *H; Typep Bound(int i); void AddLiv
19、eNode(Typep up, Typep cp, Typew cw, int ch, int level); bbnode *E; /指向擴(kuò)展結(jié)點(diǎn)的指針 Typew c; /背包容量 int n; /物品總數(shù) Typew *w; /物品重量數(shù)組(以單位重量價(jià)值降序) Typep *p; /物品價(jià)值數(shù)組(以單位重量價(jià)值降序) Typew cw; /當(dāng)前裝包重量 Typep cp; /當(dāng)前裝包價(jià)值 int *bestx; /最優(yōu)解 ; void MaxHeap:InsertMax(HeapNode *newNode) int i = 1; for (i = +size; i/2 0 & Heap
20、Elemi/2-uprofit uprofit; i /= 2) HeapElemi = HeapElemi/2; HeapElemi = newNode; HeapNode MaxHeap:DeleteMax(HeapNode *&N) if(size 0 ) N = HeapElem1; int i = 1; while(i size) if(i*2 +1) uprofit HeapElemi*2 +1-uprofit) HeapElemi = HeapElemi*2; i = i*2; else if(i*2 = size) HeapElemi = HeapElemi*2; i = i*
21、2; else break; if(i size) HeapElemi = HeapElemsize; size-; return *N; Typep Knap:MaxKnapsack() H = new MaxHeap(10000); bestx = new int n+1; int i = 1; E = 0; cw = 0; cp = 0; Typep bestp = 0; Typep up = Bound(1); while (i != n+1) Typew wt = cw + wi; if(wt bestp) bestp = cp + pi; AddLiveNode(up, cp +
22、pi, cw + wi, 1, i); up = Bound(i + 1); if(up = bestp) AddLiveNode(up, cp, cw, 0, i); HeapNode* N; H-DeleteMax(N); E = N-elemPtr; cw = N-weight; cp = N-profit; up = N-uprofit; i = N-level + 1; for (int i = n; i 0; i-) bestxi = E-LChild; E = E-parent; return cp; Typep Knap:Bound(int i) Typew cleft = c
23、 - cw; Typep b = cp; while (i=n & wi = cleft) cleft -= wi; b += pi; i+; if(iparent=E; b-LChild=ch; HeapNode *N = new HeapNode; N-uprofit=up; N-profit=cp; N-weight=cw; N-level=level; N-elemPtr=b; H-InsertMax(N); /Knapsack返回最大價(jià)值,最優(yōu)值保存在bestx Typep Knapsack(Typew *w, Typep *p, Typew c, int n, int *bestx
24、) Typew W = 0; Typep P = 0; Object *Q = new Objectn; for(int i =1; i=n; i+) Qi-1.ID = i; Qi-1.d = 1.0*pi/wi; P += pi; W += wi; if (W = c) for(int i =1; i=n; i+) bestxi = pi; return P; for(int i = 1; in; i+) for(int j = 1; j= n-i; j+) if(Qj-1.d Qj.d) Object temp = Qj-1; Qj-1 = Qj; Qj = temp; Knap K;
25、K.p = new Typep n+1; K.w = new Typew n+1; for(int i = 1; i=n; i+) K.pi = pQi-1.ID; K.wi = wQi-1.ID; K.cp = 0; K.cw = 0; K.c = c; K.n = n; Typep bestp = K.MaxKnapsack(); for(int i = 1; i=n; i+) bestxQi-1.ID = K.bestxi; delete Q; delete K.w; delete K.p; delete K.bestx; delete K.H; return bestp; int main() cout請?jiān)趇nput.txt文件中輸入物品數(shù)量、背包容量N; Typew c; /背包容量 inc; int bestxN+1; /最優(yōu)解 int bestp; /最優(yōu)值 Typep pN+1;/物品價(jià)值 Typew wN+1;/物品重量 cout在input.txt文件中讀取的物品總數(shù)N = N,背包容量C = cendl; cout請選擇生成數(shù)據(jù)的規(guī)模大?。?00請輸入1,2000請輸入2,20000請輸入3x;if(x=1)ofstream in1(input1.txt);srand(time(NULL); int n=200; int *a=n
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年可穿戴人工角膜保護(hù)鏡行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 航空、航天設(shè)備相關(guān)專用設(shè)備項(xiàng)目風(fēng)險(xiǎn)識別與評估綜合報(bào)告
- 2025年春新蘇科版數(shù)學(xué)七年級下冊全冊教學(xué)課件
- 關(guān)于會計(jì)的實(shí)習(xí)報(bào)告
- 2025年度供應(yīng)商物流貨物運(yùn)輸合同與物流信息化改造協(xié)議
- 2025年度文化娛樂產(chǎn)業(yè)股權(quán)轉(zhuǎn)讓及項(xiàng)目運(yùn)營合同
- 2025年度合租房租租賃合同(含社區(qū)圖書館及學(xué)習(xí)空間)
- 2025年度廣告?zhèn)髅郊媛殑?chuàng)意策劃人聘用合同
- 2025年度建筑工程施工合同風(fēng)險(xiǎn)評估及應(yīng)對措施合同范本
- 2025年度建筑節(jié)能咨詢與服務(wù)合同
- 江蘇省蘇州市2024-2025學(xué)年第一學(xué)期八年級數(shù)學(xué)期末模擬卷(一)(無答案)
- 【歷史】秦漢時(shí)期:統(tǒng)一多民族國家的建立和鞏固復(fù)習(xí)課件-2024-2025學(xué)年統(tǒng)編版七年級歷史上冊
- 社區(qū)中心及衛(wèi)生院65歲及以上老年人健康體檢分析報(bào)告模板
- 化工過程安全管理導(dǎo)則AQT 3034-2022知識培訓(xùn)
- 第02講 導(dǎo)數(shù)與函數(shù)的單調(diào)性(教師版)-2025版高中數(shù)學(xué)一輪復(fù)習(xí)考點(diǎn)幫
- 2024屆新高考語文高中古詩文必背72篇 【原文+注音+翻譯】
- 2024電力建設(shè)工程質(zhì)量問題通病防止手冊
- 中華人民共和國學(xué)前教育法
- 2024年貴州公務(wù)員考試申論試題(B卷)
- 三年級(下冊)西師版數(shù)學(xué)全冊重點(diǎn)知識點(diǎn)
- 期末練習(xí)卷(試題)-2024-2025學(xué)年四年級上冊數(shù)學(xué)滬教版
評論
0/150
提交評論