ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:472.59KB ,
资源ID:20682754      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20682754.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(01背包问题求解方法综述Word格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

01背包问题求解方法综述Word格式.docx

1、数学模型:约束条件:, 2.0-1背包问题的求解算法2.1蛮力算法(brute force method)对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1向量组成,可用子集数表示。在搜索解空间树时,深度优先遍历,搜索每一个结点,无论是否可能产生最优解,都遍历至叶子结点,记录每次得到的装入总价值,然后记录遍历过的最大价值。#includealgorithmusing namespace std;#define N 100 /最多可能物体数struct goods /物品结构体 int sign; /物品序号 int w; /物品重量 int p; /物品价值aN;bool m(go

2、ods a,goods b) return (a.p/a.w)(b.p/b.w);int max(int a,int b) return an-1) if(bestPcp&cw+ai.w=C) for (int k=0;kn;k+) Xk=cxk;/存储最优路径 bestP=cp; return bestP; cw=cw+ai.w; cp=cp+ai.p; cxi=1; /装入背包 Force(i+1); cw=cw-ai.w; cp=cp-ai.p; cxi=0; /不装入背包int KnapSack1(int n,goodsa,int C,int x) Force(0);int main(

3、) goods bN; printf(物品种数n: ); scanf(%d,&n); /输入物品种数背包容量C:C); /输入背包容量 for (int i=0;ii+) /输入物品i的重量w及其价值v 物品%d的重量w%d及其价值v%d:,i+1,i+1,i+1);%d%dai.w,&ai.p); bi=ai; int sum1=KnapSack1(n,a,C,X);/调用蛮力法求0/1背包问题蛮力法求解0/1背包问题:nX= for(i=0;i+) coutXi;/输出所求Xn矩阵 装入总价值%dn,sum1); bestP=0,cp=0,cw=0;/恢复初始化蛮力法求解0/1背包问题的时

4、间复杂度为:2n2.2贪心算法(Greedy algorithm) 贪心算法通过一系列的选择来得到问题的解。贪心选择即它总是做出当前最好的选择4。贪心选择性质指所求问题的整体最优解可以通过一系列局部最优选择,这是贪心算法与动态规划算法的主要区别。 贪心算法每次只考虑一步,每一步数据的选取都必须满足局部最优条件。在枚举剩下数据与当前已经选取的数据组合获得的解中,提取其中能获得最优解的唯一的一个数据,加入结果数据中,直到剩下的数据不能再加入为止6。贪心算法不能保证得到的最后解是最佳的,也不能用来求最大或最小解问题,只能求满足某些约束条件的可行解范围。用贪心算法解决0-1背包问题一般有以下三种策略:

5、价值最大者优先:在剩余物品中,选出可以装入背包的价值最大的物品,若背包有足够的容量,以此策略,然后是下一个价值最大的物品。但这种策略背包的承重量不能够得到有效利用,即得不到最优解。例如:n=3,w=50,20,20,v=10,7,7c=55,得到的解是x=1,0,0,这种方案的总价值为10,而最优解为0,1,1,总价值为14。重量最小者优先:在剩余物品中,选择可以装入背包的重量最小的物品。但这种策略,不能保证重量小的是最有价值的,也不能得到最优解。n=2,w=10,20,v=5,100,c=25,得到的解为x=1,0,而最优解是0,1。单位价值最大者优先:根据价值与重量的比值/,即单位价值,在

6、剩下的物品中依次选取比值最大的物品装入背包。这种策略也不能得到最优解。n=3,w=20,15,15,v=40,25,25,=2,5/3,5/3,c=30,得到的解x=1,0,0,而最优解是0,1,1。但它是直觉上的一个近似解。本文讨论该策略。策略3的具体步骤为:第一步:计算每个物品的价值比=,i=1,2,n。第二步:对物品的价值比非递增排序。第三步:重复下面操作,直到有序列表中留下物品。如果列表中的当前物品能够装入背包,就将它放入背包中,否则,处理下一个物品。#includestdafx.h#include Windows.husing namespacestd;#define max 100

