0-1背包问题求解方法综述

上传人:夏** 文档编号:497190236 上传时间:2022-09-10 格式:DOCX 页数:23 大小:100.14KB
返回 下载 相关 举报
0-1背包问题求解方法综述_第1页
第1页 / 共23页
0-1背包问题求解方法综述_第2页
第2页 / 共23页
0-1背包问题求解方法综述_第3页
第3页 / 共23页
0-1背包问题求解方法综述_第4页
第4页 / 共23页
0-1背包问题求解方法综述_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《0-1背包问题求解方法综述》由会员分享,可在线阅读,更多相关《0-1背包问题求解方法综述(23页珍藏版)》请在金锄头文库上搜索。

1、0-1背包问题求解方法综述算法分析与设计大作业实验题目:0-1背包问题求解方法综述组员:班级:指导老师:0-1背包问题求解方法综述【摘要】:0-1背包问题是一个经典的NP-hard组合优化问题,现实生活中的很多问题都可以以它为模型。本文首先对背包问题做了阐述,然后用蛮力解法、动态规划算法、贪心算法和回溯解法对背包问题进行求解,分析了0-1背包问题的数学模型,刻划了最优解的结构特征,建立了求最优值的递归关系式。最后对四种算法从不同角度进行了对比和总结。解法【关键词】:0-1背包问题;蛮力解法;动态规划算法;贪心算法;回溯0.引言0-1背包问题是指给定n个物品,每个物品均有自己的价值vi和重量wi

2、(i=1,2,门),再给定一个背包,其容量为W要求从n个物品中选出一部分物品装入背包,这部分物品的重量之和不超过背包的容量,且价值之和最大。单个物品要么装入,要么不装入。很多问题都可以抽象成该问题模型,如配载问题、物资调运1问题等,因此研究该问题具有较高的实际应用价值。目前,解决0-1背包问题的方法有很多,主要有动态规划法、回溯法、分支限界法、遗传算法、粒子群算法、人工鱼群算法、蚁群算法、模拟退火算法、蜂群算法、禁忌搜索算法等。其中动态规划、回溯法、分支限界法时间复杂性比较高,计算智能算法可能出现局部收敛,不一定能找出问题的最优解。文中在动态规划法的基础上进行了改进,提出一种求解0-1背包I可

3、题的算法,该算法每一次执行总能得到I可题的最优解,是确定性算法,算法的时间复杂性最坏可能为O(2n)。1.0-1背包问题描述0-1背包问题(KP01)是一个著名的组合优化问题。它应用在许多实际领域,如项目选择、资源分布、投资决策等。背包问题得名丁如何选择最合适的物品放置丁给定背包中。本文主要研究背包问题中最基础的0/1背包问题的一些解决方法。为解决背包问题,大量学者在过去的几十年中提出了很多解决方法。解决背包问题的算法有最优算法和启发式算法2,最优算法包括穷举法、动态规划法、分支定界法、图论法等,启发式算法包括贪心算法、遗传算法、蚁群算法、粒子算法等一些智能算法。0-1背包问题一般描述为:给定

4、n种物品和一个背包。物品i的重量是w(i),其价值为v(i),背包的容量为Co问应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。因此,该问题称为0-1背包问题。此问题的形式化描述是,给定c0,wi0,vi0,1in,要求找出一个nnn元0-1向量(x,X2,Xn),Xi0,1,1in,使得wxic,而且vxi1i1达到最大。n数学模型:maxvixii1n约束条件:wxcXQ1,1ini12.0-1背包问题的求解算法2.1蛮力算法(bruteforceme

5、thod)2.1.1基本思想:对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1向量组成,可用子集数表示。在搜索解空间树时,深度优先遍历,搜索每一个结点,无论是否可能产生最优解,都遍历至叶子结点,记录每次得到的装入总价值,然后记录遍历过的最大价值。2.1.2代码实现:#include#includeusingnamespacestd;#defineN100/最多可能物体数structgoods/物品结构体intsign;/物品序号intw;/物品重量intp;/物品价值aN;boolm(goodsa,goodsb)return(a.p/a.w)(b.p/b.w);intmax(in

6、ta,intb)returnan-1)if(bestPcp&cw+ai.w=C)for(intk=0;kn;k+)Xk=cxk;/存储最优路径bestP=cp;returnbestP;cw=cw+ai.w;cp=cp+ai.p;cxi=1;/装入背包Force(i+1);cw=cw-ai.w;cp=cp-ai.p;cxi=0;/不装入背包Force(i+1);returnbestP;intKnapSack1(intn,goodsa,intC,intx)Force(0);returnbestP;intmain()goodsbN;printf(物品种数n:);scanf(%d,&n);/输入物品种

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

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

9、一般有以下三种策略:价值最大者优先:在剩余物品中,选出可以装入背包的价值最大的物品,若背包有足够的容量,以此策略,然后是下一个价值最大的物品。但这种策略背包的承重量不能够得到有效利用,即得不到最优解。例如: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。单位价值最大者优先:根据价值与重

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

11、e#includeusingnamespacestd;#definemax100/自定义物品最大数voidpackage(intv,intw,intn,intc)/定义包函数(doubleamax;inti,totalv=0,totalw=0,indexmax;for(i=0;in;i+)ai=(double)vi/wi;/单位价值计算indexi=i;for(i=1;in;i+)for(intj=O;jn-i;j+)if(ajaj+1)/进行循环判断(doubleb=aj;aj=a0+1;aU+1=b;intc=vj;vU=vj+1;vj+1=c;intd=wj;wj=wj+1;wj+1=d

12、;inte=indexj;indexj=indexj+1;indexj+1=e;cout单位价值:;ll输出单位价值for(i=0;in;i+)(coutaicoutendl物品价值:”;/输出物品价值for(i=0;in;i+)coutvit;coutendlW品重ft/输出物品重量for(i=0;in;i+)coutwit;coutendl;doublexmax=0;i=0;while(wi=c)xi=1;c=c-wi;i+;cout所选择的商品如下:endl;cout序号i:t重量w:t价格v:tendl;/for(i=0;in;i+)if(xi=1)totalw=totalw+wi;t

13、otalv=totalv+vi;coutindexi+1twitviendl;cout背包的总重量为:totalwendl;cout背包的总价值为:totalvendl;intmain(void)LARGE_INTEGERbegin,end,frequency;QueryPerformanceFrequency(&frequency);srand(time(0);intn,i,xmax;intvmax,wmax,W;coutnW;for(i=0;in;i+)xi=0;for(i=0;in;i+)vi=rand()%1000;wi=rand()%1000;cout商品的重量和价值如下:endl;

14、for(inti=0;in;i+)输出所选择的商品/n和背包容量W:;/(coutwit;coutviendl;QueryPerformanceCounter(&begin);package(v,w,n,W);/背包所装载总重量背包的总价值主函数定义变量的定义物品选择情况表初始化为0函数的调用fl_339782827例99H3342H11694”4363S89428277244133416947896S7B523196,99S827序号土:1:&464背包的总重堂为,育包的总价适务,S7|a:a,6321598s清挎任意键继域.贪心算法求解0/1背包问题的时间复杂度为:(nlogn)QueryPer

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号