0-1背包问题的算法与研究 优化作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0-1背包问题算法分析
背包问题又称子集合问题,最早是由Dantzing 于20世纪50年代首次提出的,已成为计算机学科中一个经典的NP 问题 . 0-1背包问题在很多领域都有广泛的应用,很多实际问题都可转换为0-1背包问题,例如下料问题,贷款组合优化决策问题等,0-l 整数线性规划问题可以归结为0-1背包问题,而整数线性规划问题都可以转化为0-l 整数线性规划问题。所以,对0-1背包问题求解方法的研究无论是在理论上还是在实践中都具有一定的意义。
一 0-1 背包问题的数学模型及其分类
0-1 背包问题的数学模型如下:
假设n 个物件,其重量用w i 表示,价值为p i (i =1,2,…, n ),背包的最大容纳重量为c,当物件i 被选入背包时,定义变量 x i =1,否则 x i =0。现在考虑 n 个物件的选择与否,则背包内 n 个物件总重量为Σw i x i ,物件的总价值为Σp i x i ,如何决定变量x i (i =1,2,…,n )的值(即确定一个物件组合)使背包内物件总价值为最大,其数学模型表示如下:
{ 0
..max 11≤∑∑==i n i i i n i i x w t s x p
到目前为止,求解0-1背包问题的方法很多,精确算法有分支限界法,动态规划法等,近似算法有贪婪方法、蚁群算法等。一般来说,精确算法不能在较短时间内求解大规模0-1背包问题,使其实用性受到限制。 而近似算法只能求解问题的近似解,有时所得的近似解质量很低。本文主要针对常见的求解0-1背包问题的算法设计方法进行阐述.
二 算法思想描述及其性能分析
1 分支界限法
第一个基于分支界限法的背包问题求解是由Horowit znd Sahni,Nauss and Martello and Toth 于20世纪70年代提出.分支界限法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索.该算法在具体执行时,把全部可行的解空间不断分割为越来越小的子集(成为分支),并为每个子集内的解的值计算一个下界或上界(称为定界).在每次分支后,对凡是界限超出已知可行解值的那些子集不再做进一步分支.这样,解的许多子集(即搜索树上的许多结点)就可以不予考虑了,从而缩小了搜索范围.这一过程一直进行到找出可行解为止,该可行解的值不大于任何子集的界限,因此这种算法一般可以求得最优解.
分支界限法是组合优化问题的有效求解方法,对于0-1背包问题,其计算步骤如下所述:
(1) 计算每个节点即解集中部分物品的重量和。如当前重量超过背包容量w ,
则将在该节点下的所有子树删除;
(2) 计算上一级分支的所有可能解的价值,如果当前分支的价值比较小或相
等则删除。
分支界限法并不用于纯粹的深度优先模式,而是最好优先:选择最优希望达到目标结点的结点优先扩展。此算法由于从最小下界分支,每次算完限界后,把搜索树上当前所有的叶子结点的界限进行比较,找出限界最小的结点,此结点即为下次分支的结点。这种决策的优点是检查子问题较少,能较快地求得最佳解。
在最坏情况下,不可避免地要在整个状态空间树上进行搜索,要存储很多叶子结点的限界和对应的耗费矩阵,需要数级的时间复杂度O (n
2),此时其空间消耗也较大。可以说一个分支定界求解方法的效率基本上由值界方法决定,若界估计不好,在极端情况下将于穷举搜索没多大区别。
2 动态规划法
动态规划法DM (Dynamic Programming ,简称DM )是美国 数学家
Bellman R E 等人20世纪50年代初在研究阶段决策过程的优化问题时提出的,把多阶段决策过程转化为一系列单阶段决策问题逐个求解,创立了解决这类过程优化问题的新方法—动态规划。动态规划算法是先把问题分成多个子问题(一般地每个子问题是互相关联和影响的),再依次研究逐个问题的决策。决策就是某个阶段的状态确定后,从该状态演变到下一阶段状态的选择。 当全体子问题都解决时,整体问题也随之解决。用枚举的方法从所有可能的决策序列中去选取最优决策序列可能是较费时的笨拙方法,但利用最优性原理去找出递推关系,再找最优决策序列就可能使得枚举数量大大下降,这就是动态规划方法设计算法的主要思路。
设F k (y )为背包只装前k 种东西,总重限制为y 的情况下所具有的最大价值,即 )0()
0(max )(11b y y x
w n k x p y F i k i i i k
i i k ≤≤≤≤≤=∑∑==
这两个式子分别为背包问题子问题的目标函数和约束条件,不难看出是满足优化原则的。使用动态规划法求解,所得递推公式和边界条件是:
F k (y )=max (F k -1(y ),F (y -w k )+p k ),
F 0(y )=0,对一切 y ,0≤y ≤c , F k (y )=0,对一切 y ,0≤k ≤n , F 1(y )=[y/w 1]·p 1
用动态规划方法求解 0-1 背包问题的过程如下:①将问题分解为若干个子问题(一般每个子问题是相互关联和影响的 ),再依次研究逐个问题的决策,也就是把整个问题的最优解与子 问题的局部最优解用递推等式联系起来;②定义边界条件;③把边界条件代入递推公式,逐步求得最优解。
动态规划算法是一种经典的背包问题求解算法,其原理简单,算法思路清晰易于实现。动态规划算法虽然高效,但是对于规模较大的问题它并不是一个理想
的算法,最重要的原因就是它的维数障碍,即计算和存储量的需要对于状态空间和决策空间的维数的增长呈指数增长关系。这样惊人的增长速度是计算机难以承受的,这就使得直接的动态规划方法求解规划较大的背包问题发生了困难,且目前尚没有好的解决办法。
3 蚁群算法
蚁群算法由意大利学者 Dorigo 等人首先提出,是模仿真实的蚁群行为而提出的一种模拟进化算法。蚂蚁之间是通过一种称为信息 素(Pheromone )的物质传递信息的,蚂蚁能够在经过的路径上留下该种物质,而且能够感知这种物质的存在及其强度,并以此来指导自己的运动方向。因此,由大量蚂蚁组成的集体行为便表现出一种信息正反馈现象:某一条路径上走过的蚂蚁越多,该路径上留下的信息素就越多,则后来者选择该路径的概率就越大。蚂蚁之间就是通过这种信息素的交流,搜索到一条从蚁巢到食物源的最短路径。将这一问题的核心运用到背包问题中:在某一物品上聚集的信息素越多,则该物品被选择的概率就越大。就蚁群算法而言,当处理的数据比较小时,其具有很快的收敛速度 ,而随着数据规模的增大,算法的收敛速度明显降低。
假设有m 只蚂蚁,n +1个城市,第o 个城市代表背包,第1~n 个城市代表各个物品。把第o 个城市看成蚂蚁的寻优起点。令 n ij =p i / w i 表示蚂蚁从城市转移到城市的期望程度,这样价值越高同时重量越小的物品对蚂蚁的吸引就越大 。令 e ij 表示路径中留下的信息素强度。 任一只蚂蚁 k 由城市 i 转移到城市j 的概率可设为:
),2,1,0(1n j i n e n e p n j b ij
a ij
b ij a ij k ij ===
∑= 其中α表示路径上的信息量对蚂蚁选择路径所起的作用大小,β 为吸引度的重要性。每只蚂蚁从寻优起点出发只需一步就可到达 1~n 当中任意一个食物源,所以上式中有 (i =1,2,…,n )。寻优过程由多只蚂蚁进行,当每只蚂蚁以较大的概率选中食物源 j 时,如果有c -Σw i x i ≥0,则变量xj 将加1,否则给从i 到 j 的路径以罚值,以使后续的蚂蚁不再选择本路径。当所有节点都受罚以后将结束一次求解过程。然后记录最优解,更新信息素。 更新的公式可为
Δe ij =Q*w j *x j
e ij (t +1)=(1-ρ)*e ij (t )+Δe ij (i =0,j =1,2,…,n )
上式 中 ρ 为挥发系数,Q 为正常数,x j 为经过该路径的蚂蚁数量。
用蚁群算法求解 0-1 背包问题的过程如下:①初始化:即将任意两个城市之间的道路上的信息素赋一个初值;②搜索:让若干只蚂蚁根据信息素和距离选择城市;③每到一个新城市,进行信息素局部更新;④所有蚂蚁完成回路后,进行全局信息素更新;⑤记录最优路径,返回步骤②循环直到满足退出条件。