By Z.H. Fu
https://fuzihaofzh.github.io/blog/
动态规划是一种强大的数学工具,它可以解决一系列看似复杂的优化问题。本篇博客文章将向你展示如何利用动态规划来解决各种类型的问题,包括资源分配、生产计划、不确定性采购、背包问题、复合系统可靠性、设备更新、旅行商问题和整数规划等。我们将从每个问题的静态规划模型开始,然后详细解释如何转化为动态规划模型,并给出求解的过程。希望这篇文章能帮助你更好地理解和应用动态规划,以解决实际中的问题。
一维资源分配
总原料a,生产n种产品,若分配数量xi 用于生产第 i 种产 品,其收益为 gi(xi),求xi的分配方式使得总收入最大。
静态规划:
max s.t. z= i=1∑ngi(xi)∑xi=a;xi≥0
动态规划:
fk(sk)=0≤xk≤skmax{gk(xk)+fk+1(sk−xk)}, k=n−1,⋯,1;fn(sn)=xn=snmaxgn(xn)
sk 表示分配用于生产第 k 种产品至第 n 种产品的原料数量,最后求f1(a)
资源连续分配问题
资源总量s1,可投入A、B两种生产,第一年以u1生产A,剩下s1−u1生产B,收入为g(u1)+h(s1−u1)。年终剩余资源再投入第二年生产s2=au1+b(s1−u1)。决策变量ui,求n年最大化收入。
静态规划:
maxs.t. z= i=1∑ng(ui)+h(si−ui)si+1=aui+b(si−ui), i=1,⋯,n−1;0≤ui≤si, i=1,⋯,n
动态规划:
fk(sk)=0≤uk≤skmax{g(uk)+h(sk−uk)+fk+1(auk+b(sk−uk))}, k=n−1,⋯,1;fn(sn)=0≤un≤snmax{g(un)+h(sn−un)}
例如机器两个档的例题,k=5,4,3,2,1逐步往前推。每一步都能化简成max一个线性函数,因此若系数为正,就取决策变量的上界,系数为负就取下界。
二维资源分配
两种原料,数量为a和b,需要分配用于生产n种产品。如果以第一种原料xi, 第二种原料yi,生产第 i 种产品, 其收入为gi(xi,yi)。分配n种产品,最大化收入。
静态规划:
maxz= i=1∑ngi(xi,yi)s.t. ∑xi=a;∑yi=bxi,yi≥0
动态规划:
fk(x,y)=0≤xk≤x;0≤yk≤ymax{gk(xk,yk)+fk+1(x−xk,y−yk)}, k=n−1,⋯,1;fn(x,y)=gn(x,y)
x,y表示两种原料总量
固定资金分配
n种产品,两种资源x,y,价格限制ax+by≤z。求如何购买x,y
静态规划:maxz= ∑i=1nri(xi,yi); s.t. ∑xi=x;∑yi=y;ax+by≤z;
把二维转成一维。定义资金利润函数Rk(x)=maxyk=0,1,⋯,(z/b){rk(⌊(z−byk)/a⌋,yk)}
动态规划:fk(z)=maxzk=0,1,⋯,z[Rk(zk)+fk+1(z−zk)]; fn(z)=Rn(z)
生产计划问题
n个阶段,第k个阶段需求dk,产量xk,vk为k阶段结束时的库存量,每个阶段起步成本K,最大产量m,产品成本axk,n阶段借宿后库存为0。需最小化生产成本。
ck(xk)=0, if xk=0; =K+axk, if xk=1,2,⋯,m; =∞, if xk>m
静态规划:
mins.t.g=k=1∑n[ck(xk)+hk(vk)],v0=0,vn=0;vk=j=1∑k(xj−dj)≥0,k=2,⋯,n−1;0≤xk≤m,k=1,⋯,n
xk is integer
动态规划:
xk为决策变量,vk−1为状态变量,是k阶段开始时的库存量。有:vk=vk−1+xk−dk,fk(vk)=min0≤xk≤σk[ck(xk)+hk(vk)+fk−1(vk−1)]其中σk=min(vk+dk,m)(生产上限是m,且vk−1=vk+dk−xk≥0)。边界条件f0(v0)=0。目标求fn(0)
不确定性采购问题
一种商品的采购可以在n周内选一个时候买,每个阶段有价格和相应的概率(每周都相同)。求价格期望最小的采购方案。 状态变量yk,xk决策变量,ykE第k周等待,以后采购的期望价格。
动态规划:fk(yk)=min{yk,ykE},fn(yk)=yn(最后一周,不管什么价都必须买),ykE=Efk+1(yk+1)。先算k=5。
背包问题
背包容量w,每件物品重wi,每件物品价值cixi,状态变量w,决策变量xk
f1=maxx1=0,1,⋯,⌊w/w1⌋c1(x1),fk(w)=maxxk=0,1,⋯,⌊w/wk⌋{ck(xk)+fk−1(w−wkxk)},2≤k≤n
复合系统可靠性
目标函数是乘积。一个系统由n个模块串联,每个模块可以有ui个备份,正常工作概率pi(ui),每个模块单个备份重wi,价格ci,总费用限制c,总重量限制w。求最大化正常工作概率。
静态规划:
max s.t.P=i=1∏npi(ui),i=1∑nciui≤c;i=1∑nwiui≤w;ui≥0
动态规划:
用xk,yk表示k到n个部件剩余的总费用和总重量,状态转移方程xk+1=xk−ukck,yk+1=yk−ukwk。
动态规划基本方程:
fk(xk,yk)=0≤uk≤min(⌊xk/ck⌋,⌊yk/wk⌋)max[pk(uk)fk+1(xk−ckuk,yk−wkuk)],k=n,n−1,⋯,1,fn+1(xn+1,yn+1)=1
设备更新问题
Ij(t),Oj(t),Cj(t)表示在第j年,役龄为t年的一台机器运行所得收入,运行费用,更新费用(若更新的话),α为一年后的收入折现到现在的因子,T第一年时,机器已使用年数,n计划总年数,gj(t)在第j年使用役龄为t的机器的最优收入,xj(t)第j年的决策(保留或更新)
gj(t)=max[Ij(0)−OJ(0)−Cj(t)+αgj+1(1),Ij(t)−Oj(t)+αgt+1(t+1)],(j=1,2,⋯,n,t=1,2,⋯,j−1,j+T−1);gn+1(t)=0
TSP问题
记fk(i,S)表示第一个城市到第i个城市的距离,S是途经城市的集合。S∈Ni={2,3,⋯,i−1,i+1,⋯,n},fk(i,S)=minf∈S[fk−1(j,S\{j})+dji],f0(i,Φ)=d1i
解整数规划
maxs.t. z=cTxaTx≤10;bTx≤13;xi≥0
状态x,y表示两个约束对xi,⋯xn进行规划,fk(x,y)=max0≤xk≤min(⌊x/ak⌋,⌊x/bk⌋)[ckxk+fk+1(x−akxk,y−bkxk)]