运筹学-动态规划实例

Posted 书槑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运筹学-动态规划实例相关的知识,希望对你有一定的参考价值。

动态规划是解决多阶段决策问题最优化的一种方法,目标是达到整个过程的整体最优。一种解法是从最后一阶段开始,用逆序递推方法求解。

三个小例子

分配医疗队

世界卫生组织要求将五支医疗队分配到三个国家,分配的医疗队的数目对各国家的效益如表11.1所示。(注:效益指延长该国家人的寿命)

设:
s i s_i si为状态变量,即能够分配给第i个国家(以及剩下的国家)的医疗队数目
x i x_i xi为决策变量,即实际分配给第i个国家的医疗队数目
x i ⋆ x_i^\\star xi为最优的xi
f n ( s n , x n ⋆ ) f_n(s_n,x_n^\\star) fn(sn,xn)为最优指标函数,即第n个阶段的最大效益
f i ⋆ ( s i ) = f n ( s n , x n ⋆ ) f_i^\\star(s_i) = f_n(s_n,x_n^\\star) fi(si)=fn(sn,xn)
因此

我们从最后一个阶段(即第三个国家)开始,用列表法求解

接着是上一个阶段(即第二个国家)
s 2 = 2 s_2=2 s2=2为例解释一下这张表
s 2 = 2 s_2=2 s2=2表示还剩两支医疗队能分配给第二、三个国家,因此能给第二个国家分配的医疗队数目为0,1,2.分配效益即为第二个国家和第三个国家的效益之和。 f 2 ⋆ ( s 2 ) f_2^\\star(s_2) f2(s2)取每行中的最大值, x i ⋆ x_i^\\star xi为相应的 x 2 x_2 x2的取值。

最后是第一阶段(即第一个国家)
同理可以求出第一阶段最优的决策变量

可以看出,最优的决策方案是给第一个国家分配1支医疗队,这时 s 2 = 4 s_2=4 s2=4,则应该给第二个国家分配3支医疗队,因此最后给第三个国家分配1支医疗队

雇佣工人

某工厂在一年四季对工人的需求量不同,下表中展示了每季对工人的最低需求,若实际雇佣人数多于最低需求则要为多雇的工人支付2000美元工资。换季时每次雇佣或解雇工人均需支付(200*变动人数 2 ^2 2)元的手续费。

这个问题可以看作是四阶段的动态规划问题。
决策变量 x n x_n xn表示该阶段需要雇佣的人数
状态变量 s n s_n sn表示上一阶段的雇佣人数,即 s n = x n − 1 s_n = x_n-1 sn=xn1
r n r_n rn表示每季对工人的最低需求
生产从春季开始,因此春季雇佣的人数是确定的255人,即 x 4 ⋆ = 255 x_4^\\star=255 x4=255,而由于由于这四个季节是一个循环,且最后一阶段的最优值必须是已知的或者不依赖于其他阶段,因此我们将春季作为最后一个阶段。可以列出春季的决策表:

其中的 s 4 s_4 s4为冬季的雇佣人数,需满足最低需求且没必要大于各季最低需求的上界。

接着可以列出上一个阶段(冬季)的决策表

其中

s 3 s_3 s3可以看作已知,因此可以求出 x 3 x_3 x3最优值的表达式

解得

带入 f 3 ⋆ ( s 3 ) f^\\star_3(s_3) f3(s3)中即可
注意,因为 x 3 ⋆ x_3^\\star x3即为 s 4 s_4 s4,因此需要检查一下 x 3 ⋆ x_3^\\star x3的范围,此处是符合要求的

进入上一个阶段(秋季)

同理,先写出 f 2 ⋆ ( s 2 ) f^\\star_2(s_2) f2(s2)的表达式


s 2 s_2 s2看作已知,求出 x 2 x_2 x2最优值的表达式

注意,此处 s 2 s_2 s2的范围是[220,255],但 x 2 x_2 x2的范围应当是[240,255],对应 s 2 s_2 s2的范围是[240,255],因此对 s 2 s_2 s2分段,分别求出 x 2 x_2 x2最优值的表达式. 当 s 2 s_2 s2的范围是[220,240]时,
因此 x 2 = 240 x_2=240 x2=240 时函数取最小值

最后是第一阶段(夏季)的决策表

其中 s 1 = 255 s_1=255 s1=255是已知的春季雇佣人数
因为 x 1 = s 2 x_1=s_2 x1=s2是分段的,所以

对每一段分别求出最小值,并进行比较
220 ≤ x 1 ≤ 240 220\\le x_1\\le 240 220x1240,

因此

x 1 = 240 x_1=240 x1=240 时取最小值

240 ≤ x 1 ≤ 255 240\\le x_1\\le 255 240x1255,

解得 x 1 = 247.5 x_1=247.5 x1=247.5

将两个 x 1 x_1 x1值分别带入比较,发现 x 1 = 247.5 x_1=247.5 x1=247.5 f 1 ( s 1 ) f_1(s_1) f1(s1)的值更小,是185,000

因此这个问题就解决了: x

以上是关于运筹学-动态规划实例的主要内容,如果未能解决你的问题,请参考以下文章

动态规划的Matlab实现和实例分析

基础算法——动态规划0/1背包问题

运筹学中的经典动态规划

R语言-运筹学非线性规划实例

R语言-运筹学非线性规划实例

R语言-运筹学非线性规划实例