
通过前几期的学习,我们已经学会了动态规划的基本概念和基本原理,并且掌握了动态规划模型的建立和具体的求解方法,本期小编带大家学习动态规划在经济管理中的应用。
除了前面讲到的最优路径、资源分配问题外,动态规划在经济管理中还有许多应用,小编选择了其中一些典型例子,包括背包问题、生产经营问题和设备更新问题,进行详细讲解。

接下来我们先从经典的背包问题开始讲起。
背包问题又称装载问题,一般提法是:一位旅行者携带背包去登山,已知他所能承受的背包重量限度为akg,现有n种物品可供他选择装入背包,第i种物品的单件重量为aikg,其价值(可以是表明本物品对登山的重要性的数量指标)是携带数量xi的函数ci(xi)(i=1,2,…,n),问旅行者应如何选择携带各种物品的件数,以使总价值最大?
背包问题等同于车、船、人造卫星等工具的最优装载,有广泛的实用意义。
设xi为第i种物品装入的件数,则背包问题可归结为如下形式的整数规划模型:

下面用动态规划顺序解法来进行建模求解。
阶段k:将可装入物品按1,2,…,n排序,每段装一种物品,共划分为n个阶段,即k=1,2,…,n。
状态变量sk+1:在第k段开始时,背包中允许装入前k种物品的总重量。
决策变量xk:装入第k种物品的件数。
状态转移方程:sk=sk+1-akxk
允许决策集合:

其中[sk+1/ak]表示不超过sk+1/ak的最大整数。
最优指标函数fk(sk+1)表示在背包中允许装入物品的总重量不超过sk+1kg,采用最优策略只装前k种物品时的最大使用价值。
则可得到动态规划的顺序递推方程为

用顺序解法逐步计算出f1(s2),f2(s3),…,fk(sk+1)及相应的决策函数x1(s2),x2(s3),…,xn(sn+1),最后得到的fn(a)即为所求的最大价值,相应的最优策略则由反推计算得出。
有一辆最大货运量为10t的卡车,用以装载3种货物,每种货物的单位重量及相应单位价值如下表所示。应如何装载可使总价值最大?

解:设第i种货物装载的件数为xi(i=1,2,3),则问题可表示为:

可按前述方式建立动态规划模型,由于决策变量取离散值,所以可以用列表法求解。
当k=1时,

计算结果如下表所示。

当k=2时,

计算结果见下表。

当k=3时,

此时有x3*=0,逆推可得全部策略为:

最大价值为13。
生产经营问题又可以分为两类:生产与储存问题、采购与销售问题,下面我们通过两道例题来学习一下。
某工厂生产并销售某种产品,已知今后四个月市场需求预测如下表所示,又每月生产j单位产品费用为

每月库存j单位产品的费用为E(j)=0.5j(千元),该厂最大库存容量为3单位,每月最大生产能力为6单位,计划开始和计划期末库存量都是零。试制订四个月的生产计划,在满足用户需求条件下总费用最小。假设第i+1个月的库存量是第i个月可销售量与该月用户需求量之差;而第i个月的可销售量是本月初库存量与产量之和。

用动态规划法求解时,对有关概念做如下分析:
(1)阶段:每个月为一个阶段,k=1,2,3,4。
(2)状态变量:sk为第k个月初的库存量。
(3)决策变量:uk为第k个月的生产量。
(4)状态转移方程:sk+1=sk+uk-gk
(5)最优指标函数:fk(sk)表示第k月状态为sk时,采取最佳策略生产,从本月到计划结束(第4月末)的生产与存储最低费用。
考虑k=4,因为要求四月底库存为零,本月需求为4,所以本月产量应为u4=4-s4,由于库存量最大为3,所以s4取值只能是0,1,2,3。

可以列出f4(s4)和u4(s4),见表1。

当k=3时,先分析状态变量s3的取值范围,它与库存能力、生产能力、需求量均有关,在此由最大库存量决定s3={0,1,2,3}。再分析决策变量u3的允许决策集合,为满足本月需求,产量u3至少为g3-s3=2-s3,若库存量s3>2,则u3应取0。为保证期末库存量为零,u3不能超过g3+g4-s3=6-s3,另外u3还受最大库存量3的限制,即不能超过g3+3-s3=5-s3,同时还受最大生产能力6的限制,总之有

我们对s3=0,1,2,3分别求出f3(s3)的值,当s3=0时,

这就是说,若第三个月初库存为零,则三、四两个月最低费用为12(千元),第三个月最优产量为2个单位。依此类推,可得表2。

