01背包問題不同算法設(shè)計分析與對比_第1頁
01背包問題不同算法設(shè)計分析與對比_第2頁
01背包問題不同算法設(shè)計分析與對比_第3頁
01背包問題不同算法設(shè)計分析與對比_第4頁
01背包問題不同算法設(shè)計分析與對比_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、實驗三01背包問題不同算法設(shè)計、分析與對比一.問題描述給定n種物品和一背包。物品i的重量是Wi,其價值為vi,背包的容量為c。 問題:應如何選擇裝入背包中的物品,使得裝入背包中物品的總價值最大。說明:在選擇裝入背包的物品時,對每種物品 i只有兩個選擇,裝入背包或 不裝入背包,也不能將物品裝入背包多次。二.實驗內(nèi)容與要求實驗內(nèi)容:1分析該問題適合采用哪些算法求解(包括近似解)。動態(tài)規(guī)劃、貪心、回溯和分支限界算法。2分別給出不同算法求解該問題的思想與算法設(shè)計, 并進行算法復雜性分析。動態(tài)規(guī)劃:遞推方程:m(i,j) = maxm(i-1,j),m(i-1,j-wi)+vi j = wi;m(i-1

2、,j) j wi;時間復雜度為0(n).貪心法:算法思想:貪心原則為單位價值最大且重量最小,不超過背包最大承重量 為約束條件。也就是說,存在單位重量價值相等的兩個包, 則選取重量較小的那 個背包。但是,貪心法當在只有在解決物品可以分割的背包問題時是正確的。貪心算法總是作出在當前看來最好的選擇。也就是說貪心算法并不從整體最優(yōu)考 慮,它所作出的選擇只是在某種意義上的局部最優(yōu)選擇。用貪心法設(shè)計算法的特點是一步一步地進行,根據(jù)某個優(yōu)化測度(可能是目 標函數(shù),也可能不是目標函數(shù)),每一步上都要保證能獲得局部最優(yōu)解。每一步 只考慮一個數(shù)據(jù),它的選取應滿足局部優(yōu)化條件。若下一個數(shù)據(jù)與部分最優(yōu)解連 在一起不再

3、是可行解時,就不把該數(shù)據(jù)添加到部分解中, 直到把所有數(shù)據(jù)枚舉完,或者不能再添加為止?;厮莘?回溯法:為了避免生成那些不可能產(chǎn)生最佳解的問題狀態(tài), 要不斷地利用限 界函數(shù)(bounding function)來處死那些實際上不可能產(chǎn)生所需解的活結(jié)點, 以減少 問題的計算量。這種具有限界函數(shù)的深度優(yōu)先生成法稱為回溯法。對于有n種可選物品的0/1背包問題,其解空間由長度為n的0-1向量組成,可用 子集數(shù)表示。在搜索解空間樹時,只要其左兒子結(jié)點是一個可行結(jié)點, 搜索就進 入左子樹。當右子樹中有可能包含最優(yōu)解時就進入右子樹搜索。時間復雜度為:0(0)空間復雜度為:0(n)分支限界算法:首先,要對輸入數(shù)據(jù)

4、進行預處理,將各物品依其單位重量價值從大到小進行 排列。在優(yōu)先隊列分支限界法中,節(jié)點的優(yōu)先級由已裝袋的物品價值加上剩下的 最大單位重量價值的物品裝滿剩余容量的價值和。算法首先檢查當前擴展結(jié)點的左兒子結(jié)點的可行性。如果該左兒子結(jié)點是可 行結(jié)點,則將它加入到子集樹和活結(jié)點優(yōu)先隊列中。 當前擴展結(jié)點的右兒子結(jié)點 一定是可行結(jié)點,僅當右兒子結(jié)點滿足上界約束時才將它加入子集樹和活結(jié)點優(yōu) 先隊列。當擴展到葉節(jié)點時為問題的最優(yōu)值。3設(shè)計并實現(xiàn)所設(shè)計的算法。4對比不同算法求解該問題的優(yōu)劣。這動態(tài)規(guī)劃算法和貪心算法是用來分別解決不同類型的背包問題的,當一件背包物品可以分割的時候,使用貪心算法,按物品的單位體積的

5、價值排序,從大 到小取即可。 當一件背包物品不可分割的時候,(因為不可分割,所以就算按 物品的單位體積的價值大的先取也不一定是最優(yōu)解)此時使用貪心是不對的,應 使用動態(tài)規(guī)劃。設(shè)計方法時間復雜度優(yōu)點缺點動態(tài)規(guī)劃Minnc,2n可求得最優(yōu)決策序列速度慢貪心方法0(2n)速度較快很難得到最優(yōu)解回溯法O (n2n)能夠得到最優(yōu)解時間復雜度較咼分支限界法O(2n)速度較快,易求解占用內(nèi)存大,效率不咼5需要提交不同算法的實現(xiàn)代碼和總結(jié)報告動態(tài)規(guī)劃方法:public class Knapsack public static void main(String args) in t value = 0, 60,

