Bootstrap

动态规划之最短路问题及其解法

动态规划

引言

  1951年,美国数学家贝尔曼(R.Bellman)等根据一类所谓多阶段决策问题的特性,提出了解决这类问题的“最优化原理”,并研究了许多实际问题,从而创立了最优化的一个新分支----动态规划
  动态规划没有统一的数学模型,对不同的问题要采用不同的方法去建立它们的模型。有了模型之后,要想得到数值解,仍然没有统一的处理方法。这是应当注意的。

1 动态规划原理

1.1 最短路问题及其解法

1.1.1 最短路问题及其特点

  图1-1称为线路网络图,其中小圆圈称为点,两点间的连线称为弧,弧上的数字称为弧长。试求一条从起点 A A A到终点 E E E的连通弧,使其总弧长最短。称这类问题为最短路问题

图 1-1

  最短路问题的含义是广泛的,求解方法也有很多,下面介绍它的动态规划解法。
  首先注意,从 A A A E E E的整个过程可以分成从 A A A到B,从 B B B C C C,从 C C C D D D,再从 D D D E E E四个阶段。每个阶段都有起点,如第二个阶段有两个起点 B 1 B_1 B1 B 2 B_2 B2,用 x k x_k xk表示第 k k k k = 1 , 2 , 3 , 4 k = 1,2,3,4 k=1,2,3,4)个阶段的起点,并称它为状态变量。从每个起点出发都有若干个选择,例如从 B 1 B_1 B1出发有三种选择,到 C 1 C_1 C1或到 C 2 C_2 C2或到 C 3 C_3 C3,用 u k u_k uk表示从第 k k k k = 1 , 2 , 3 , 4 k = 1,2,3,4 k=1,2,3,4)个阶段的状态 x k x_k xk出发所作的选择,并称它为决策变量。如果用 f k ( x k ) f_k(x_k) fk(xk)1表示从第 k k k个阶段的状态 x k x_k xk出发到终点 E E E的最短弧长,或者用 f k ( x k ) f_k(x_k) fk(xk)2表示从起点 A A A到第 k k k个阶段的状态 x k x_k xk的最短弧长,那么问题就变成求 f 1 ( x 1 ) = f 1 ( A ) f_1(x_1)=f_1(A) f1(x1)=f1(A),或者求 f 5 ( x 5 ) = f 5 ( E ) f_5(x_5)=f_5(E) f5(x5)=f5(E)
  其次,不难看出,如果最短路经过第 k k k阶段的状态为 x k x_k xk,那么,从 x k x_k xk出发到达终点 E E E的这条路线,对于从 x k x_k xk出发到达终点 E E E的所有路线来说,显然也是最短路线。3
  根据最短路问题的上述特点,可有下述两种解法。

1.1.2 逆序解法

  用 f k ( x k ) f_k(x_k) fk(xk)表示从第 k k k阶段的状态 x k x_k xk出发到终点 E E E的最短弧长,从后向前逐步求出各点到达终点 E E E的最短路线的最短弧长,最后求出 f 1 ( x 1 ) = f 1 ( A ) f_1(x_1)=f_1(A) f1(x1)=f1(A)即为所求最短路线的最短弧长。计算步骤如下:
  (1)从最后一个阶段 k = 4 k=4 k=4开始,按 f 4 f_4 f4的定义有
f 4 ( D 1 ) = 3 , f 4 ( D 2 ) = 2 , f 4 ( D 3 ) = 2 。 f_4(D_1)=3,f_4(D_2)=2,f_4(D_3)=2。 f4(D1)=3f4(D2)=2f4(D3)=2

  (2)当 k = 3 k=3 k=3时,因为第3阶段有4个状态,而每个状态又有两个决策可选取,所以有
