动态规划问题的数学原理——如何按部就班就能推导出状态转移方程?

动态规划

动态规划是解决多阶段决策过程最优化的一种方法,其基本思想是从终点逐段向始点方向寻找最短路线。

生活中平常的事例,即可深刻揭示最短路线的重要特性:

如果最短路线在第 K 站通过点 Pk , 则由点 Pk 出发到达终点的这条路线,对于从点 Pk 出发到达终点的所有可能选择的不同路线来说,必定也是最短路线。

动态规划的分类#

  • 按照决策过程的时间参量是离散/连续区分:离散(多段)决策过程 vs 连续决策过程
  • 按照决策过程的演变是确定/随机区分:确定性决策过程 vs 随机性决策过程
  • 按照上述分类可以得到四种组合:
    • 离散确定性决策过程
    • 离散随机性决策过程
    • 连续确定性决策过程
    • 连续随机性决策过程

多阶段决策问题#

  • 由于它的特殊性,可将过程划分为若干互相联系阶段
  • 在它的每一个阶段都需要作出决策,并且一个阶段的决策确定以后,常影响下一个阶段的决策,从而影响整个过程的活动路线;
  • 各个阶段所确定的决策就构成一个决策序列,通常称为一个策略
  • 每一个阶段可供选择的决策往往不止一个,对应于一个策略就有确定的活动效果
  • 多阶段决策问题,就是要在允许选择的那些策略中间,选择一个最优策略,使在预定的标准下达到最好的效果

动态规划的基本概念#

阶段(Stage)#

把所给问题的过程,恰当地划分成若干个相互联系的阶段,以便于求解。通常用 k 表示阶段变量。

状态(State)#

状态表示某段的出发位置。它既是该段某支路的始点,同时也是前一段某支路的终点。通常一个阶段包含若干个状态。

描述过程状态的变量,称为状态变量。常用 xk 表示在第 k 段的某一状态。第 k 段状态集合可表示为:

Xk={xk(1),xk(2),,xk(i),,xk(r)}

决策(Decision)#

决策就是某阶段状态给定以后,从该状态演变到下一阶段某状态的选择。

描述决策的变量,称为决策变量。

常用 uk(xk) 表示第 k 段当状态处于 xk 时的决策变量。决策变量的取值往往限制在某一范围之内,此范围称为允许决策集合。通常以 Dk(xk) 表示第 k 段当状态处于 xk 时的允许决策集合。

uk(xk)Dk(xk)

策略(Policy)#

由过程的第1阶段开始到终点为止的过程,称为问题的全过程。

由每段的决策 ui(xi)(i=1,2,,n) 组成的决策函数序列就称为全过程策略,简称策略,记为 p1,n。即:

p1,n(xk)={u1(x1),u2(x2),,un(xn)}

由第 k 段开始到终点的过程称为原过程的后部子过程(或称为 k 子过程)。

其决策函数序列 {u1(x1),u2(x2),,un(xn)} 称为 k 子过程策略,简称子策略。即

pk,n(xk)={uk(xk),uk+1(xk+1),,un(xn)}

在实际问题中,可供选择的策略有一定的范围,此范围称为允许策略集合,用 P 表示。从允许策略中找出的达到最优效果的策略称为最优策略。

指标函数#

在多阶段决策过程最优化问题中,指标函数是用来衡量所实现过程的优劣的一种数量指标,它是一个定义在全过程和所有后部子过程上的确定数量函数,常用 Vk,n 表示。即

Vk,n=Vk,n(xk,uk,xk+1,,xn+1) k=1,2,,n

不同的问题中,指标的含义也不同:距离、利润、成本、产量、资源消耗等。

k 阶段由状态 xk 作出决策 uk(xk) 的所对应的指标称为阶段指标(阶段效益),可记为 dk(xk,uk)

比如由 点xk 到 点uk(xk) 的距离,就是一个阶段指标。

最优指标函数#

指标函数 Vk,n 的最优值,称为相应的最优指标函数。记为 fk(xk)

举例: fk(xk) 可以代表从第 k 段 点xk 到 终点G 的最短距离。


动态规划的基本思想和基本方程#

动态规划最优化原理#

作为整个过程的最优策略具有这样的性质:即无论过去的状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。