6、 100, 120 ;in t weigh = 0, 10, 20, 30 ;int weight = 50;Knapsack1 (weight, value, weigh );public static void Knapsack1(int weight, int value, int weigh) int v = new int ;int w = new int ;int c = new int weight + 1;int d = new int 100;for (int i = 0; i ; i+) vi = valuei;wi = weigh i;for (int i = 1; i

7、; i+) for (int k = 1; k = weight; k+) if (wi j i : j;return k;貪心法:public class GreedyKnapSack public static void main(String args) in t value = 0, 60, 100, 120 ;in t weigh = 0, 10, 20, 30 ;int weight = 50;Knapsack1 (weight, value, weigh );private static void Knapsack1(int weight, int v, int w) int n

8、 =;double r = new double n;int index = new int n;for(int i = 0;i n; i+)ri = (double )vi / (double )wi;in dex i = i;/ 按單位重量價值 ri=vi/wi 降序排列double temp = 0;for (int i = 0;i n-1;i+)for (int j = i+1;j n;j+)if(ri rj)temp = ri;ri = rj;rj = temp;int x = indexi;indexi = index j;index j = x;/ 排序后的重量和價值分別存到w1

9、 和 v1 中int w1 = new intn;int v1 = new intn;for (int i = 0;i n;i+)w1i = w index i;v1i = vindex i;(w1);(v1);int s=0;/ 包內(nèi)現(xiàn)存貨品的重量int value=0;/ 包內(nèi)現(xiàn)存貨品總價值for (int i = 0; i n;i+)if(s + w1 i weight)value += v1 i;s += w1 i;背包中物品的最大總價值為” + value);回溯法:public class BacktrackKnapSack public static void main(Stri

10、ng args) in t value = 0, 60, 100, 120 ;in t weigh = 0, 10, 20, 30 ;int weight = 50;Knapsack1 (weight, value, weigh );private static void Knapsack1(int weight, int v, int w) int n =;double r = new double n;int index = new int n;for(int i = 0;i n; i+)ri = (double )vi / (double )wi;in dexi = i;/按單位重量價值

11、 ri=vi/wi降序排列 double temp = 0; for (int i = 0;i n-1;i+)for (int j = i+1;j n;j+)if(ri rj)temp = ri;ri = rj;rj = temp;int x = indexi;indexi = index j;index j = x;/ 排序后的重量和價值分別存到 w1 和 v1 中int w1 = new intn;int v1 = new intn;for (int i = 0;i = 0)if(CurrentWeight + w1i weight)Curre ntWeight += w1 i;Curre

12、 ntValue += v1 i;i+;elsebreak;if(i n)maxValue = CurrentValue ;1背包中物品的最大總價值為” + maxValue);分支限界算法:package bagO1b;import class bag01do public static void main(String args) / TODO Auto-ge nerated method stubArrayList objects = new ArrayList();(new object(10,60);(new object(20,100);bag b=new bag(50,objec

13、ts );();();package bag01b;importclass bag private int bagv;private ArrayList objects ;private int maxvalue ;private ArrayList result_objects ;public bag(int v,ArrayList o) super ();=v;=o;=0;=null ;(objects);public void show()maxvalue :+ ;the object when maxvalue: +;public void findmaxvalue()Priority

14、Queue enode= new PriorityQueue();Node node= new Node(0,null ,bagv,;(node);while (true )if()break ;node=();if()=();=new ArrayList();return ;int i=();object iobject=if ()+()=ArrayList newnodeinbag= new ArrayList();(iobject);int newnodebagv=()();Node newnode= new Node(i+1,newnodeinbag,newnodebagv,;(new

15、node);if ()=();=new ArrayList();Node newnode= new Node(i+1,(),(),;if()(newnode);package bag01b;import class Node implements Comparableprivate int node_in ;private ArrayList inbag_object ;private ArrayList outbag_object ;private int leftv ;private int prio;public Node( int i,ArrayList in, int l,Array

16、List out) super();=i;if (in=null )in= new ArrayList();=in;=l;=out;=();private int find_prio() / TODO Auto-generated method stubint bag_left=;int p=();int i=;object iobject= null;while (true )if (i=break;iobject= if ()bag_left) break;bag_left-=();p+=();i+;if (i return -1;if return 1;return 0;public b

17、oolean isend()if= return true;elsereturn false;public ArrayList get_in_bag_object() return ;public int get_node_in() return ;public int get_bag_leftv() return ;public int get_bag_prio() return ;public String toString()return node in +node prio +;package bag01b;public class object implements Comparable private static int ids=1;private int id;private int weihgt ;private int value; public object( int w,int v) super();=w;=v;=ids+;public

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論