7、 /自定义物品最大数void package(int v,int w,int n,int c) /定义包函数 doubleamax; inti,totalv=0,totalw=0,indexmax; ai=(double)vi/wi; /单位价值计算 indexi=i; for(i=1; for(int j=0;jn-i;j+) if(ajaj+1) /进行循环判断 double b=aj; aj=aj+1; aj+1=b; int c=vj; vj=vj+1; vj+1=c; int d=wj; wj=wj+1; wj+1=d; int e=indexj; indexj=indexj+1;

8、indexj+1=e;单位价值: /输出单位价值aiendl物品价值: /输出物品价值vit物品重量: /输出物品重量wiendl; doublexmax=0; i=0; while(wi=c) xi=1; c=c-wi; i+;cout所选择的商品如下:序号i:t重量w:t价格v: /输出所选择的商品if(xi=1)totalw=totalw+wi;totalv=totalv+vi;indexi+1背包的总重量为:totalw /背包所装载总重量背包的总价值为:totalvnW;for(i=0;xi=0; /物品选择情况表初始化为0vi=rand()%1000;wi=rand()%1000;

9、商品的重量和价值如下: for(int i=0; cout QueryPerformanceCounter(&begin); package(v,w,n,W); /函数的调用end);时间: Mn-1c,表明第n个物品被装入背包,则=1,前n-1个物品没有被装入背包,则=0,前n-1个物品被装入容量为c的背包中。以此类推,知道确定第1个物品是否被装入背包为止。由此,得到下面的关系式:如果Mij=Mi-1j,说明第i个物品没有被装入背包,则=0;如果MijMi-1j,说明第i个物品被装入背包,则=1,j=j-按照上述关系式,从Mnc的值向前倒推,即j初始为c,i初始为n,即可确定装入背包的具体物

10、品。上述算法需要O(nc)时间计算时间。不过上述算法有2个明显的确点。一是算法要求所给物品的重量(1in)是整数;二是当背包容量c很大时,算法需要的计算时间较多。O(nm)2.4 回溯法(Backtracking)回溯法是一种系统地搜索问题解答的方法。为了实现回溯,首先需要为问题定义一个解空间,这个解空间必须至少包含问题的一个解(可能是最优的)。一旦定义了解空间的组织方要选择一个对象的子集,将它们装人背包,以便获得的收益最大,则解空间应组织成子集树的形状。首先形成一个递归算法,去找到可获得的最大收益。然后,对该算法加以改进,形成代码。改进后的代码可找到获得最大收益时包含在背包中的对象的集合。左

11、子树表示一个可行的结点,无论何时都要移动到它,当右子树可能含有比当前最优解还优的解时,移动到它。一种决定是否要移动到右子树的简单方法是r为还未遍历的对象的收益之和,将r加到cp(当前节点所获收益)之上,若( r+cp) =bestp(目前最优解的收益),则不需搜索右子树。一种更有效的方法是按收益密度vi/wi对剩余对象排序,将对象按密度递减的顺序去填充背包的剩余容量。#defineN 100 /最多可能物体数structgoods /物品结构体 /物品价值aN,bN;int max1(int a,intb) /最大函数定义int n,W,bestP=0,cp=0,cw=0; /变量定义int

12、BackTrack(int i) if(bestPcp) for (int k=0; bestP=cp; returnbestP; if(cw+ai.w=W) /进入左子树 cw=cw+ai.w; cp=cp+ai.p; cxai.sign=1; /装入背包 BackTrack(i+1); cw=cw-ai.w; cp=cp-ai.p; /回溯,进入右子树 cxai.sign=0; /不装入背包 BackTrack(i+1);void KnapSack3(intn,goods a,int C,intx) int totalW=0; for(inti=0; xi=0; ai.sign=i; so

13、rt(a,a+n,m); /将各物品按单位重量价值降序排列 BackTrack(0);i+) /进行循环输出 if(Xi=1) couti+1totalW+=bi.w;bi.wbi.p放入背包的物品总重量为:totalW;放入背包的物品总价值为:bestP for (inti=0;i+) /输入物品i的重量w及其价值v ai.w=rand()%1000; ai.p=rand()%1000; bi=ai;物品的重量和价值分别如下: coutai.w;ai.p KnapSack3(n,a,W,X); /调用回溯法求0/1背包问题 2.4. 3 运行结果回溯法法的时间复杂度为2.5分枝-限界法(Br

14、anch - threshold method)分枝限界法是另一种系统地搜索解空间的方法,它与回溯法的主要区别在于对E-结点的扩充方式。每个活结点有且仅有一次会变成E-结点。当一个结点变为E-结点时,则生成从该结点移动一步即可到达的所有新结点。在生成的结点中,抛弃那些不可能导出最优解的结点,其余结点加人活结点表,然后从表中选择一个结点作为下一个E结点。从活结点表中取出所选择的结点并进行扩充,直到找到解或活动表为空,扩充才结束。首先,要对输入数据进行预处理,将各物品依其单位重量价值从大到小进行排列。在下面描述的优先队列分支限界法中,节点的优先级由已装袋的物品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值和。算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩展

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1