最短路与动态规划(三)

1.动态规划可用项目管理上,形成项目网络图

2.序贯决策需要注意准确定义阶段(stage)与状态(state)

3.整数规划问题也用动态规划思想解决

前两篇我们介绍了最短路问题的模型以及求解的算法,今天我们对最短路问题进一步扩展,讨论一下这种思想还可以应用到什么场景中。

传送门:最短路与动态规划(一)最短路与动态规划(二)

1

CPM项目网络

项目管理是现实中常见的企业工作,为了对项目进行有效的计划和控制,我们一般会将项目分割成一些活动(activity),只有完成了这些活动才能完成整个项目,每个活动都有一个估计的工期(duration):

cc39d41bac29ac39124cf14fefaef3e9.png

此外,还有一系列的前导活动,如果活动k必须在活动j完成后才能可以进行,那么活动j就是活动k的前导活动。

我们可以用最短路算法来解决这类项目计划问题,而最短路算法前提是需要一个网络或图,针对这类项目管理得到的图的方法称为关键路径方法(critical path method),简称为CPM项目网络。

与之前的最短路问题的网络不同,CPM项目网络拥有特殊的起点和终点节点,其余每个节点代表一个活动。对于那些没有前导活动的活动,他们与起点用一条长度为0的弧连接,其他节点与其前导活动节点连接作为弧,该弧长度为前导活动节点的工期,若某节点不能作为其他任何一个节点的前导活动,则到达终点。

举一个例子。

  • WeBuild建筑公司

WeBuild建筑公司要在一个医院附近建设一个一层高的医务室。下表详细标明了完成该项目需要的9个活动。为了计划原料的供应以及安排不同施工单位完成不同活动,WeBuild公司需要一个计划表,也就是说,他们希望知道每个活动最早可以施工的时间

最短路与动态规划(三)_第1张图片

根据CPM项目网络,我们加入起点(start)终点(finish)表示项目的开始和结束,则其网络可表示为:

最短路与动态规划(三)_第2张图片

这样我们就把项目管理问题转化为了项目网络,接下来的问题是:它的最早开工时间是什么时候?

我们拿出节点3来分析,它最高开工时间来自于工期为15的前导活动1和工期为5的前导活动2,只有两个活动都完成了才能开始活动3,由于活动1,2没有前导活动,所以都可以从时间0开工。因此活动3最早开工时间是:

5019a995e32c9be5d084aaf80e246635.png

由此,我们有原理:

项目中任何一个活动k的最早开工时间等同于该项目网络中从起点到节点k的最长路长度,这样的最长路径称为关键路径。完成一个项目最短时间等于对应项目网络中从起点到终点的关键路径长度。

回到WeBuild建筑公司的项目网络,这是一个无环有向图,利用上一篇的无环有向图最短路算法可以求解,在这里只需要将min改为max即可,我们展示算法的全过程:

最短路与动态规划(三)_第3张图片

从起点到终点,一共需要73天,其路径为start-1-3-4-7-8-9-finish

注意,项目网络的最早开工时间是假设从时间0开始,如果项目有截止日期,也就是所有活动必须完成的时间节点,那么我们用最长路的计算反过来求出保证项目在截止日期前完成的最迟开工时间。原理是:

项目中某活动k的最迟开工时间等于截止日期减去CPM网络中从k到终点的最长路距离

以WeBuild为案例,假设要求整个项目必须在第80天完成,那么最迟开工时间为:

最短路与动态规划(三)_第4张图片

这里实现要利用原来的算法,只不过节点从终点开始,标号从最大的开始取,方向是相反的,对应的弧取值加负号,比如从终点开始,先取节点9,得到:

1563e03898824a9bd27fbabdd0ff8a7a.png

再到节点8:

9d79489f6c69572b2d4efe439352af91.png

以此类推。。。

2

序贯决策问题

序贯决策(sequential descision)是一系列按照一定顺序排列的决策。这种问题也可以转化为有向无环图,求出最短或最长路问题。同样以一个例子切入。

  • 华格纳-怀丁批量计划