f 3 ( C 1 ) = m i n { d ( C 1 , D 1 ) + f 4 ( D 1 ) d ( C 1 , D 2 ) + f 4 ( D 2 ) } = m i n { 6 + 3 8 + 2 } = 9 , f_3(C_1)=min\left\{ \begin{array}{lcl} d(C_1,D_1)+f_4(D_1)\\ d(C_1,D_2)+f_4(D_2) \end{array} \right\} = min\left\{ \begin{array}{lcl} 6+3\\ 8+2 \end{array} \right\}=9, f3(C1)=min{d(C1,D1)+f4(D1)d(C1,D2)+f4(D2)}=min{6+38+2}=9
其中 d ( ⋅ , ⋅ ) d(\cdot,\cdot) d(,)表示两点间的弧长。这说明从 C 1 C_1 C1到终点 E E E的最短弧长为9,路径为 C 1 → D 1 → E C_1 \rightarrow D_1 \rightarrow E C1D1E,决策为 u 3 ( C 1 ) = D 1 u_3(C_1)=D_1 u3(C1)=D1
f 3 ( C 2 ) = m i n { d ( C 2 , D 1 ) + f 4 ( D 1 ) d ( C 2 , D 2 ) + f 4 ( D 2 ) } = m i n { 3 + 3 5 + 2 } = 6 , f_3(C_2)=min\left\{ \begin{array}{lcl} d(C_2,D_1)+f_4(D_1)\\ d(C_2,D_2)+f_4(D_2) \end{array} \right\} = min\left\{ \begin{array}{lcl} 3+3\\ 5+2 \end{array} \right\}=6, f3(C2)=min{d(C2,D1)+f4(D1)d(C2,D2)+f4(D2)}=min{3+35+2}=6
即从 C 2 C_2 C2到终点 E E E的最短弧长为6,路径为 C 2 → D 1 → E C_2 \rightarrow D_1 \rightarrow E C2D1E,决策为 u 3 ( C 2 ) = D 1 u_3(C_2)=D_1 u3(C2)=D1
f 3 ( C 3 ) = m i n { d ( C 3 , D 2 ) + f 4 ( D 2 ) d ( C 3 , D 3 ) + f 4 ( D 3 ) } = m i n { 3 + 2 3 + 2 } = 5 , f_3(C_3)=min\left\{ \begin{array}{lcl} d(C_3,D_2)+f_4(D_2)\\ d(C_3,D_3)+f_4(D_3) \end{array} \right\} = min\left\{ \begin{array}{lcl} 3+2\\ 3+2 \end{array} \right\}=5, f3(C3)=min{d(C3,D2)+f4(D2)d(C3,D3)+f4(D3)}=min{3+23+2}=5
即从 C 3 C_3 C3到终点 E E E的最短弧长为5,路径为 C 3 → D 2 ( 或 D 3 ) → E C_3 \rightarrow D_2(或D_3) \rightarrow E C3D2D3E,决策为 u 3 ( C 3 ) = D 2 ( 或 D 3 ) u_3(C_3)=D_2(或D_3) u3(C3)=D2D3
f 3 ( C 4 ) = m i n { d ( C 4 , D 2 ) + f 4 ( D 2 ) d ( C 4 , D 3 ) + f 4 ( D 3 ) } = m i n { 8 + 2 4 + 2 } = 6 , f_3(C_4)=min\left\{ \begin{array}{lcl} d(C_4,D_2)+f_4(D_2)\\ d(C_4,D_3)+f_4(D_3) \end{array} \right\} = min\left\{ \begin{array}{lcl} 8+2\\ 4+2 \end{array} \right\}=6, f3(C4)=min{d(C4,D2)+f4(D2)d(C4,D3)+f4(D3)}=min{8+24+2}=6
即从 C 4 C_4 C4到终点 E E E的最短弧长为6,路径为 C 4 → D 3 → E C_4 \rightarrow D_3 \rightarrow E C4D3E,决策为 u 3 ( C 4 ) = D 3 u_3(C_4)=D_3 u3(C4)=D3

  (3)当 k = 2 k=2 k=2时,由于第2阶段有2个状态,每个状态又有3个决策可选,故有
