- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态规划求解0-1背包问题
基于MATLAB的0-1背包问题的动态规划求解
PAGE 1
数学实验论文
动态规划算法求解0-1背包问题
郭伦
指导教师名:
郭德龙
职 称:
副教授
单 位:
数学与统计学院
专 业 名 称:
B15信息与计算科学
动态规划算法求解0-1背包问题
摘 要
本文主要阐述了基于MATLAB的0-1背包问题动态规划的求解。
0-1背包问题(Knapsack Problem,简称KP问题)是一个经典的组合优化问题,具有广泛的实际应用背景,以及在理论研究领域也有其相当的代表性。KP问题的求解,在生活中多有应用,如货源分配、轮船装载、项目选择等等都有它的身影。并且它还常常作为其他相对复杂的组合问题的一个特殊解,但当问题规模过大时,如果想要得到最优解是极其困难的,因此对大规模的0-1背包问题的研究无论是在理论研究领域还是实际应用背景都有其重要的意义。
动态规划算法是五种常用的算法之一,通常用于求解具有某种最优性质的问题。其基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。由于我们可以用一个表来记录所有已解子问题的答案,需要用到的时候直接调用,所以动态规划法又叫“填表法”。
关键词:KP问题,0-1背包问题,动态规划,最优解,背包问题,MATLAB,基于MATLAB的0-1背包问题动态规划的求解
一.问题重述
给定一个容量为C的背包和n个物品,其中物品i的体积为v[i],价值为w[i](i=1,2,3,…n),要从这n个物品中挑选出若干件放入背包,每个物品只能挑选一次,使得放入物品的总体积不超过C,而价值达到最大,并找出一种添放物品的方案。
二.模型假设
0-1背包问题的为:设xi为一个二进制量,xi=1表示将物品i放入背包,xi=0表示物品不装入背包,问题的目的在于确定一个二进制的数组(
maxi=1nxiw
三.符号说明
C:背包的容量
V:物品的体积
W:物品的价值
n:物品的数量
f:用于状态交换的矩阵
t:用于输入物品是否装入背包,0表示装入,1表示不装入
四.问题分析
对于0-1背包问题,每个物品都只有两种选择,装入或者不装入两种,可以用一个二维数组f[i][j]表示物品是否装入背包。我们要做的是找出可以放入背包的物品使得背包内的价值最大,利用递归思想,用子问题定义状态:即f[i][j]表示前i件物品恰放入一个容量为j的背包可以获得的最大价值。则其状态转移方程便是:
f[i][j]=max{f[i-1][j],f[i-1][j-v[i]]+w[i]}
对于第i个物品,我们可以拿这个物品的体积同背包内剩余的体积相比较,如果背包内剩余的容量大于物品的体积,那么这个物品就可以装入背包,这时我们只要判断装入这个物品后和装入这个物品前的价值哪一个更大,就可以通过这种递归的方式球的背包能装入的最大价值。
五.模型建立与求解
我们知道,动态规划算法又叫填表法,填表的顺序为自底向上,自左向右,于是我们首先确定第n个物品是否可以被装入背包:
if v(n)=j
f(n,j)=w(n) ;
else
f(n,j)=0;
在通过递归公式
f[i][j]=max{f[i+1][j],f[i+1][j-v[i]]+w[i]}
逐个求解出接下来的解,最后将这些局部最优解填入表格中:
由表格中的数据我们不难发现能够装入背包的最大价值,那么,接下来我们根据这个表求解出这个最大价值是由哪集中物品装入而得到的:
%3、找出装入背包的所有物品
j=c;
for i=1:n-1
if f(i,j)==f(i+1,j)
t(i)=0;
else
t(i)=1;
j=j-v(i);
end
end
if f(n,j)==0
t(n)=0;
else
t(n)=1;
end
t
于
原创力文档


文档评论(0)