背包问题的动态规划算法
- 格式:docx
- 大小:27.24 KB
- 文档页数:4
背包问题的动态规划算法
尘本是心
摘要:背包问题(Knapsack problem)是一种组合优化的NP完全问题,本文具体实现背包问题的动态规划算法,并用实例探讨其平均运算时间(基本运算次数)。
关键词:背包问题,动态规划算法,优化。
Dynamic Programming Algorithm of Knapsack Problem
Chen Benshixin
Abstract: Knapsack problem is an NP-complete problem and in this paper we solve it by dynamic programming algorithm, and we use a specific example to discuss the average computing time (number of basic operations).
Keywords: Knapsack Problem, Dynamic Programming ,Optimization.
0问题描述
背包问题具体描述如下:有容量为c的背包,n个物品,价值分别为pi,体积分别为wi,求背包所能装的物品的最大价值。
1算法描述
作为自然的假设,所涉及变量应该为正数。
pi应该为有理数。
c、wi虽然可能为无理数,但是在实际问题中,其值总是通过测量得到的,从而为有理数。
因此作为假设,可认为pi、c、wi都是正有理数,进一步,通过乘以公分母,可认为所有变量(c、n、pi、wi)都是正整数。
程序中不检查变量合法性,而认为这一要求是满足的。
以xi=0表示物品i不放入背包,xi=1表示物品i放入背包,xi=-1表示前两种情况都可以。
求解过程分为n步,第k步决定xk为0还是1。
以uk表示第k步初背包的剩余容量,fm(u)表示剩余容量为u,剩余物品编号为m到n时的最大价值。
则该问题符合动态规划的要求。
并且有显然的条件
1.u1=c
2.m=n+1时,fm(u)恒为0
3.u<=0时,fm(u)为0
状态转移方程为u(k+1)=uk-xk*wk。
动态规划基本方程为:wm>u时,fm(u)=f(m+1)(u),否则fm(u)为f(m+1)(u与f(m+1)(u-wm)+pm中的较大者。
定义(n+1)*c矩阵f,其m行u列处为fm(u);(n+1)*c矩阵x,其m行u列处为剩余容量为u,剩余物品编号为m到n时xm的取值。
2算法实现
3结果分析
本例输出为
t = 1.1769e-004
cishu =225
max =18
y =1 1 1 1 0 0
t表示运算时间,cishu表示比较、赋值操作的次数,max表示最大价值,y的i分量表示i物品的取舍,0表示不放入背包,1表示放入背包,-1表示都可以。
(输出的y只给出了一种可能的结果。
改变给y赋值的那个循环中指标i的变化方式,可以得到其他可能的结果)
复杂度分析:算法的实现部分在于二重for循环。
共有n*c次循环,最坏情形下,每次循环需要2次比较,2次赋值,7次加减(由于既有指标加1,又有矩阵系数的加法,所以以上程序没有统计加减次数),所以总运算次数不超过11*n*c,即其复杂度为O(n*c)。
参考文献
[1]王乐, 王世卿, 张静乐. 基于Matlab 的0—1 背包问题的动态规划方法求解[J]. 计算机技术与发展,
2006, 16(4): 88-89.
[2]郭晓晖. 遗传算法在求解背包问题中的应用[J]. 大连铁道学院学报, 2001, 22(3): 32-35.
[3]黄波, 蔡之华. 0/1 背包问题及其解法研究[J]. 电脑知识与技术: 学术交流, 2007 (4): 229-231.
[4]Martello S, Toth P. Knapsack problems[M]. New York: Wiley, 1990.
[5]Toth P. Dynamic programming algorithms for the zero-one knapsack problem[J]. Computing, 1980, 25(1): 29-45.。