logo资料库

基于Matlab的0_1背包问题的动态规划方法求解.pdf

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
第 16 卷  第 4 期 2006 年 4 月            计 算 机 技 术 与 发 展 COMPU TER TECHNOLO GY AND DEV ELOPMEN T          Vol. 16  No. 4 Apr. 2006 基于 Matlab 的 0 - 1 背包问题的动态规划方法求解 王  乐 ,王世卿 ,张静乐 (郑州大学 信息工程学院 ,河南 郑州 450052) 摘  要 :背包问题是经典的 NP - hard 组合优化问题之一 ,在经济管理、资源分配、投资决策、装载设计等领域有着重要的应 用价值。文中用动态规划方法解决 0 - 1 背包问题 ,通过在 Matlab6. 5 环境下对其算法进行测试和与其他方法对比分析 ,表 明应用该方法可节省大量的计算时间 ,因而具有更高运行效率。 关键词 :0 - 1 背包问题 ;DP 算法 ;分治法 ;递归法 ;NP 难问题 ;Matlab 中图分类号 : TP301. 6        文献标识码 :A       文章编号 :1005 - 3751 (2006) 04 - 0088 - 02 DP Algorithm of Solving 0 - 1’s Knapsack Problem Based on Matlab WAN G Le , WAN G Shi qing , ZHAN G Jing le (College of Information Engineering ,Zhengzhou University ,Zhengzhou 450052 ,China) Abstract :The knapsack problem is a classic NP - hard problem in the combinational optimization. It is valuable in many fields such as re source assignment ,investment ,decision and loading design. This paper solved the 0 - 1 knapsack problem by DP algorithm ,and test the al gorithm in Matlab6. 5. The algorithm shows its superiority after comparing with other methods. Key words :0 - 1knapsack problem ;DP algorithm ;dividing - and - conquering ;recursive algorithm ; NP - hard problem ; Matlab 0  引  言 背包问题是一个典型的 NP - hard 问题 ,求解背包问 题有着广泛的应用前景 ,在学术上 ,可以解决 0 - 1 整数规 划问题或某类可归纳为 0 - 1 背包问题的子问题 ;在实际 应用中 ,对于解决资源分配 、投资决策 、预算控制 、项目选 择和货物装运等问题 ,其规划方法优劣将直接影响到运作 效率与成本 1 。因此 ,对该问题的研究倍受人们关注 。文 中在对多种不同的求解方法如贪婪算法 、回溯法 、分枝 - 界限法等进行分析研究的基础上 ,采用动态规划算法解决 此类问题 。通过在 Matlab6. 5 环境下对其算法进行测试 , 并与其他解决背包问题的方法进行分析对比 ,表明动态规 划方法以空间换时间 ,对一个问题或多次出现的相同问题 仅需解决一次 ,因此可节省大量的计算时间而具有更高运 行效率的优越性 。 1  问题描述 背包问题是一个典型的 NP 难问题 ,它的数学模型实 际上是一个 0 - 1 规划问题 。0 - 1 背包问题是指有不同 价值 、不同重量的物品 n 件 ,求从这 n 件物品中选取一部 分物品且对每一物品 ,要么选 ,要么不选 ,满足被选物品的 总重量不超过背包指定的限制重量且达到被选物品的价 收稿日期 :2005 - 07 - 09 作者简介 :王  乐 (1981 - ) ,女 ,河北安新人 ,硕士研究生 ,研究方向 为决策支持与企业信息化 ;王世卿 ,硕士研究生导师 ,研究方向为电 子商务 、数据挖掘 。 值总和最大的问题 。如果所有物品的重量之和小于背包的 容量 ,则问题极其简单 , 所得利益也就是所有物品的价值 之和 ,而实际问题往往是背包的容量小于物品的重量之 和[2 ] 。用形式化方法可对该问题描述为 : 设 W 为背包的容量 , n 个物品的重量组成一向量 ( w 1 , w 2 , …, w n) , 其价值组成另一向量 ( v1 , v2 , …, v n) , W > 0 , w i > 0 , vi > 0 (1 ≤ i ≤ n) 。要找出另一 n 元向 量 ( x 1 , x 2 , …, x n) , x i ∈{ 0 ,1} , 1 ≤i ≤ n ,1 表示选 ,0 表 示不选该物品 。 由此 ,0 - 1 背包问题要求 :Max ∑ vi x i , 且满足以下 n i = 1 n i = 1 w i x i ≤ W 两个约束条件 : (1) ∑ (2) x i ∈{ 0 ,1}   1 ≤ i ≤ n 也就是说对 0 - 1 背包问题 , 可以通过求出变量 x1 , x 2 , …, x n 的一个决策序列来得到它的解 ,而对变量 x i 的 决策就是决定它是取 0 值还是取 1 值 。 2  采用的动态规划方法 对解决复杂问题虽然不能简单地把它分解成几个子 问题 ,但可以分解出一系列的相关子问题 。因简单地采用 把大问题分解成子问题 ,并综合子问题的解导出大问题的 解的方法 ,问题求解耗时会按问题规模呈幂级数增加 。为 节约重复求相同子问题的时间 ,文中引入一个动态变化的 数组 ,不管每一次对子问题求得的解是否对最终解有用 ,
第 4 期           王  乐等 :基于 Matlab 的 0 - 1 背包问题的动态规划方法求解 ·98· 都把所有子问题的解存于该数组中 。对于重复出现的子 问题 ,只有在第一次遇到时才给预求解 ,并把其答案存放 在该数组中保存起来 ,以便再遇到时可直接引用而不必重 新求解 ,因而可解决所对应的子问题树中的子问题呈现大 量重复的问题 。 3  解决背包问题的 DP 算法 3. 1  求解过程描述 假定 W > 0 ,且两个正整数数组分别为 : ( v1 , v2 , …, v n) 和 ( w 1 , w 2 , …, w n) , 期 望 找 到 ∑ vi x i 最 大 且 n i = 1 n w i x i ≤ W 的子集为 T ∈{ 1 ,2 , …, n} 。采用上述动态 ∑ 规划思想 ,解决背包问题的求解过程可描述如下 : i = 1 步骤一 :将问题分解为小的子问题 。 构造一个二维数组 V [0 …n ,0 …W ] 1 ≤ i ≤ n 且 0 ≤ w ≤ W V [ i , w ] 用来存储权值至少为 w 且值最大的子集 T ∈{ 1 ,2 , …, n} 即 : V [ i , w ] = max{ ∑ vj : T ∈{ 1 ,2 , …, i} , ∑ w j j ∈T j ∈T ≤ w } 计算出所有满足条件的此二维数组的值 , 则 V [ n , W ] 就包含解决问题的解决方案 。 步骤二 :根据子问题的解递归定义最优解的值 。 设置初始状态集合 : V [0 , w ] = 0 当 0 ≤ w ≤ W , 没有任何项目时 V [ i , w ] = - ∞当 w < 0 ,   非法 递归步 : V [ i , w ] = max ( V [ i - 1 , w , vi + ( V [ i - 1 , w - w i ]) ,其中 1 ≤ i ≤ n ,0 ≤ w ≤ W [3 ] 。 式中 : V [ i - 1 , w ] 为上一轮中重量为 w 时所求得的 价值最大值; vi + ( V [ i - 1 , w - w i ] 表示 :选取 w i 时的价 值为 vi ,此时允许的最大的重量为 w , w - w i 是还剩下 的可承重量 。 V [ i , w ] 的取值为 V [ i - 1 , w ] 和 vi + ( V [ i - 1 , w - w i ] 中的较大值 。如果有 i 种物品可以选择 ,而此时所能 承受的最大重量为 w 时 ,只有两种选择 : ①不选新加入的第 i 种物品 。此时只有 i - 1 种物品 , 最大承受重量为 w 的最大价值为 V [ i - 1 , w ] 。 ②选择新加入的第 i 种物品 。第 i 种物品的重量为 w i 的价值为 vi , 现所能承受的最大重量为 w - w i ;而 i - 1 种物品还可以选择 , 此时的最大价值为 V [ i - 1 , w - w i ; 因此价值最大值为( vi + V [ i - 1 , w - w i ]) 。 步骤三 :自底向上进行计算 V [ i , w ] 。 底 : V [0 , w ] = 0  当 0 ≤ w ≤ W ; 自底向上计算 :使用公式 V [ i , w ] = max ( V [ i - 1 , w , vi + ( V [ i - 1 , w - w i ]) 。 3. 2  实现算法 KnapSack (v ,w ,n ,W) { for (w = 0 to W) V 0 ,w = 0 ; / / 将二维数组第一行赋值全零 for (i = 1 to n)  for (w = 0 to W)   if (wi ≤w)    V i ,w = max (V i - 1 ,w ,v i + (V i - 1 ,w - w i]) / / V i ,w 纪录权值至少为 w 且值最大的子集{1 ,2 , …,n}   else    V i ,w = V i - 1 ,w ; Return V i ,W ; } 另外再定义一数组 keep i , K 纪录所选择的物品 。当 第 i 个物品选中时 ,将其赋值为 1 ,否则为 0 。 K = W for (i = n downto 1)  If ( keep i , K = = 1 )   {    output i ;    K = K - w i   } 输出 i 的值即为所选择物品对应的编号 。 3. 3  测试结果 在 Matlab6. 5 4 环境下对该算法进行测试的过程和结 果如下 : > > v = 10 40 30 50 ;w = 5 4 6 3 ; n = 4 ;W = 10 ; > > V ,out = Kna pSack (v ,w ,n ,W) V =  0 0 0 0 10 10 10 10 10 10  0 0 0 40 40 40 40 40 50 50  0 0 0 0 0 40 40 40 50 70  0 0 50 50 50 50 50 50 90 90 out = 0 2 0 4 数组 out 输出的 i 值表示物品的编号 。结果表明选择 第二和第四种物品 ,所得到的最大价值为 90 。此算法的时 间复杂度为 O ( n W ) 5 。 4  与其他方法的比较与分析 一般来说 ,用来解决背包问题的方法主要有递归法和 贪心法等 ,但用这两种方法来解决背包问题都有其不可避 免的缺点 。递归法虽能遍历搜索空间 ,找到最优解 ,但由 于此问题的解的空间是以级增长的 ,所以它只适用于解决 小规模的背包问题 ;而贪心法又很难真正找到最优解 ,即 使能找出较优的解也往往与真正的最优解相差很远 。如 果采用自顶向下的分治法解决此问题 ,将会随着物品的增 多以级规模指数递增 ,因为分治法要重复计算相同的值 。 但采用动态规划算法 ,则可解决重复计算相同内容的问 题 ,以达到减少冗余的根本目的 。由于采用的动态规划实 质上是一种以空间换时间的技术方法 ,因 此 在 实 现 过 程 (下转第 92 页)
1 1 1 1 1 1 1 2 1 1 1 1 ·29·                     计算机技术与发展                   第 16 卷 度 ,从而实现了预期的球员之间的“默契”。 1) 持球队员决策 。 对于持球队员来说 ,首先考虑的是把球控制在自己的 范围内 ,如果球被对方球员截到 ,进攻就无从谈起 。在对 手离球较近(其威胁性也大) 的情况下 ,持球队员优先执行 各种控球的策略 ,对球进行彻底的控制 。而在对手离球较 远(其威胁性也小) 的情况下 ,持球队员才可以考虑如何组 织进攻 。组织进攻包括自己是否应该继续带球 、预测周边 的队友下一步的动作 (以便更好地传球) 及其传球的路线 选择等 。持球队员的决策在一个完整的进攻中处于核心 地位 (可以直接影响球的位置和速度) ,同时可以对无球队 员决策进行方向性的指导 。好的持球队员的决策决定了 进攻的成败 。持球队员是进攻的发起者 。 2) 无球队员决策 。 对于无球队员来说 ,无须考虑控球的问题 ,也暂时无 法影响球的位置和速度 。无球队员的决策是以对持球队 员行为的预测为核心 。无球队员根据预测出持球队员动 作 (带球或传球) 的情况 ,决定自己的行为 。无球队员的行 为主要是跑位 ,根据设定的有利进攻点来调整自身的方 向 。同时无球队员应做好对方可能会断球 、球被断后进行 快速抢球及其完成从无球队员到持球队员转换的准备 。 无球队员是进攻的响应者 。 如图 1 (a) 所示 ,持球队员首先预测了队友的动作(图 中虚线箭头所示) ,将球沿实线箭头传给队友 ;同时如图 1 (b) 所示 ,无球队员首先预测了队友的动作(传球) ,并预测 球的路线(图中虚线箭头所示) ,同时决定沿实线箭头跑 位 。比较同一情况下两名不同位置的球员的决策 ,可以发 现虽然预测和实际的动作有出入 ,但从总体上可以认为这 两个 agent 完成了配合 ,达到了想要的结果 (实现了非通 讯状态下的球员之间的合作 ,即球员之间产生了“默契”) 。 实验表明 ,这种以持球队员为核心的进攻策略简化了 agent 考虑的因素 ,提高了传球的目的性 ,加快了进攻的速 (上接第 89 页) 中 ,不得不存储实施过程中产生的各种状态 ,而造成空间 复杂度比其它算法要高 。 文中选择动态规划算法来解决背包问题 ,且认为它在 空间上是可以承受的 ,而采用搜索算法在时间上却是难以 承受的 。舍空间而取时间 ,这正是该算法在解决背包问题 上体现出的一种优越性 。 5  结束语 文中把动态规划方法用于求解背包问题 ,其算法是以 空间换时间来解决问题的一种有效的方法 。在解决实际 问题的过程中 ,面对复杂问题而分解出的子问题往往并不 是孤立的 ,要解决问题的子问题常常需要调用相同的子问 题的子问题 。如果它们之间也不是独立的 ,采用分治法势 必会在解决同样的问题上造成很大的时间浪费 。由于动 态规划方法对一个问题或多次出现的相同问题仅需解决 图 1  同一情况下球员的决策 4  结束语 从多 agent 系统研究入手 ,根据 RoboCup 的具体情 况 ,实现了非通讯状态下 agent 之间的配合 。在调整了考 虑的 agent 的数目后 ,我们的策略达到了预期的效果 。下 一步 ,考虑增加对对手的建模 ,提高传接球的质量 ,以期得 到更好的进攻成功率 。 参考文献 : 1  咸鹤群 ,孟庆春 ,殷  波 ,等. 多 Agent 系统中潜在角色值研 究J . 哈尔滨工业大学学报 ,2003 ,35 (9) :1089 - 1092. 2  祁正华 ,任勋益. 基于 MAS 的智能决策支持系统研究J . 微机发展 ,2004 ,14 (9) :14 - 16. 3  陈进才. 多 Agent 系统的形式化理论研究 D . 西安 : 西安 交通大学 ,2000. 4  Kok J R ,Spaan M T J ,Vlassis N. Non - communicative multi - robot coordination in dynamic environments J . Robotics and Autonomous Systems ,2005 ,50 :99 - 114. 5  张颖霞 ,杨宜民 ,陈  波 ,等. 多智能体团队合作在机器人 足球赛中的应用J . 微机发展 ,2004 ,14 (7) :112 - 114. 一次 ,因此可节省大量的计算时间而具有更高的运行效 率 。 参考文献 : 1  玄光男 ,程润伟 遗传算法与工程优化 M 北京 :清华大 学出版社 ,2004. 55 - 63 2  罗小虎 ,赵  雷 一个解决 0/ 1 背包问题的蚁群算法 J 苏州大学学报(工科版) ,2004 (2) :41 - 44 3  Supowit K. Finding a Maximum Planar Subset of a Set of Nets in a Channel J . IEEE Transations on Com puter - Aid ed Design of Integrated Circuits and systems ,1987 ,6 (1) :93 - 94. 4  阮沈勇 ,王永利 ,桑群芳 Matlab 程序设计 M 北京 :电子 工业出版社 ,2004. 5  施益昌 ,郑贤斌 ,李自立 基于 Matlab 动态规划中最短路 线的实现程序J 电脑学习 ,2003 (12) :38 - 40
分享到:
收藏