在生产环境中,如果每次启动生产都需要大量的启动成本,则需要考虑每次生产的批量,下表展示了每个时间段k=1,2,...,n内需求和成本:

最短路与动态规划(三)_第5张图片

最优解需要平衡生产和库存成本,有时候当我们需要产品时就要支付启动费用开始生产,而生产一段时间后,接下来几段时间就需要支付库存费用,以及由不能被立即使用的产品生产成本所带来的资金占用损失。

来思考这个问题的决策变量——某个时间段内是否要进行生产。为了将一系列的决策建立成动态规划模型,我们需要找到新一轮决策与之前的历史决策之间的关系

在最优方案中,只有当库存为0的时候才会进行生产,也就是说在某个时间段k内,要么生产,要么持有库存(来自上一期或更早),不会同时发生。因为如果在某段时间内既生产又持有库存,那么可以在上一阶段少生产一些,整个需求由这次生产来满足,这样库存成本就会降低。

因此,我们要引入状态(state)来描述进行决策时中间过程的状态,动态规划对应的有向图的每个节点都是一个中间过程的状态,有向图的弧对应着决策,每条弧都连接着当前状态节点和该决策引发的新的状态节点。

上面的例子中,状态就是若时间l

最短路与动态规划(三)_第6张图片

这里的决策指的是某些时间点生产决策,这些生产决策满足接下来一个或几个阶段的需求。比如从状态l=3到状态k=6,它们的弧代表着阶段3的生产满足阶段3,4,5的需求,其成本为:

最短路与动态规划(三)_第7张图片

利用无环有向图算法寻找最短路径,得到最优路径1-5-7,成本为415:

最短路与动态规划(三)_第8张图片

具体到决策为,在k=1阶段,启动生产,生产数量10+40+20+5=75,在k=5阶段,再次启动生产,生产数量5+15=20,其中,启动成本为50+50=100,生产成本为75*1+20*1=95,库存成本为65*2+25*2+5*2+15*2=220,一共415

动态规划其实是一种递归函数,我们利用递归函数可以很快找到最优路径,比如该案例中,函数递归方程为:

最短路与动态规划(三)_第9张图片

基于中间过程状态进行的一系列决策是离散动态规划的核心,但需要注意区分阶段(stage)状态(state):在拥有阶段和状态的动态规划模型中,阶段描述了需要做的决策的序列,状态指的是决策需要考虑的那些条件。

  • 总统图书馆

快退休的总统需要对他的文件进行整理并存放到新的总统图书馆,档案都存放在硬纸板盒子中,这些盒子都是1.25英寸宽,但高度不同。下表展示了估计出来的不同高度的盒子数量。

bd2ded26a91017f190c5e945725c157f.png

档案盒要被放在铁制书架上,而且不允许盒子摞起来存放,我们要处理的问题是需要多少书架空间。下图展示了如果使用两种不同隔板间距书架需要的总面积。

最短路与动态规划(三)_第10张图片

占用面积最小的排布方式很显然,只要针对7种不同高度设计7种隔板间距即可。但是设计者希望尽可能使得储存空间更加规整,即使选择了7种间距,也要尽可能有效利用空间。

