Dynamic Programming

3.1 Shortest Paths

  考虑一个具有非负弧长cij的图G=(V,A),找出从s到t的最短路径。

一个最直接的方法:

  • 找出所有从s到t的路径
  • 评估所有s-t路径的长度
  • 找出最短的长度
    s−t路径的数量呈指数增长,对于大的图是不可行的。
提示

如果s-t的最短路径经过节点p,那么子路径(s,p)和(p,t)一定分别为s到p和p到t的最短路径。

  用d(v)表示从s到v的最短路径,那么

d(v)=miniV(v){d(i)+civ}

对于is,计算d(v)复杂度O(m)

  假设|V|=n|A|=m,对节点进行排序使得对于所有的(i,j)A都有ijDk(j)=从s到j的最短路径长度,最多经过k条弧,那么

Dk(j)=min{Dk1(j), miniV(j)[Dk1(i)+cij]}

k从1增大到m1,即可得到最短路径。算法的复杂度为O(mn)

:找出从A到J的最短路径

3.2 Priciple of Optimality

Richard Bellman(1952)提出了最优性和动态规划的原理。
— Richard Bellman on the Birth of Dynamic Programming. Stuart Dreyfus. Operations Research, Vol. 50, No. 1, 48-51, 2002

Richard Bellman (1920-1984)

Principle of optimality:在决策或选择的最优序列中,每个子序列也必须是最优的。

  最优原理适用于多阶段决策问题,有非常多的优化问题都满足这个原理,它适用于一类问题(而不是一个算法)。阶段可以指每个需要被计算值的节点,或者决定顺序的步骤。

注意

最优性原理并不是一个定理,并不是所有的多阶段决策问题都满足它。

3.3 0-1 Knapsack Problem

  考虑0-1背包问题

f=max{cxaxb,x{0,1}n}

  要用动态规划解决背包问题,首先要从多阶段决策的角度来分析这个问题。决定每个物品要不要拿可以看作一次决策,在这个过程中背包的容量会变化。定义1kn为阶段,0λb为状态。最优价值函数:

fk(λ)=max{j=1kcjxjj=1kajxjλ,x{0,1}k}

显然,当k=n, λ=b时有最优解,即f=fn(b)

  下面,将问题写成递归的形式。对于第k个物品,只有拿和不拿两种情况。

fk(λ)=max{fk1(λ),ck+fk1(λak)}

初始条件:f0(λ)=0f1(λ)=0, if 0λ<a1,且f1(λ)=max(c1,0), for λa1

  如何求最优解呢?令pl(λ)=0, if fk(λ)=fk1(λ),否则,令其为1。

  计算复杂度:O(nb)。(伪多项式时间)

注意

多项式时间的算法所需要的计算次数只与问题的规模n有关系。

例:0-1背包问题

3.4 Integer Knapsack Problem

  考虑整数背包问题

f=max{j=1ncjxjj=1najxjb,xZ+n} 其中,cj<0,aj>0,j=1,,n

  下面,用动态规划来解决这个问题。定义r为阶段,λ为状态,得到问题

gr(λ)=max{j=1rcjxjj=1rajxjb,xZ+r}

显然,当r=n,λ=b时有最优解,即z=gn(b)

  递归方程:

gr(λ)=maxt=0,1,,λ/ar{crt+gr1(λart)}

对于r=1,,nλ=1,,b,计算gr(λ)最多需要O(b)次,所有gn(b)计算复杂度为O(nb2)

问:有更好的做法吗?
— 把每个阶段决定拿几个改成决定要不要拿一个,如果拿了一个要不要再拿下一个。

对于xr有两种情况:
 (i) xr=0,gr(λ)=gr1(λ)
 (ii)xr1,那么xr=1+t,其中t0的整数
  (x1,,xr1,t)对于有r个状态和λar个资源的背包问题是最优的。
  (gr(λ)=cr+gr(λar))。因此

gr(λ)=max{gr1(λ),cr+gr(λar)}

  计算复杂度:O(nb)

例:整数背包问题

注意

注意:在整数背包问题中,表格的计算必须遵循从上到下,从左到右的顺序。

3.5 Uncapacitated Lot-Sizing

  生产计划中的批量问题指的是决定最小成本生产和产品的库存保持问题从而在有限个离散阶段内满足需求。

  ftt周期的固定生产成本;
  ptt周期的单位生产成本;
  htt周期的固定储存成本;
  dtt周期的需求;
  xtt周期的产量;
  stt周期末的库存,s0=0sn=0

ULS网络(n=4)

  ULS可以被看作一个 fixed-charge network flow(固定费用网络流)问题,需要决定打开哪条边(0,t)(这些弧是生产周期),并找出通过网络的最小成本流。

  整数规划模型:

mint=1nptxt+t=1nhtst+t=1nftyts.t. st1+xt=dt+st,t=1,,n,xtMyt,t=1,,n,s0=0,sn=0,st,xt0,yt{0,1},t=1,,n.

其中,M>0是一个足够大的数(比如,各阶段的需求和)。

基本性质:
  存在一个最优解满足st1xt=0
  存在一个最优解使得如果xt>0,那么对于某个kxt=i=tt+kdi

  令dit=j=itdj。因为st=i=1txii=1tdi,目标函数可以表示成

t=1nptxt+t=1nhtst+t=1nftyt=t=1nctxt+t=1nftytt=1nhtd1t

其中,ct=pt+i=tnhi。由于t=1nhtd1t为常数,所以可以从目标中去掉。

  假设H(k)为阶段1,,k的解对应的最小成本。如果tk为最后一次生产的阶段,那么xt=i=tdi,成本为H(t1)+ft+ctdtk

  前向递归(Wagner-Whitin算法):

H(k)=min1tk{H(t1)+ft+ctdtk}

其中,H(0)=0

  对k=1,2,,n计算H(k),得到最优值H(n)

  计算复杂度:O(n2)