运筹说 第72期 | 算法介绍之动态规划(二)

本期我们继续进行运筹学之动态规划算法的讲解,我们将对动态规划的基础知识进行一个简单的回顾,并介绍求解动态规划问题的MATLABPython相关代码,以帮助大家利用工具快速求解动态规划问题,做到事半功倍。由于篇幅有限,小编接下来只展示部分代码,小伙伴们可以关注“运筹说”公众号→后台回复“算法介绍之动态规划(二)”获取完整代码。话不多说,我们一起来看看吧! 

一、基础知识

1、背包问题

        ★ 问题描述

        一位旅行者携带背包去登山,已知他所能承受的背包重量限度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背包问题。

2、设备更新问题

        ★ 问题描述

        企业中经常会遇到一台设备应该使用多少年更新最合算的问题。一般来说,一台设备在比较新时,年运转量大,经济收入高,故障少,维修费用少,但随着使用年限的增加,年运转量减少因而收入减少,故障变多维修费用增加。如果更新可提高年净收入,但是当年要支出一笔数额较大的购买费。设备更新问题的一般提法:在已知一台设备的效益函数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、背包问题

(1)完全背包问题

        ①例题介绍

        有一辆最大货运量为10t的卡车,用以装载4种货物,每种货物的单位重量及相应单位价值如下表所示。每种货物都有无限件,应如何装载可使总价值最大?

        ②平台实现

        我们以上述例题为例,借助Python介绍实现求解完全背包问题的相关代码。

        ★ 代码展示

        ★ 代码调用

        代码运行及最终结果展示如下,可以看到i=3有两次,i=4有两次,也就是第3种货物被选择了两次,第4种货物被选择了两次。可以装载的总价值为16t。

        (2)0-1背包问题

        ★ 例题介绍

有一辆最大货运量为10t的卡车,用以装载4种货物,每种货物的单位重量及相应单位价值如下表所示。每种货物都只有1件,应如何装载可使总价值最大?

 

        ★ 平台实现

        我们以上述例题为例,借助MATLABPython介绍实现求解0-1背包问题的相关代码。

        ①MATLAB

        ★ 代码展示 

        ★ 代码调用

        代码运行及最终结果展示如下,可以看到在每种货物只有一种可以装载的情况下,所装货物为第1个、第3个和第4个,可以装载的总价值为12t。

        ②Python

        ★ 代码展示 

        ★ 代码调用

        代码运行及最终结果展示如下,可以看到在每种货物只有一种可以装载的情况下,所装货物为第1个、第3个和第4个,可以装载的总价值为12t。

2、设备更新问题

        (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博客

本期的内容就介绍到这里,想要进一步了解运筹学,关注本公众号,快快学起来吧!

作者 | 尹萌娟 陈梦

责编 | 刘文志

审核 | 徐小峰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值