可逆过程#

顺序解法:假设求点A到点G的最短路线,那么以G为始端,以A为终端的左行解法程序称为顺序解法。

逆序解法:同理。

可逆过程:可以把段次颠倒过来求最优解的多阶段决策过程称为可逆过程。

构成动态规划模型的条件 (通用解法)#

建立动态规划模型时,除了要将实际问题恰当地划分若干个阶段(一般是根据时间和空间而划分的)外,主要明确以下四个方面:

1、正确选择状态变量#

正确选择状态变量 xk,使它既能描述过程的状态,又要满足无后效性。

动态规划中的状态与一般所说的状态概念是不同的,它必须具有三个特性:

  • 要能够用来描述受控过程的演变特征。
  • 要满足无后效性。所谓无后效性是指:如果某段状态给定,则在这段以后过程的发展不受前面各阶段状态的影响。
  • 可知性。即是规定的各段状态变量的值,由直接或间接都是可以知道的。

2、确定决策变量及每阶段的允许决策集合#

确定决策变量 uk 及每阶段的允许决策集合 Dk(xk)=uk

3、写出状态转移方程#

如果给定第 k 段状态变量 xk 的值,则该段的决策变量 uk 一经确定,第 k+1 段状态变量 xk+1 的值也就完全确定。

xk+1 的值随 xkuk 的值的变化而变化的这种对应关系,表示为:

xk+1=Tk(xk,uk)

它表示由 k 段到 k+1 段的整体转移规律,称为状态转移方程。

4、根据题意,列出指标函数关系,并要满足递推性。#

正确列出指标函数 Vk,n 关系,必须使它具有三个性质:

  • 它是定义在全过程和所有后部子过程上的数量函数;
  • 要满足递推关系。 即:

Vk,n(xk,uk,xk+1,,xn+1=Ψ[xk,uk,Vk+1,n(xk+1,,xn+1)]

  • Ψ[xk,uk,Vk+1,n] 对其变元 Vk+1,n 来说要严格单调。

常见的指标函数是取各段指标和的形式。即

Vk,n=j=knvj(xj,uj)

其中 vj(xj,uj) 表示第 j 段的指标。它显然是满足上述三个性质的。所以上式可写成:

Vk,n=vk(xk,uk)+Vk+1,n[xk+1,,xn+1]

当初始状态给定,过程的策略也确定了时,指标函数也就确定了。

因此,指标函数是初始状态和策略的函数,记为 Vk,n[xk,pk,n(xk)]。故上面递推关系又可写成:

Vk,n=vk(xk,uk)+Vk+1,n[xk+1,pk+1,n]

因其子策略 pk,n(xk) 可看成是由决策 uk(xk)pk+1,n(xk+1) 组合而成。即

pk,n(xk)={uk(xk),pk+1,n(xk+1)}

对于最优策略的指标函数值,有

fk(xk)=Vk,n[xk,pk,n(xk)]=optpk,n Vk,n[xk,pk,n(xk)]

其中 Pk,n(xk) 表示初始状态为 xk 的后部子过程所有子策略中的最优子策略

由上述四个条件(组成部分)得出动态规划的基本方程:

动态规划的基本方程#

若从 xk 出发,有:

(1)optpk,n Vk,n(xk,pk,n)=opt{uk,pk+1,n} {vk(xk,uk)+Vk+1,n(xk+1,pk+1,n)}(2)=optuk {vk(xk,uk)+optpk+1,n Vk+1,n}(k=n, n1, , 1)

于是可得:

(3)fk(xk)=optpk,n Vk,n(xk,pk,n)(4)=optuk Vk,n(xk,uk,pk+1,n)(5)=optukDk(xk) {vk(xk,uk)+fk+1(xk+1)}(k=n, n1, , 1)

以及:

fn+1(xn+1)=0

以上是逆序解法的基本方程。

其递推过程从 k=n 开始,逐段向前推移,一直到求出 f1(x1) 时,就得到了整个过程的最优解,包括最优策略和相应的最优指标函数值。

问题举例#

上面的公式太抽象了,我们来看看在实际问题中是怎么操作的:

机器负荷分配问题

某种机器,可以在高低两种不同的负荷下进行生产。

在高负荷下进行生产时,产品的年产量 s1 和投入生产的机器数量 u1 的关系为:

s1=g(u1)

这时,机器的年折损率为 a,即如果年初完好机器的数量为 u,到年终时完好的机器就为 au0<a<1

在低负荷下生产时,产品的年产量 s2 和投入生产的机器数量 u2 的关系为:

s2=h(u2)

相应的机器的年折损率为 b , 0<b<1

假定开始生产时完好的机器数量为 x1。要求制定一个五年计划,在每年开始时,决定如何重新分配完好的机器在两种不同的负荷下生产的数量,使在五年内产品的总产量达到最高。

设机器在高负荷下生产的产量函数为 S1=8u1,折损率为 a=0.7;

在低负荷下生产的产量函数为 S2=5u2 ,年折损率为 b=0.9

开始生产时完好机器的数量 x1=1000 台。按题意要安排好五年的生产计划,使产品的总产量最高。

问题的动态规划模型:

  • 阶段序数 K 表示年度。
  • 状态变量 xk 为第 K 年度初拥有的完好机器数量,亦为第 K1 年度末时的完好机器数量。
  • 决策变量 uk 为第 K 年度中分配高负荷下生产的机器数量。则 xkuk 为该年度中分配在低负荷下生产的机器数量。
    • 这里 xkuk 均取连续变量。如 uk=0.3,表示一台机器在该年度只有 3/10 的时间在高负荷下工作。
  • 状态转移方程为:

(6)xk+1=auk+b(xkuk)(7)=0.7uk+0.9(xkuk)(k=1,2,...,5)

  • k 阶段的允许决策集合Dk(xk)={uk|0ukxk}
  • 所以,指标函数V1,5=k=15vk(xk,uk)
  • fk(xk) 表示由 xk 出发采用最优分配方案到第5年度结束这段期间的产品产量,根据最优化原理,则有递推关系式

{f6(x6)=0fk(xk)=maxukDk(xk)8uk+5(xkuk)+fk+1[0.7uk+0.9(xkuk)]k=1,2,3,4,5

  • 逆序计算,得 uk={0,0,x3,x4,x5},故最高产量为 23700。

剑指 Offer 47. 礼物的最大价值

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

示例 1:

Copy
输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 12 解释: 路径 13521 可以拿到最多价值的礼物
  • 阶段序数:第 k 步移动棋子,假设移动后处于 (i,j)格,则用 gk(i,j) 表示在 (i,j) 格获得的礼物数,k=1,2,...,m+n1
  • 状态变量xk 表示为 (i,j)格 移动到 (m,n)格 的总礼物数量
  • 决策变量uk 表示下一步(k+1步,选择移动到 (i+1,j)格 或者 (i,j+1)格)获得的礼物数量
  • 状态转移方程xk+1=xkukxk+1 表示从第 k+1 步所处的格子 到 (m,n)格 的总礼物数(因为是逆序解法,也可以表示为 xk=uk+xk+1
  • 允许决策集合Dk(xk)={gk(i+1,j),gk(i,j+1)|0<im,0<jn}
  • 最优递推式fk(xk) 表示 (i,j)格 移动到 (m,n)格 的最优总礼物数量

{fk(xk)=maxuk{(i+1,j),(i,j+1)}{gk(uk)+fk+1(xk+1)},k=m+n2,,1fm+n1(xm+n1)=gm+n1(m,n)

  • 代码实现:

    Copy
    class Solution: def maxValue(self, grid: List[List[int]]) -> int: m = len(grid) n = len(grid[0]) dp = [[0] * n] * m # dp[i][j]: (i, j) 到 (n, n) 的最优礼物数 for i in range(m-1, -1, -1): for j in range(n-1, -1, -1): if i == m-1 and j == n-1: dp[m-1][n-1] = grid[m-1][n-1] down = dp[i+1][j] + grid[i][j] if i != m-1 else 0 # 状态转移方程 x_k = x_{k+1} +u_k right = dp[i][j+1] + grid[i][j] if j != n-1 else 0 # 注意i,j的边界条件 decision_set = {down, right} # 允许决策集合 dp[i][j] = max(decision_set) # 最优递推式 return dp[0][0]

posted @   Khunkin  阅读(779)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示

Catalogue

Catalogue

X