该案例的决策指的是对隔板间距的选择(指的是数量,因此每个隔板间距都有一个对应的阶段,在考虑新的隔板间距时,我们要考虑之前已经使用了什么样的隔板间距,因此定义阶段和状态为:

fd9a81e75030b8a22ab962569f33f72d.png

在前i种大小的盒子已经安排好的情况下,对第j种大小盒子选择一个隔板间距,那么占用面积为:

最短路与动态规划(三)_第11张图片

比如安排j=6的盒子,如果i=3盒子已经安排好,那么需要的面积为:

5ad53ed680058a082ab09bebf1aa75ae.png

下表展示了从状态i到状态j的所有所需空间面积:

最短路与动态规划(三)_第12张图片

接下来我们构造阶段与状态的有向图,因为阶段k代表了隔板间隔的数量,如果用一个隔板,那么表明状态i=0到j=7直接结束,如果用两个隔板,假如最后一个隔板是从1到7,那么第一个隔板只能从0到1,以此类推。我们用阶段倒叙表示如下有向图:

最短路与动态规划(三)_第13张图片

这是合理的,比如k=3,表示用三个隔板,那么第一个隔板可以选择1,2,3,4,5盒子的任意一种组合。利用函数递归方程:

最短路与动态规划(三)_第14张图片

我们可以得到下面一张表:

最短路与动态规划(三)_第15张图片

这张表的意思是,根据不同的隔板数量都有最优的面积以及路径,比如选择k=4,那么最优面积是108.125,路径为0-1-4-6-7;又比如k=3,那么最优面积为117.5,路径为0-4-6-7.

这张图换一个角度,本质是无环有向图,因此可以直接利用高效算法求解,只需要将节点的顺序重新编号:

最短路与动态规划(三)_第16张图片

利用算法跑完的结果后映射回去即可:

最短路与动态规划(三)_第17张图片

比如k=4,那么终点就是22,最优面积为108.125,对应路径为22-17-9-1-0,映射回去后原来路径为0-1-4-6-7,与函数方程得到的结果完全一致!

总结一下,无论是“总统图书馆”案例还是“华格纳-怀丁”案例,关键之处是将与路径毫无相关的场景提取状态阶段,才能把问题模型化为“最短路问题”,这需要有数学概念与场景知识的关联创造力。下面我们再举一个案例。

3

整数规划和组合优化

整数规划(interger programming)组合优化(combinatorial optimization)问题有时候也能够使用动态规划思路进行求解。

  • 电子选票背包问题

一个竞选管理者需要在剩余两个星期的总统选举中分配资金。如果某个候选人得到了多数的电子选票,那么此人就会被选为总统。下表展示了n=7个目标州的电子选票数量,我们的顾问认为这7个州在2周后选举接近尾声。表中也展示了顾问估计的选举花销(单位:百万美元)。总的预算约束为b=10(百万美元),顾问希望能够在预算约束内为竞选人争取更多的电子选票。

最短路与动态规划(三)_第18张图片

根据运筹学模型化方法,很容易得到目标函数与约束条件:

最短路与动态规划(三)_第19张图片

我们定义,n=1~7为决策的阶段,剩余可用的资金为状态,由于资金最小消耗单位为1,因此状态可取0~10,每一个阶段,要么进行演讲,要么不,所以状态从10开始,每一个阶段只有两条弧指向下一阶段,弧的取值显然为0或者选票数量。我们得到如下的有向图:

最短路与动态规划(三)_第20张图片

下面思考其函数方程,定义:

16e559ad503efe9f9f8ade5d17c8e77c.png

阶段j的最优选票要么来自阶段j-1最优选票且j阶段不进行演讲,要么来自阶段j-1选票加上j阶段进行演讲得到的票数,如果是后者,j-1阶段状态是j阶段状态加上用去的花销:

最短路与动态规划(三)_第21张图片

利用递归函数,我们得到最长路路径:第1到4阶段都选择举行演讲,第5到第七阶段不再进行演讲,最大收获票数为54

最短路与动态规划(三)_第22张图片

附录:

# 电子选票背包问题实现程序
import pandas as pd
a = [2, 5, 1, 2, 1, 4, 3]
v = [9, 29, 6, 10, 4, 18, 13]


def V(j,i):
    if j == 1 and i == 10:
        return 0
    elif j == 1 and i != 10:
        return float('-inf')
    else:
        return max(V(j-1,i),V(j-1,i+a[j-1-1])+v[j-1-1])


Li = []
for j in range(1,9):
    l = []
    for i in range(10,-1,-1):
        l.append(V(j,i))
    Li.append(l)
Re = pd.DataFrame(Li).T
print(Re)

你可能感兴趣的:(动态规划,算法)