本期我们继续进行运筹学之动态规划算法的讲解,我们将对动态规划的基础知识进行一个简单的回顾,并介绍求解动态规划问题的MATLAB和Python相关代码,以帮助大家利用工具快速求解动态规划问题,做到事半功倍。由于篇幅有限,小编接下来只展示部分代码,小伙伴们可以关注“运筹说”公众号→后台回复“算法介绍之动态规划(二)”获取完整代码。话不多说,我们一起来看看吧!
★ 问题描述
一位旅行者携带背包去登山,已知他所能承受的背包重量限度为akg ,现有n 种物品可供他选择装入背包,第i 种物品的单件重量为aikg ,其价值(可以是表明本物品对登山的重要性的数量指标)是携带数量xi 的函数ci(xi) (i=1,2,⋯,n) ,问旅行者应如何选择携带各种物品的件数,以使总价值最大?
背包问题等同于车、船、人造卫星等工具的最优装载,有广泛的实用意义。
★ 背包问题分类
根据物品可用数量的不同,背包问题可有如下分类:
0-1背包问题:每种物品均只有一件可用;
完全背包问题:每种物品都有无限件可用;
多维背包问题:第i 种物品最多有ni 件可用。
★ 完全背包问题的整数规划模型
设xi 为第i 种物品装入的件数,则背包问题可归结为如下形式的整数规划模型:
★ 动态规划顺序解法建模
阶段k :将可装入物品按1,2,⋯,n 排序,每段装一种物品,共划分为n 个阶段,即k=1,2,⋯,n 。
状态变量sk+1 :在第k 段开始时,背包中允许装入前k 种物品的总重量。
决策变量xk :装入第k 种物品的件数。
状态转移方程:
允许决策集合为
其中[sk+1/ak]表示不超过sk+1/ak 的最大整数。
最优指标函数fk(sk+1) 表示在背包中允许装入物品的总重量不超过sk+1kg,采用最优策略只装前k 种物品时的最大使用价值。
则可得到动态规划的顺序递推方程为
用顺序解法逐步计算出f1(s2),f2(s3),⋯,fn(sn+1)及相应的决策函数x1(s2),x2(s3),⋯,xn(sn+1),最后得到的fn(a)即为所求的最大价值,相应的最优策略则由反推计算得出。
当xi仅表示装入(取1)和不装(取0)第i种物品,则模型就成了0-1背包问题。
★ 问题描述
企业中经常会遇到一台设备应该使用多少年更新最合算的问题。一般来说,一台设备在比较新时,年运转量大,经济收入高,故障少,维修费用少,但随着使用年限的增加,年运转量减少因而收入减少,故障变多维修费用增加。如果更新可提高年净收入,但是当年要支出一笔数额较大的购买费。设备更新问题的一般提法:在已知一台设备的效益函数r(t),维修费用函数u(t) 及更新费用函数c(t) 条件下,要求在n 年内的每年年初做出决策,是继续使用旧设备还是更换一台新的,使n 年总效益最大。
★ 动态规划建模
设rk(t) :在第k 年设备已使用过t 年(或称役龄为t 年),再使用1年时的效益。
uk(t) :在第k 年设备役龄为t 年,再使用一年的维修费用。
ck(t) :在第k 年卖掉一台役龄为t 年的设备,买进一台新设备的更新净费用。α 为折扣因子(0⩽α⩽1) ,表示一年以后的单位收人价值相当于现年的α 单位。下面建立动态规划模型。
阶段k :表示计划使用该设备的年限数,(k=1,2,⋯,n) 。
状态变量sk :第k 年初,设备已使用过的年数,即役龄。
决策变量xk :是第k 年初更新(replacement),还是保留使用(keep)旧设备,分别用R 与K 表示。
状态转移方程为
阶段指标为
指标函数为
最优指标函数fk(sk)表示第k 年初,拥有一台役龄为sk 年的设备,采用最优更新策略时到第n 年末的最大收益,则可得如下的逆序动态规划方程:
实际上,
(1)完全背包问题
①例题介绍
有一辆最大货运量为10t的卡车,用以装载4种货物,每种货物的单位重量及相应单位价值如下表所示。每种货物都有无限件,应如何装载可使总价值最大?
②平台实现
我们以上述例题为例,借助Python介绍实现求解完全背包问题的相关代码。
★ 代码展示
★ 代码调用
代码运行及最终结果展示如下,可以看到i=3有两次,i=4有两次,也就是第3种货物被选择了两次,第4种货物被选择了两次。可以装载的总价值为16t。
(2)0-1背包问题
★ 例题介绍
有一辆最大货运量为10t的卡车,用以装载4种货物,每种货物的单位重量及相应单位价值如下表所示。每种货物都只有1件,应如何装载可使总价值最大?
★ 平台实现
我们以上述例题为例,借助MATLAB和Python介绍实现求解0-1背包问题的相关代码。
①MATLAB
★ 代码展示
★ 代码调用
代码运行及最终结果展示如下,可以看到在每种货物只有一种可以装载的情况下,所装货物为第1个、第3个和第4个,可以装载的总价值为12t。
②Python
★ 代码展示
★ 代码调用
代码运行及最终结果展示如下,可以看到在每种货物只有一种可以装载的情况下,所装货物为第1个、第3个和第4个,可以装载的总价值为12t。
(1)例题介绍
设某台新设备的年效益及年均维修费、更新净费用如下表所示。试确定今后5年内的更新策略,使总收益最大(设α =1)。
(2)平台实现
我们以上述例题为例,借助MATLAB介绍实现求解设备更新问题的相关代码。
★ 代码展示
★ 代码调用
代码运行及最终结果展示如下,可得本例最优策略为:(1,0,0,0,1),即(K,R,R,R,K),也就是第1年初购买的设备到第2、3、4年年初各更新一次,用到第5年年末,其总效益为17万元。
【完全背包问题Python实现】
完全背包问题并记录选择物品和个数(python实现) - 灰信网(软件开发博客聚合)
【0-1背包问题Python实现】
动态规划之01背包问题及其优化(python实现)_ZzzMxin的博客-CSDN博客_01背包问题动态规划 python
【0-1背包问题MATLAB实现】
分组背包问题Matlab实现——之基本背包问题_Tsroad的博客-CSDN博客
本期的内容就介绍到这里,想要进一步了解运筹学,关注本公众号,快快学起来吧!
作者 | 尹萌娟 陈梦
责编 | 刘文志
审核 | 徐小峰