f 2 ( B 1 ) = m i n { d ( B 1 , C 1 ) + f 4 ( C 1 ) d ( B 1 , C 2 ) + f 4 ( C 2 ) d ( B 1 , C 3 ) + f 4 ( C 3 ) } = m i n { 1 + 9 3 + 6 6 + 5 } = 9 , f_2(B_1)=min\left\{ \begin{array}{lcl} d(B_1,C_1)+f_4(C_1) \\ d(B_1,C_2)+f_4(C_2) \\ d(B_1,C_3)+f_4(C_3) \end{array} \right\} = min\left\{ \begin{array}{lcl} 1+9 \\ 3+6 \\ 6+5 \end{array} \right\}=9, f2(B1)=mind(B1,C1)+f4(C1)d(B1,C2)+f4(C2)d(B1,C3)+f4(C3)=min1+93+66+5=9
即从 B 1 B_1 B1到终点 E E E的最短弧长为9,路径为 B 1 → C 2 → D 1 → E B_1 \rightarrow C_2 \rightarrow D_1 \rightarrow E B1C2D1E,决策为 u 2 ( B 1 ) = C 2 u_2(B_1)=C_2 u2(B1)=C2 u 3 ( C 2 ) = D 1 u_3(C_2)=D_1 u3(C2)=D1 u 4 ( D 1 ) = E u_4(D_1)=E u4(D1)=E
f 2 ( B 2 ) = m i n { d ( B 2 , C 2 ) + f 4 ( C 2 ) d ( B 2 , C 3 ) + f 4 ( C 3 ) d ( B 2 , C 4 ) + f 4 ( C 4 ) } = m i n { 8 + 6 7 + 5 6 + 6 } = 12 , f_2(B_2)=min\left\{ \begin{array}{lcl} d(B_2,C_2)+f_4(C_2) \\ d(B_2,C_3)+f_4(C_3) \\ d(B_2,C_4)+f_4(C_4) \end{array} \right\} = min\left\{ \begin{array}{lcl} 8+6 \\ 7+5 \\ 6+6 \end{array} \right\}=12, f2(B2)=mind(B2,C2)+f4(C2)d(B2,C3)+f4(C3)d(B2,C4)+f4(C4)=min8+67+56+6=12
即从 B 2 B_2 B2到终点 E E E的最短弧长为12,路径为 B 2 → C 3 → D 2 ( 或 D 3 ) → E B_2 \rightarrow C_3 \rightarrow D_2(或D_3) \rightarrow E B2C3D2D3E,或 B 2 → C 4 → D 3 → E B_2 \rightarrow C_4 \rightarrow D_3 \rightarrow E B2C4D3E,决策为 u 2 ( B 2 ) = C 3 ) u_2(B_2)=C_3) u2(B2)=C3) u 3 ( C 3 ) = D 2 ( 或 D 3 ) u_3(C_3)=D_2(或D_3) u3(C3)=D2D3 u 4 ( D 2 ) = E u_4(D_2)=E u4(D2)=E;或 u 2 ( B 2 ) = C 4 u_2(B_2)=C_4 u2(B2)=C4 u 3 ( C 4 ) = D 3 u_3(C_4)=D_3 u3(C4)=D3 u 4 ( D 3 ) = E u_4(D_3)=E u4(D3)=E

  (4)当 k = 1 k=1 k=1时,有
