数模动态规划小案例之matlab程序实现——背包问题

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.csdn.net/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。(详细见代码)

3、matlab实现


clear,clc
a = [1 2 3 4 5;     % 第一行是金银类型,用来表示系统的状态
     2 2 6 5 4;     % 第二行是金银重量
     6 3 5 4 6];    % 第三行是金银价值

b = perms(a(1, :));
v = [];
for i = 1:size(a,2)-1
    c = b;
    id1 = find(c <= i);
    id2 = find(c >  i);
    c(id1) = 0;
    c(id2) = 1;
    c = unique(c,'rows');
    v = [v; c];    				%01变量表示第k状态的决策
end
v = [ones(1,5); v; zeros(1,5)]; % 所有阶段的所有状态都存放在v中
 
F = [];
for i = 1:size(v,1)
    if (a(2,:) * v(i,:)') <= 10 % 约束条件(背包的承重范围内)
        f = (a(3,:) * v(i,:)'); % 阶段指标
        F = [F, f];             % 指标函数
    end
end
best_value = max(F)             % 指标函数最优值

4、程序结果


best_value = 15
			
  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值