【管理运筹学】第 8 章 | 动态规划(3,资源分配问题)

系列文章

【管理运筹学】第 8 章 | 动态规划(1,多阶段决策过程与动态规划基本概念)
【管理运筹学】第 8 章 | 动态规划(2,动态规划的基本思想与模型求解)
【管理运筹学】第 8 章 | 动态规划(3,资源分配问题)
【管理运筹学】第 8 章 | 动态规划(4,生产与储存问题)
【管理运筹学】第 8 章 | 动态规划(5,设备更新问题)


引言

承接系列前文,有了对动态规划的基本认识,我们接下来就来对资源分配问题进行动态规划具体建模分析。


三、资源分配问题

所谓资源分配问题,就是将数量一定的一种或若干资源(例如原材料、资金、机器设备、劳力、食品等),恰当地分配给若干个使用者,使得目标函数达到最优。

3.1 一维离散资源分配问题

设有某种原料,总数量为 a a a ,用于生产 n n n 种产品。若分配数量 x i x_i xi 用于生产第 i i i 种产品,其收益为 g i ( x i ) g_i(x_i) gi(xi) 。问应如何分配,能使得生产这 n n n 种产品的总收入最大?

易得此问题可以写成如下规划问题: max ⁡ z = g 1 ( x 1 ) + g 2 ( x 2 ) + ⋯ + g n ( x n ) \max z=g_1(x_1)+g_2(x_2)+\cdots+g_n(x_n) maxz=g1(x1)+g2(x2)++gn(xn) s . t . { x 1 + x 2 + ⋯ + x n = a x i ≥ 0 , i = 1 , 2 , ⋯   , n s.t.\begin{cases} x_1+x_2+\cdots+x_n=a \\ x_i \geq 0,i=1,2,\cdots,n \end{cases} s.t.{x1+x2++xn=axi0i=1,2,,n 当收益函数 g i ( x i ) g_i(x_i) gi(xi) 均为线性函数时,该问题是一个线性规划问题,可以利用单纯形法进行求解;当收益函数为非线性函数时,问题变为一个非线性规划问题,我们并没有要求掌握其解法。

由于这类问题的特殊结构,可以将它看作是一个多阶段决策问题,利用我们刚学习的动态规划方法进行求解。对于此类资源分配问题,通常以把资源分配给一个或几个使用者的过程作为一个阶段,将问题中的 x i x_i xi 作为决策变量,将累计的量或随递推过程变化的量选为状态变量。

此题中,可设状态变量 s k s_k sk 表示分配用于生产第 k k k 种至第 n n n 种产品的原料总数量(也即此时剩余的总可用资源数量),决策变量 u k u_k uk 表示分配给生产第 k k k 种产品的原料数,有 u k = x k u_k=x_k uk=xk 。则可得到状态转移方程为: s k + 1 = s k − u k = s k − x k s_{k+1}=s_k-u_k=s_k-x_k sk+1=skuk=skxk ,允许决策集合: D k ( s k ) = { u k ∣ 0 ≤ u k = x k ≤ s k } D_k(s_k)=\{u_k|0\leq u_k=x_k \leq s_k\} Dk(sk)={uk∣0uk=xksk} 令最优值函数 f k ( s k ) f_k(s_k) fk(sk) 表示以数量 s k s_k sk 的原料分配给第 k k k 种产品至第 n n n 种产品所得到的最大总收入,可写出动态规划的逆推关系式为: { f k ( s k ) = max ⁡ { g k ( s k ) + f k + 1 ( s k − x k ) } , k = n − 1 , ⋯   , 2 , 1 f n ( s n ) = m a x { g n ( s n ) } f n + 1 ( s n + 1 ) = 0 ,边界条件 \begin{cases} f_k(s_k)=\max\{g_k(s_k)+f_{k+1}(s_k-x_k)\},k=n-1,\cdots,2,1 \\ f_n(s_n)=max\{g_n(s_n)\} \\ f_{n+1}(s_{n+1})=0,边界条件 \end{cases} fk(sk)=max{gk(sk)+fk+1(skxk)}k=n1,,2,1fn(sn)=max{gn(sn)}fn+1(sn+1)=0,边界条件 最后求得的 f 1 ( a ) f_1(a) f1(a) 即为问题所求的最大总收入,具体最优生产计划可以按照 x 1 ∗ x_1^* x1 进行推算,第一阶段采用 x 1 ∗ x_1* x1 ,则第二阶段 s 2 = s 1 − x 1 ∗ s_2=s_1-x_1^* s2=s1x1 ,可找出 s 2 ∗ s_2^* s2 ,依次类推。

利用动态规划解法还有一个好处就是,当资源数量减少后,不用重新计算,只需修改最后一个阶段的分配情况即可。

这种指将资源合理分配,而不进行回收的问题,又被称为资源平行分配问题

3.2 一维连续资源分配问题

在资源分配中考虑资源回收利用,决策变量为连续值的问题称为资源连续分配问题,其一般叙述如下:

设有数量为 s 1 s_1 s1 的某种资源,可投入 A , B A,B A,B 两种生产。第 1 年若以数量 u 1 u_1 u1 投入生产 A A A ,剩下的量 s 1 − u 1 s_1-u_1 s1u1 就投入生产 B B B ,则可得收入为 g ( u 1 ) + h ( s 1 − u 1 ) g(u_1)+h(s_1-u_1) g(u1)+h(s1u1) ,其中 g , h g,h g,h 为已知收益函数,且 g ( 0 ) = h ( 0 ) = 0 g(0)=h(0)=0 g(0)=h(0)=0 。这种资源在投入 A , B A,B A,B 生产后,年终还可回收再投入生产。

设年回收率分别为 a , b ( a , b ∈ ( 0 , 1 ) ) a,b(a,b\in(0,1)) a,b(a,b(0,1)) ,则在第 1 年生产后,回收的资源量合计为 s 2 = a u 1 + b ( s 1 − u 1 ) s_2=au_1+b(s_1-u_1) s2=au1+b(s1u1) 。第二年可将 s 2 s_2 s2 中的 u 2 u_2 u2 s 2 − u 2 s_2-u_2 s2u2 分别再投入 A , B A,B A,B 两种生产,年末又可以得到收入 g ( u 2 ) + h ( s 2 − u 2 ) g(u_2)+h(s_2-u_2) g(u2)+h(s2u2) 。如此继续进行 n n n 年,问:应该如何决定每年投入 A A A 生产的资源量 u 1 , u 2 , ⋯   , u n u_1,u_2,\cdots,u_n u1,u2,,un ,使得总的收入最大?

类比离散资源分配问题的处理手法进行处理,记 s k s_k sk 为状态变量,表示第 k k k 阶段(第 k k k 年)可用于投入两种生产的资源总量。 u k u_k uk 为决策变量,表示第 k k k 阶段(第 k k k 年)用于 A A A 生产的资源量,则 s k − u k s_k-u_k skuk 表示用于 B B B 生产的资源量。状态转移方程为: s k + 1 = a u k + b ( s k − u k ) s_{k+1}=au_k+b(s_k-u_k) sk+1=auk+b(skuk) 最优值函数 f k ( s k ) f_k(s_k) fk(sk) 表示第 k k k 阶段至第 n n n 阶段采取最优分配方案进行生产后所得到的最大总收入。则逆推关系式为: { f k ( s k ) = max ⁡ { g ( u k ) + h ( s k − u k ) + f k + 1 ( s k + 1 ) } , k = n , n − 1 , ⋯   , 2 , 1 f n + 1 ( s n + 1 ) = 0 ,边界条件 \begin{cases} f_k(s_k)=\max\{g(u_k)+h(s_k-u_k)+f_{k+1}(s_{k+1})\},k=n,n-1,\cdots,2,1 \\ f_{n+1}(s_{n+1})=0,边界条件 \end{cases} {fk(sk)=max{g(uk)+h(skuk)+fk+1(sk+1)}k=n,n1,,2,1fn+1(sn+1)=0,边界条件 最后所求 f 1 ( s 1 ) f_1(s_1) f1(s1) 即为所求问题最大总收入。

3.3 二维资源分配问题

看了下书,没有算例,难度应该不小,很可能考试是不涉及的,我就先留着吧。


写在最后

如果能从实际问题中,找到适合建立动态规划模型的状态量、转移方程和指标函数,那么,按照我们前面的动态规划模型求解办法,是可以按部就班顺利解决的。

对于连续和离散两种类型的资源分配问题,它们的建模思想很类似,但是要注意一些细节。下一篇文章,我们来说一说生产与储存问题。

实验课程:算法分析与设计 实验名称:用动态规划法求解资源分配问题 (验证实验) 实验目标: (1)掌握用动态规划方法求解实际问题的基本思路。 (2)进一步理解动态规划方法的实质,巩固设计动态规划算法的基本步骤。 实验任务: (1)设计动态规划算法求解资源分配问题,给出算法的非形式描述。 (2) 在Windows环境下用C 语言实现该算法。计算10个实例,每个实例中n=30, m=10, Ci j为随机产生于范围(0,103)内的整数。记录各实例的数据及执行结果(即最优分配方案、最优分配方案的值)、运行时间。 (3)从理论上分析算法的时间和空间复杂度,并由此解释相应的实验结果。 实验设备及环境: PC;C/C++等编程语言。 实验主要步骤: (1) 根据实验目标,明确实验的具体任务; (2) 分析资源分配问题,获得计算其最优值的递推计算公式; (3) 设计求解问题的动态规划算法,并编写程序实现算法; (4) 设计实验数据并运行程序、记录运行的结果; (5) 分析算法的时间和空间复杂度,并由此解释释相应的实验结果; 问题分析: 问题描述: 某厂根据计划安排,拟将n台相同的设备分配给m个车间,各车间获得这种设备后,可以为国家提供盈利Ci j(i台设备提供给j号车间将得到的利润,1≤i≤n,1≤j≤m) 。问如何分配,才使国家得到最大的盈利? 算法基本思想: 本问题是一简单资源分配问题,由于具有明显的最优子结构,故可以使用动态规划求解,用状态量f[i][j]表示用i台设备分配给前j个车间的最大获利,那么显然有f[i][j] = max{ f[k][j–1] + c[i-k][j] },0<=k<=i。再用p[i][j]表示获得最优解时第j号车间使用的设备数为i-p[i][j],于是从结果倒推往回求即可得到分配方案。程序实现时使用顺推,先枚举车间数,再枚举设备数,再枚举状态转移时用到的设备数,简单3重for循环语句即可完成。时间复杂度为O(n^2*m),空间复杂度为O(n*m),倘若此题只需求最大获利而不必求方案,则状态量可以减少一维,空间复杂度优化为O(n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Douglassssssss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值