当k=2时,有

其中状态变量s2={0,1,2,3}。
决策变量u2为

本段计算结果如表3所示。

当k=1时,有

由于状态s1=0,本月产量u1同样要受本月需求量、最大库存容量、最大生产能力等约束限制,应为2⩽u1⩽5的整数,则

计算结果见表4。

由上表可知,总最低费用为f1(0)=21(千元),第一个月最佳产量为2单位。而需求g1=2,所以第二个月初库存量为零,再由表3中查s2=0列可得第二个月最佳产量为5单位,同理通过查表2、表1可得第三、第四月的最佳产量。
即最佳生产计划为:第一个月生产2单位,第二个月生产5单位,第三个月不生产,第四个月生产4单位。
总结上述解题过程,可得此类生产存储问题的基本方程为

若最大库存量为q,每月最大生产能力为p,则状态集合为

允许决策集合为

某商店在未来的4个月里,准备利用它的一个仓库来专门经销某种商品,仓库最大容量能储存这种商品1000单位。假定该商店每月只能卖仓库现有的货。当商店在某月购货时,下月初才能到货。预测该商品未来四个月的买卖价格如下表所示,假定商店在1月开始经销时,仓库储有该商品500单位。试问若不计库存费用,该商店应如何制订1月至4月的订购与销售计划,使预期获利最大。

解:按月份划分为4个阶段,k=1,2,3,4
状态变量sk:第k月初时仓库中的存货量(含上月订货)。
决策变量xk:第k月卖出的货物数量。
决策变量yk:第k月订购的货物数量。
状态转移方程:sk+1=sk+yk-xk
最优指标函数fk(sk):第k月初存货量为sk时,从第k月到4月末所获最大利润。则有逆序递推关系式为

当k=4时

显然,决策应取

才有最大值f4(s4)=17s4
当k=3时

这个阶段需求解一个线性规划问题:

当满足

有最大值f3(s3)=6000+13s3
当k=2时

则求解线性规划问题:

得到

当k=1时

解线性规划问题:

得决策

最优策略如下表所示。最大利润为16000。

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

阶段指标为

指标函数为

最优指标函数fk(sk))表示第k年年初,拥有一台役龄为sk年的设备,采用最优更新策略时到第n年年末的最大收益,则可得如下的逆序动态规划方程:

实际上

设某台新设备的年效益及年均维修费、更新净费用如下表所示。试确定今后5年内的更新策略,使总收益最大(设α=1)。

如前所述建立动态规划模型,n=5。当k=5时,

状态变量s5可取1,2,3,4。

当k=4时,

这时状态变量s4可取1,2,3。

当k=3时,

此时s3可取1或2。

当k=2时,

由于s2只能取1,所以

当k=1时,

由于s1只能取0,所以

上述计算递推回去,当x1*(0)=K时,由状态转移方程

可知s2=1,查f2(1)得x2*=R时,则

推出s3=1,查f3(1)得:x3*=R
推出s4=1,查f4(1)得:x4*=R
状态s5=1,查f5(1)得:x5*=K
可得本例最优策略为:{K,R,R,R,K},即第一年年初购买的设备到第二、第三、第四年年初各更新一次,用到第5年年末,其总效益为17万元。
以上就是本期动态规划例题讲解的全部内容啦,通过对这一期的学习,相信大家一定能够加深对动态规划的理解,进而在生活实践中学会应用!
作者 | 裴传涛 陈志昂 林鑫
责编 | 刘文志
审核 | 徐小峰

无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟
我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
如何在对象上调用方法名称的嵌套哈希?例如,给定以下哈希:hash={:a=>{:b=>{:c=>:d}}}我想创建一个方法,给定上面的散列,执行以下操作:object.send(:a).send(:b).send(:c).send(:d)我的想法是我需要从一个未知的关联中获取一个特定的属性(这个方法不知道,但程序员知道)。我希望能够指定一个方法链来以嵌套哈希的形式检索该属性。例如:hash={:manufacturer=>{:addresses=>{:first=>:postal_code}}}car.execute_method_hash(hash)=>90210
我有一个ruby程序,我想接受用户创建的方法,并使用该名称创建一个新方法。我试过这个:defmethod_missing(meth,*args,&block)name=meth.to_sclass我收到以下错误:`define_method':interningemptystring(ArgumentError)in'method_missing'有什么想法吗?谢谢。编辑:我以不同的方式让它工作,但我仍然很好奇如何以这种方式做到这一点。这是我的代码:defmethod_missing(meth,*args,&block)Adder.class_evaldodefine_method