f 1 ( A ) = m i n { d ( A , B 1 ) + f 4 ( B 1 ) d ( A , B 2 ) + f 4 ( B 2 ) } = m i n { 5 + 9 3 + 12 } = 14 , f_1(A)=min\left\{ \begin{array}{lcl} d(A,B_1)+f_4(B_1) \\ d(A,B_2)+f_4(B_2) \end{array} \right\} = min\left\{ \begin{array}{lcl} 5+9 \\ 3+12 \end{array} \right\}=14, f1(A)=min{d(A,B1)+f4(B1)d(A,B2)+f4(B2)}=min{5+93+12}=14
即从 A A A到终点 E E E的最短弧长为14,路径为 A → B 1 → C 2 → D 1 → E A \rightarrow B_1 \rightarrow C_2 \rightarrow D_1 \rightarrow E AB1C2D1E,决策为 u 1 ( A ) = B 1 u_1(A)=B_1 u1(A)=B1 u 2 ( B 1 ) = C 2 u_2(B_1)=C_2 u2(B1)=C2 u 3 ( C 2 ) = D 1 u_3(C_2)=D_1 u3(C2)=D1 u 4 ( D 1 ) = E u_4(D_1)=E u4(D1)=E

  上述解法的四个步骤可归纳为下述递推公式:
{ f k ( x k ) = min ⁡ u k ∈ D k { d ( x k , x k + 1 ) + f k + 1 ( x k + 1 ) } ; f 5 ( x 5 ) = 0 , k = 4 , 3 , 2 , 1 \left\{ \begin{array}{lcl} f_k(x_k) = \min \limits_{u_k \in D_k} \{ d(x_k,x_{k+1}) + f_{k+1}(x_{k+1})\} ;\\ f_5(x_5)=0, k=4,3,2,1 \end{array} \right. {fk(xk)=ukDkmin{d(xk,xk+1)+fk+1(xk+1)};f5(x5)=0,k=4,3,2,1
其中 x k + 1 = u k ( x k ) x_{k+1}=u_k(x_k) xk+1=uk(xk),即从状态 x k x_k xk出发,采取决策 u k u_k uk到达下一状态 x k + 1 x_{k+1} xk+1 D k D_k Dk表示从状态 x k x_k xk出发的所有可能选取的决策的集合;而 f 5 ( x 5 ) = 0 f_5(x_5)=0 f5(x5)=0称为边界条件,因为状态 x 5 = E x_5=E x5=E已是终点。

  这个递推公式就是最短路问题的数学模型,也叫动态规划方程

  由于这种算法的寻优方向与过程的行进方向刚好相反,故称逆序解法

1.1.3 顺序解法

  用 f k ( x k ) f_k(x_k) fk(xk)表示从起点 A A A出发到第 k k k阶段的状态 x k x_k xk的最短弧长,从前向后逐步求出起点 A A A到达各阶段起点的最短弧长,最后也可求出从起点 A A A到终点 E E E的最短弧长及其对应的路径。计算步骤如下:
  按定义显然有 f x ( x 1 ) = f 1 ( A ) = 0 fx_(x_1)=f_1(A) = 0 fx(x1)=f1(A)=0,称它为边界条件。以下从第二阶段 k = 2 k=2 k=2开始计算。
  (1)当 k = 2 k=2 k=2时,按 f 2 f_2 f2的定义有
f 2 ( B 1 ) = 5 , f 2 ( B 2 ) = 3 。 f_2(B_1)=5,f_2(B_2)=3。 f2(B1)=5f2(B2)=3

  (2)当 k = 3 k=3 k=3时,按 f 3 f_3 f3的定义有
f 3 ( C 1 ) = d ( B 1 , C 1 ) + f 2 ( B 1 ) = 1 + 5 = 6 , f_3(C_1)=d(B_1,C_1)+f_2(B_1)=1+5=6, f3(C1)=d(B1,C1)+f2(B1)=1+5=6,

f 3 ( C 2 ) = m i n { d ( B 1 , C 2 ) + f 2 ( B 1 ) d ( B 2 , C 2 ) + f 2 ( B 2 ) } = m i n { 3 + 5 8 + 3 } = 8 , f_3(C_2)=min\left\{ \begin{array}{lcl} d(B_1,C_2)+f_2(B_1)\\ d(B_2,C_2)+f_2(B_2) \end{array} \right\} = min\left\{ \begin{array}{lcl} 3+5\\ 8+3 \end{array} \right\}=8, f3(C2)=min{d(B1,C2)+f2(B1)d(B2,C2)+f2(B2)}=min{3+58+3}=8,

f 3 ( C 3 ) = m i n { d ( B 1 , C 3 ) + f 4 ( B 1 ) d ( B 2 , C 3 ) + f 4 ( B 2 ) } = m i n { 6 + 5 7 + 3 } = 10 , f_3(C_3)=min\left\{ \begin{array}{lcl} d(B_1,C_3)+f_4(B_1)\\ d(B_2,C_3)+f_4(B_2) \end{array} \right\} = min\left\{ \begin{array}{lcl} 6+5\\ 7+3 \end{array} \right\}=10, f3(C3)=min{d(B1,C3)+f4(B1)d(B2,C3)+f4(B2)}=min{6+57+3}=10

f 3 ( C 4 ) = d ( B 2 , C 4 ) + f 2 ( B 2 ) = 6 + 3 = 9. f_3(C_4)=d(B_2,C_4)+f_2(B_2)=6+3=9. f3(C4)=d(B2,C4)+f2(B2)=6+3=9.

  (3)当 k = 4 k=4 k=4时,按 f 4 f_4 f4的定义分别有
f 4 ( D 1 ) = m i n { d ( C 1 , D 1 ) + f 3 ( C 1 ) d ( C 2 , D 1 ) + f 3 ( C 2 ) } = m i n { 6 + 6 3 + 8 } = 11 , f_4(D_1)=min\left\{ \begin{array}{lcl} d(C_1,D_1)+f_3(C_1) \\ d(C_2,D_1)+f_3(C_2) \end{array} \right\} = min\left\{ \begin{array}{lcl} 6+6 \\ 3+8 \end{array} \right\}=11, f4(D1)=min{d(C1,D1)+f3(C1)d(C2,D1)+f3(C2)}=min{6+63+8}=11,

f 4 ( D 2 ) = m i n { d ( C 1 , D 2 ) + f 3 ( C 1 ) d ( C 2 , D 2 ) + f 3 ( C 2 ) d ( C 3 , D 2 ) + f 3 ( C 3 ) d ( C 4 , D 2 ) + f 3 ( C 4 ) } = m i n { 8 + 6 5 + 8 3 + 10 8 + 9 } = 13 , f_4(D_2)=min\left\{ \begin{array}{lcl} d(C_1,D_2)+f_3(C_1) \\ d(C_2,D_2)+f_3(C_2) \\ d(C_3,D_2)+f_3(C_3) \\ d(C_4,D_2)+f_3(C_4) \end{array} \right\} = min\left\{ \begin{array}{lcl} 8+6 \\ 5+8 \\ 3+10 \\ 8+9 \end{array} \right\}=13, f4(D2)=mind(C1,D2)+f3(C1)d(C2,D2)+f3(C2)d(C3,D2)+f3(C3)d(C4,D2)+f3(C4)=min8+65+83+108+9=13,

f 4 ( D 3 ) = m i n { d ( C 3 , D 3 ) + f 3 ( C 3 d ( C 4 , D 3 ) + f 3 ( C 4 ) } = m i n { 3 + 10 4 + 9 } = 13 , f_4(D_3)=min\left\{ \begin{array}{lcl} d(C_3,D_3)+f_3(C_3 \\ d(C_4,D_3)+f_3(C_4) \end{array} \right\} = min\left\{ \begin{array}{lcl} 3+10 \\ 4+9 \end{array} \right\}=13, f4(D3)=min{d(C3,D3)+f3(C3d(C4,D3)+f3(C4)}=min{3+104+9}=13,

  (4)当 k = 5 k=5 k=5时,按 f 5 f_5 f5的定义有
f 5 ( E ) = m i n { d ( D 1 , E ) + f 4 ( D 1 ) d ( D 2 , E ) + f 4 ( D 2 ) d ( D 3 , E ) + f 4 ( D 3 ) } = m i n { 3 + 11 2 + 13 2 + 13 } = 14 , f_5(E)=min\left\{ \begin{array}{lcl} d(D_1,E)+f_4(D_1) \\ d(D_2,E)+f_4(D_2) \\ d(D_3,E)+f_4(D_3) \end{array} \right\} = min\left\{ \begin{array}{lcl} 3+11 \\ 2+13 \\ 2+13 \end{array} \right\}=14, f5(E)=mind(D1,E)+f4(D1)d(D2,E)+f4(D2)d(D3,E)+f4(D3)=min3+112+132+13=14,
f 5 ( E ) = 14 f_5(E)=14 f5(E)=14为所求的最短弧长,路径为 A → B 1 → C 2 → D 1 → E A \rightarrow B_1 \rightarrow C_2 \rightarrow D_1 \rightarrow E AB1C2D1E,决策为 u 1 ( A ) = B 1 u_1(A)=B_1 u1(A)=B1 u 2 ( B 1 ) = C 2 u_2(B_1)=C_2 u2(B1)=C2 u 3 ( C 2 ) = D 1 u_3(C_2)=D_1 u3(C2)=D1 u 4 ( D 1 ) = E u_4(D_1)=E u4(D1)=E,与逆序解法的结果完全一样。

  上述解法也可写成统一的递推公式形式:
{ f k ( x k ) = min ⁡ u k − 1 ∈ D k − 1 { d ( u k − 1 , x k ) + f k − 1 ( x k − 1 ) } ; f 1 ( x 1 ) = 0 , k = 2 , 3 , 4 , 5. \left\{ \begin{array}{lcl} f_k(x_k) = \min \limits_{u_{k-1} \in D_{k-1}} \{ d(u_{k-1},x_k) + f_{k-1}(x_{k-1})\} ;\\ f_1(x_1)=0, k=2,3,4,5. \end{array} \right. {fk(xk)=uk1Dk1min{d(uk1,xk)+fk1(xk1)};f1(x1)=0,k=2,3,4,5.
其中 x k − 1 = u k − 1 ( x k ) x_{k-1}=u_{k-1}(x_k) xk1=uk1(xk),即从第 k k k阶段的起点状态 x k x_k xk通过 u k − 1 u_{k-1} uk1去寻找第 k − 1 k-1 k1阶段的起点 x k − 1 x_{k-1} xk1 f 1 ( x 1 ) = 0 f_1(x_1)=0 f1(x1)=0称为边界条件。

  由于这种算法的寻优方向与过程的行进方向相同,故称顺序解法


  1. 后部最优指标函数 ↩︎

  2. 前部最优指标函数 ↩︎

  3. 最优化原理 ↩︎

;