1、问题描述
有编号分别为 a,b,c,d,e 的五种金银物品,它们的重量分别是2,2,6,5,4,它们的价值分别为6,3,5,4,6,现有一个承重为10的背包,如何让背包带走金银物品的价值总和最大?
2、分析思路
符号说明
x(k): 表示在第k阶段的状态,状态就是第k阶段时的背包的重量
u(k): 表示在第k阶段的决策,决策取1表示将第k个物品放入背包,取0则相反。
v(x(k), u(k)): 表示在第k阶段的阶段指标,也就是决策的取到的第k个物品的价值
f(x(k)):表示总目标函数,即背包承重的范围内要能装走最大价值的金银财宝
过程分析
假设五种金银物品以a,b,c,d,e的顺序排放好,那我们可以以金银物品的顺序作为系统的阶段,即第一个物品(a)作为第一阶段、第二个物品(b)作为第二阶段、第三个物品(c)作为第三阶段段、… ,那么这个题就划分为了5个阶段了。那系统的状态x(k)为背包当前重量,则状态转移方程为 x(k+1) = x(k) + u(k),阶段指标为 v(x(k), u(k)) = x(k)。
总目标函数f(x(k))为从第k段的状态x(k)出发到过程终结的背包所装下的金银总价值最大,即
f(x(k)) = max(v(x(k), u(k)) + f(x(k+1)))
如果觉得分析不清楚可以参考此文章https://blog.youkuaiyun.com/mu399/article/details/7722810
代码步骤
了解以上分析后,接下来就是代码的实现。代码是根据上面分析来编写的,系统有五个阶段,每个阶段的决策用0、1表示。
代码第一步:用a矩阵的第一行存放1,2,3,4,5系统的阶段,第二行存放金银重量,第三行存放金银价值。
代码第二步:生成所有种情况的系统状态(下面只取前六行)
1 1 1 1 1
0 1 1 1 1
1 0 1 1 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 0
比如上面输出的数据矩阵种第一行第一列为1表示第一阶段的决策取值为1(也就是在这五个顺序排列好的物品,取了第一个物品放入背包中),第一行第二列为1表示第二阶段的决策取值为1(将第二个物品放入背包),后面的数字同上。第二行中的数字也如此,只不过表示的是不同的情况。因此也可以明显看出第一行表示所有物品都放入背包中,但已超过了背包的承重了,因此后面的代码还需要有背包承重的约束条件。
代码第三步:给背包承重填上约束条件,即只计算满足背包承重条件的各种情况,将值存放到f中
f = (a(3,:) * v(i,:)’)
代码第四步:算出背包所装下的总价值的情况并输出,最终结果背包所能装下价值最大为15。(详细见代码)