• 运筹说 第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博客

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

    作者 | 尹萌娟 陈梦

    责编 | 刘文志

    审核 | 徐小峰

  • 相关阅读:
    【leetcode】【周赛】第 307 场
    比Nginx更好用的Gateway!
    物联网基础建设-园区智能微电网设计方案
    宏记录器 Macro Recorder 2.0 注册版
    二十九.国民技术MCU开发之ADC应用案例 --可天士红外PSD测距获取
    UnrealSynth - 基于虚幻引擎的YOLO合成数据生成器
    百数新应用——生产制造信息化管理实用工具
    开源FFMpeg(四)——使用SDL进行音频播放下(使用篇)
    makefile之静态库的生成
    Java基础-反射(3)
  • 原文地址:https://blog.csdn.net/YUNCHOUSHUO/article/details/126317466