- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
解决0―1背包问题启发式算法
解决0―1背包问题启发式算法 【摘 要】本文给出了背包问题基于0/1规划的数学模型,提出了这类问题的一种基于贪婪算法的启发式近似算法,通过寻找尽可能大的可行解和尽可能小的上界,从而求出近似最优解,该算法的优点是可以给出计算误差,算法的最坏性能比是2,并通过编程计算证明该算法具有良好的性能。
【关键词】0-1背包;贪心算法;启发式算法
0 引言
0-1背包问题(0-1 knapsack problem)是一个经典的NP-完全问题,在现实生活中具有广泛的应用,如物流公司的货物发配,集装箱的装运,资金运算,存储分配等问题,并且还常常作为其他问题的子问题加以研究。背包问题实际是指从多种物品中选择几件物品装满背包,要在不超过背包承重量的前提下,使装入背包的价值最大。
解决0-1背包问题的方法可以分为最优算法和启发式算法。最优算法包括穷举法、动态规划算法、递归算法等,可以找到最优解但只适用于小规模问题;启发式算法包括贪心算法[1]、遗传算法[2]等,一般用于求解较大规模问题。贪心算法具有良好的爬坡能力,但只能搜索一个局部最优解。遗传算法只能反映种群之间的优劣关系,无法判断最终结果与全局最优解的相似程度,这影响了所求结果的可信性。
本文提出了一种启发式算法,通过求上界来判断近似最优解与最优解的相似程度,算法总是选择较有可能出现最优解的那部分可行解,用贪心算法搜索,并排除不可能包含最优解的一部分可行解,因此大大提高了搜索效率。每个实际的问题对计算时间及计算精度的要求都不一样,一般情况下该算法都可以较快地求出满足计算精度要求的近似最优解,当算法不能在限定的计算时间内找到满足问题要求的近似最优解时,给出一个可行解及计算误差,作为决策参考。
1 背包问题的数学模型
背包问题的数学模型实际上是一个0-1规划问题。假设有n个物件,其重量用wi表示,价值为pi(i= 1,2,…,n) ,背包的最大容纳重量为c,当物件i被选入背包时,定义变量xi =1,否则xi = 0。现在考虑n个物件的选择与否,则背包内n个物件总重量为■wixi ,物件的总价值为■pixi ,如何决定变量xi(i = 1,2,…,n)的值(即确定一个物件组合)使背包内物件总价值为最大。[3]其数学模型表示如下:
Maximize■pixi Subject to■wixi ≤c
xi=1或0(i = 1,2,…,n)
2 基于贪心算法的启发式算法
2.1 贪心算法
贪心算法是求解0-1背包问题最快速的方法之一,其时间复杂度为O(n2) ,其求解步骤如下:
(1)对物品以pi /wi 从大到小排列,不妨把排列记成{1, 2,…, n}, k:=1;
(2)若装入第k个物品背包不会溢出,则装入第k个物品,k:=k+1;
当k=n+1时,停止,否则重复(2).
例如,c=10,n=2,wi={ε,10},pi={2ε,10},其中ε 0,当ε→0 时,用贪心算法求解结果是2ε,而最优解为10,性能比为(10/2ε)→∞,可见贪心算法最坏性能比趋于无穷,不是近似算法。
2.2 基于贪心算法的启发式算法的基本思路
本文提出一个计算背包问题上界的方法,利用上界选择搜索较有可能出现最优解的区域,并排除不可能出现最优解的区域,同时判断找到的可行解与最优解的相似程度。
2.2.1 问题的上界
定理1:用贪心算法求解,如果■wi≤c,将所有物品全部装包就是最优解,这个最优解是它的上界。否则设第一个不能入包的物品为s,问题的一个上界是
M=■pi+(c-■wi )pi /wi
证明:将物品s分成2部分,体积分别为:■wi和ws-(c-■wi)/ws,价值与体积等比,作为2个新的物品s′和s”,形成一个新问题,显然新问题的可行解包含原始问题的所有可行解,而且1, 2, , s′是新问题的最优解,所以它对应的目标数值M是原始问题可行解的目标函数值的一个上。
证毕。
在原始问题中添加约束条件:xs =0 和xs =1,形成2个子问题,称为原始问题的直系子问题,易知用贪心算法求解原始问题和它的第一个子问题结果相同。分别求出2个直系子问题的上界M2,M3,显然M2,M3≤M,而且max{M2,M3 }也是原始问题的上界。如果将原始问题划分成很多个子问题,只要其中的某个子问题包含了原始问题的最优解,则这些子问题的上界中的最大者是原始问题的上界。
2.2.2 问题求解
设已经找到的可行解的最大值为cE,所有子问题的上界的最大值为cM,计算误差为(cM- cE)/cM。计算结束时,近似最优解就是cE,显然近似最优解与全局最优解的实际误差不大于计算误差。
当一个子
文档评论(0)