动态规划方法手工求解生产存储问题、动态规划方法编程求解旅行商问题


Assignment 1

1. 用动态规划方法手工求解下面的问题

在这里插入图片描述

解:该问题是一个多阶段决策过程最优化问题,共有 k 个阶段,本问题中 k = 1,2,3,4

状态变量: 每个月生产产品数量 xk , 总成本y,生产成本 S1,存储费用S2,产品需求量d =[ 2,3,2,4 ]

按照四个时期将问题划分成四个阶段,可得生产成本y1的表达式为:
S 1 ( x ) = { 0 w h e n x k = 0 3 + x k w h e n x k = 1 , 2 , 3 , 4 , 5 , 6 ∞ w h e n x k > 6 S_1(x)=\left\{ \begin{aligned} & 0 &\quad when\quad x_k&=0\\ & 3+x_k & when\quad x_k&=1,2,3,4,5,6\\ & \infty & when\quad x_k&>6 \end{aligned} \right. S1(x)=03+xkwhenxkwhenxkwhenxk=0=1,2,3,4,5,6>6
第k阶段库存量为vk时,存储费用y2
S 2 ( v k ) = 0.5 ∗ v k \begin{aligned} S_2(v_k) = 0.5*v_k \end{aligned} S2(vk)=0.5vk
故第k时期的总成本为
y = S 1 ( x k ) + S 2 ( v k ) \begin{aligned} y = S_1(x_k)+S_2(v_k) \end{aligned} y=S1(xk)+S2(vk)
有状态转移方程
v k = v k − 1 + x k − d k , 且 有 v k − 1 > = 0 , 即 x k ≤ v k + d k v_k = v_{k-1}+x_k-d_k ,\quad且有\quad v_{k-1}>=0,\quad即\quad x_k\leq v_k+d_k vk=vk1+xkdk,vk1>=0,xkvk+dk

y k ( v k ) = min ⁡ 0 < x k < σ k [ S 1 ( x k ) + S 2 ( v k ) + y k − 1 ( v k + d k − x k ) ] , k = 2 , 3 , 4 y_k(v_k) = \min\limits_{0<x_k<\sigma_k}[S_1(x_{k})+S_2(v_{k})+y_{k-1}(v_k+d_k-x_k)], \quad k=2,3,4 yk(vk)=0<xk<σkmin[S1(xk)+S2(vk)+yk1(vk+dkxk)],k=2,3,4

σ k = min ⁡ ( v k + d k , 6 ) \sigma_k =\min(v_k+d_k,6) σk=min(vk+dk,6)

**手工求解:**初始边界条件
y 1 ( v 1 ) = min ⁡ x 1 = min ⁡ ( v 1 + 2 , 6 ) [ S 1 ( x 1 ) + S 2 ( v 1 ) ] y_1(v_1) = \min\limits_{x_1 = \min(v_1+2,6)}[S_1(x_1)+S_2(v_1)] y1(v1)=x1=min(v1+2,6)min[S1(x1)+S2(v1)]
· 当k=1时,对v1在0至min(9,6-2) =4之间的值分别计算

v1=0时, x1=2 y1(0) = 3+2+0.5*0 = 5

v1=1时, x1=3 y1(1) = 3+3+0.5*1 = 6.5

v1=2时, x1=4 y1(2) = 3+4+0.5*2 = 8

v1=3时, x1=5 y1(3) = 3+5+0.5*3 = 9.5

v1=4时, x1=6 y1(4) = 3+6+0.5*4 =11

· 当k=2时,d2=3, 对v2在0至min(6,6-3) =3之间的值分别计算

y 2 ( 0 ) = min ⁡ 0 ≤ x 2 ≤ 3 [ S 1 ( x 2 ) + S 2 ( 0 ) + y ( 3 − x 2 ) ] = min ⁡ [ S 1 ( 0 ) + S 2 ( 0 ) + y 1 ( 3 ) S 1 ( 1 ) + S 2 ( 0 ) + y 1 ( 2 ) S 1 ( 2 ) + S 2 ( 0 ) + y 1 ( 1 ) S 1 ( 3 ) + S 2 ( 0 ) + y 1 ( 0 ) ] = min ⁡ [ 0 + 0 + 9.5 = 9.5 4 + 0 + 8 = 12 5 + 0 + 6.5 = 11.5 6 + 0 + 5 = 11 ] = 9.5 \begin{aligned} y_2(0)&=\min\limits_{0\le x_2\le 3}[S_1(x_2)+S_2(0)+y(3-x_2)]\\ &=\min \begin{bmatrix} S_1(0)+S_2(0)+y_1(3)\\ S_1(1)+S_2(0)+y_1(2)\\ S_1(2)+S_2(0)+y_1(1)\\ S_1(3)+S_2(0)+y_1(0) \end{bmatrix}=\min \begin{bmatrix} 0+0+9.5&=&9.5\\ 4+0+8&=&12\\ 5+0+6.5&=&11.5\\ 6+0+5&=&11 \end{bmatrix}=9.5 \end{aligned} y2(0)=0x23min[S1(x2)+S2(0)+y(3x2)]=minS1(0)+S2(0)+y1(3)S1(1)+S2(0)+y1(2)S1(2)+S2(0)+y1(1)S1(3)+S2(0)+y1(0)=min0+0+9.54+0+85+0+6.56+0+5====9.51211.511=9.5

y 2 ( 1 ) = min ⁡ 0 ≤ x 2 ≤ 4 [ S 1 ( x 2 ) + S 2 ( 1 ) + y ( 4 − x 2 ) ] = min ⁡ [ S 1 ( 0 ) + S 2 ( 1 ) + y 1 ( 4 ) S 1 ( 1 ) + S 2 ( 1 ) + y 1 ( 3 ) S 1 ( 2 ) + S 2 ( 1 ) + y 1 ( 2 ) S 1 ( 3 ) + S 2 ( 1 ) + y 1 ( 1 ) S 1 ( 4 ) + S 2 ( 1 ) + y 1 ( 0 ) ] = min ⁡ [ 0 + 0.5 + 11 = 11.5 4 + 0.5 + 9.5 = 14 5 + 0.5 + 8 = 13.5 6 + 0.5 + 6.5 = 13 7 + 0.5 + 5 = 12.5 ] = 11.5 \begin{aligned} y_2(1)&=\min\limits_{0\le x_2\le 4}[S_1(x_2)+S_2(1)+y(4-x_2)]\\ &=\min \begin{bmatrix} S_1(0)+S_2(1)+y_1(4)\\ S_1(1)+S_2(1)+y_1(3)\\ S_1(2)+S_2(1)+y_1(2)\\ S_1(3)+S_2(1)+y_1(1)\\ S_1(4)+S_2(1)+y_1(0)\\ \end{bmatrix}=\min \begin{bmatrix} 0+0.5+11&=&11.5\\ 4+0.5+9.5&=&14\\ 5+0.5+8&=&13.5\\ 6+0.5+6.5&=&13\\ 7+0.5+5&=&12.5\\ \end{bmatrix}=11.5 \end{aligned} y2(1)=0x24min[S1(x2)+S2(1)+y(4x2)]=minS1(0)+S2(1)+y1(4)S1(1)+S2(1)+y1(3)S1(2)+S2(1)+y1(2)S1(3)+S2(1)+y1(1)S1(4)+S2(1)+y1(0)=min0+0.5+114+0.5+9.55+0.5+86+0.5+6.57+0.5+5=====11.51413.51312.5=11.5

y 2 ( 2 ) = min ⁡ 0 ≤ x 2 ≤ 5 [ S 1 ( x 2 ) + S 2 ( 2 ) + y ( 5 − x 2 ) ] = min ⁡ [ S 1 ( 0 ) + S 2 ( 2 ) + y 1 ( 5 ) S 1 ( 1 ) + S 2 ( 2 ) + y 1 ( 4 ) S 1 ( 2 ) + S 2 ( 2 ) + y 1 ( 3 ) S 1 ( 3 ) + S 2 ( 2 ) + y 1 ( 2 ) S 1 ( 4 ) + S 2 ( 2 ) + y 1 ( 1 ) S 1 ( 5 ) + S 2 ( 2 ) + y 1 ( 0 ) ] = min ⁡ [ 0 + 1 + ∞ = ∞ 4 + 1 + 11 = 16 5 + 1 + 9.5 = 15.5 6 + 1 + 8 = 15 7 + 1 + 6.5 = 14.5 8 + 1 + 5 = 14 ] = 14 \begin{aligned} y_2(2)&=\min\limits_{0\le x_2\le 5}[S_1(x_2)+S_2(2)+y(5-x_2)]\\ &=\min \begin{bmatrix} S_1(0)+S_2(2)+y_1(5)\\ S_1(1)+S_2(2)+y_1(4)\\ S_1(2)+S_2(2)+y_1(3)\\ S_1(3)+S_2(2)+y_1(2)\\ S_1(4)+S_2(2)+y_1(1)\\ S_1(5)+S_2(2)+y_1(0)\\ \end{bmatrix}=\min \begin{bmatrix} 0+1+\infty&=&\infty\\ 4+1+11&=&16\\ 5+1+9.5&=&15.5\\ 6+1+8&=&15\\ 7+1+6.5&=&14.5\\ 8+1+5&=&14\\ \end{bmatrix}=14 \end{aligned} y2(2)=0x25min[S1(x2)+S2(2)+y(5x2)]=minS1(0)+S2(2)+y1(5)S1(1)+S2(2)+y1(4)S1(2)+S2(2)+y1(3)S1(3)+S2(2)+y1(2)S1(4)+S2(2)+y1(1)S1(5)+S2(2)+y1(0)=min0+1+4+1+115+1+9.56+1+87+1+6.58+1+5======1615.51514.514=14

y 2 ( 3 ) = min ⁡ 0 ≤ x 2 ≤ 6 [ S 1 ( x 2 ) + S 2 ( 3 ) + y ( 6 − x 2 ) ] = min ⁡ [ S 1 ( 0 ) + S 2 ( 3 ) + y 1 ( 6 ) S 1 ( 1 ) + S 2 ( 3 ) + y 1 ( 5 ) S 1 ( 2 ) + S 2 ( 3 ) + y 1 ( 4 ) S 1 ( 3 ) + S 2 ( 3 ) + y 1 ( 3 ) S 1 ( 4 ) + S 2 ( 3 ) + y 1 ( 2 ) S 1 ( 5 ) + S 2 ( 3 ) + y 1 ( 1 ) S 1 ( 6 ) + S 2 ( 3 ) + y 1 ( 0 ) ] = min ⁡ [ 0 + 1.5 + ∞ = ∞ 4 + 1.5 + ∞ = ∞ 5 + 1.5 + 11 = 17.5 6 + 1.5 + 9.5 = 17 7 + 1.5 + 8 = 16.5 8 + 1.5 + 6.5 = 16 9 + 1.5 + 5 = 15.5 ] = 15.5 \begin{aligned} y_2(3)&=\min\limits_{0\le x_2\le 6}[S_1(x_2)+S_2(3)+y(6-x_2)]\\ &=\min \begin{bmatrix} S_1(0)+S_2(3)+y_1(6)\\ S_1(1)+S_2(3)+y_1(5)\\ S_1(2)+S_2(3)+y_1(4)\\ S_1(3)+S_2(3)+y_1(3)\\ S_1(4)+S_2(3)+y_1(2)\\ S_1(5)+S_2(3)+y_1(1)\\ S_1(6)+S_2(3)+y_1(0)\\ \end{bmatrix}=\min \begin{bmatrix} 0+1.5+\infty&=&\infty\\ 4+1.5+\infty&=&\infty\\ 5+1.5+11&=&17.5\\ 6+1.5+9.5&=&17\\ 7+1.5+8&=&16.5\\ 8+1.5+6.5&=&16\\ 9+1.5+5&=&15.5\\ \end{bmatrix}=15.5 \end{aligned} y2(3)=0x26min[S1(x2)+S2(3)+y(6x2)]=minS1(0)+S2(3)+y1(6)S1(1)+S2(3)+y1(5)S1(2)+S2(3)+y1(4)S1(3)+S2(3)+y1(3)S1(4)+S2(3)+y1(2)S1(5)+S2(3)+y1(1)S1(6)+S2(3)+y1(0)=min0+1.5+4+1.5+5+1.5+116+1.5+9.57+1.5+88+1.5+6.59+1.5+5=======17.51716.51615.5=15.5

· 当k=3时,d3=2
y 3 ( v 3 ) = min ⁡ 0 < x k < σ 3 [ S 1 ( x 3 ) + S 2 ( v 3 ) + y 2 ( v 3 + 2 − x 3 ) ] 其 中 σ 3 = min ⁡ ( v 3 + 2 , 6 ) , 对 v 3 在 0 至 min ⁡ [ 4 , 6 − 2 ] = 4 之 前 取 值 y_3(v_3) = \min\limits_{0<x_k<\sigma_3}[S_1(x_{3})+S_2(v_{3})+y_{2}(v_3+2-x_3)] \\其中 \sigma_3=\min(v_3+2,6),对v_3在0至\min[4,6-2]=4之前取值 y3(v3)=0<xk<σ3min[S1(x3)+S2(v3)+y2(v3+2x3)]σ3=min(v3+2,6),v30min[4,62]=4

y 3 ( 0 ) = min ⁡ 0 ≤ x 3 ≤ 2 [ S 1 ( x 3 ) + S 2 ( 0 ) + y ( 2 − x 3 ) ] = min ⁡ [ S 1 ( 0 ) + S 2 ( 0 ) + y 2 ( 2 ) S 1 ( 1 ) + S 2 ( 0 ) + y 2 ( 1 ) S 1 ( 2 ) + S 2 ( 0 ) + y 2 ( 0 ) ] = min ⁡ [ 0 + 0 + 14 = 14 4 + 0 + 11.5 = 15.5 5 + 0 + 9.5 = 14.5 ] = 14 \begin{aligned} y_3(0)&=\min\limits_{0\le x_3\le 2}[S_1(x_3)+S_2(0)+y(2-x_3)]\\ &=\min \begin{bmatrix} S_1(0)+S_2(0)+y_2(2)\\ S_1(1)+S_2(0)+y_2(1)\\ S_1(2)+S_2(0)+y_2(0)\\ \end{bmatrix}=\min \begin{bmatrix} 0+0+14&=&14\\ 4+0+11.5&=&15.5\\ 5+0+9.5&=&14.5\\ \end{bmatrix}=14 \end{aligned} y3(0)=0x32min[S1(x3)+S2(0)+y(2x3)]=minS1(0)+S2(0)+y2(2)S1(1)+S2(0)+y2(1)S1(2)+S2(0)+y2(0)=min0+0+144+0+11.55+0+9.5===1415.514.5=14

y 3 ( 1 ) = min ⁡ 0 ≤ x 3 ≤ 3 [ S 1 ( x 3 ) + S 2 ( 1 ) + y ( 3 − x 3 ) ] = min ⁡ [ S 1 ( 0 ) + S 2 ( 1 ) + y 2 ( 3 ) S 1 ( 1 ) + S 2 ( 1 ) + y 2 ( 2 ) S 1 ( 2 ) + S 2 ( 1 ) + y 2 ( 1 ) S 1 ( 3 ) + S 2 ( 1 ) + y 2 ( 0 ) ] = min ⁡ [ 0 + 0.5 + 15.5 = 16 4 + 0.5 + 14 = 18.5 5 + 0.5 + 11.5 = 17 6 + 0.5 + 9.5 = 16 ] = 16 \begin{aligned} y_3(1)&=\min\limits_{0\le x_3\le 3}[S_1(x_3)+S_2(1)+y(3-x_3)]\\ &=\min \begin{bmatrix} S_1(0)+S_2(1)+y_2(3)\\ S_1(1)+S_2(1)+y_2(2)\\ S_1(2)+S_2(1)+y_2(1)\\ S_1(3)+S_2(1)+y_2(0)\\ \end{bmatrix}=\min \begin{bmatrix} 0+0.5+15.5&=&16\\ 4+0.5+14&=&18.5\\ 5+0.5+11.5&=&17\\ 6+0.5+9.5&=&16\\ \end{bmatrix}=16 \end{aligned} y3(1)=0x33min[S1(x3)+S2(1)+y(3x3)]=minS1(0)+S2(1)+y2(3)S1(1)+S2(1)+y2(2)S1(2)+S2(1)+y2(1)S1(3)+S2(1)+y2(0)=min0+0.5+15.54+0.5+145+0.5+11.56+0.5+9.5====1618.51716=16

y 3 ( 2 ) = min ⁡ 0 ≤ x 3 ≤ 3 [ S 1 ( x 3 ) + S 2 ( 2 ) + y ( 4 − x 3 ) ] = min ⁡ [ S 1 ( 0 ) + S 2 ( 2 ) + y 2 ( 4 ) S 1 ( 1 ) + S 2 ( 2 ) + y 2 ( 3 ) S 1 ( 2 ) + S 2 ( 2 ) + y 2 ( 2 ) S 1 ( 3 ) + S 2 ( 2 ) + y 2 ( 1 ) S 1 ( 4 ) + S 2 ( 2 ) + y 2 ( 0 ) ] = min ⁡ [ 0 + 1 + ∞ = ∞ 4 + 1 + 15.5 = 19.5 5 + 1 + 14 = 20 6 + 1 + 11.5 = 18.5 7 + 1 + 9.5 = 17.5 ] = 17.5 \begin{aligned} y_3(2)&=\min\limits_{0\le x_3\le 3}[S_1(x_3)+S_2(2)+y(4-x_3)]\\ &=\min \begin{bmatrix} S_1(0)+S_2(2)+y_2(4)\\ S_1(1)+S_2(2)+y_2(3)\\ S_1(2)+S_2(2)+y_2(2)\\ S_1(3)+S_2(2)+y_2(1)\\ S_1(4)+S_2(2)+y_2(0)\\ \end{bmatrix}=\min \begin{bmatrix} 0+1+\infty&=&\infty\\ 4+1+15.5&=&19.5\\ 5+1+14&=&20\\ 6+1+11.5&=&18.5\\ 7+1+9.5&=&17.5\\ \end{bmatrix}=17.5 \end{aligned} y3(2)=0x33min[S1(x3)+S2(2)+y(4x3)]=minS1(0)+S2(2)+y2(4)S1(1)+S2(2)+y2(3)S1(2)+S2(2)+y2(2)S1(3)+S2(2)+y2(1)S1(4)+S2(2)+y2(0)=min0+1+4+1+15.55+1+146+1+11.57+1+9.5=====19.52018.517.5=17.5

y 3 ( 3 ) = min ⁡ 0 ≤ x 3 ≤ 5 [ S 1 ( x 3 ) + S 2 ( 3 ) + y ( 5 − x 3 ) ] = min ⁡ [ S 1 ( 0 ) + S 2 ( 3 ) + y 2 ( 5 ) S 1 ( 1 ) + S 2 ( 3 ) + y 2 ( 4 ) S 1 ( 2 ) + S 2 ( 3 ) + y 2 ( 3 ) S 1 ( 3 ) + S 2 ( 3 ) + y 2 ( 2 ) S 1 ( 4 ) + S 2 ( 3 ) + y 2 ( 1 ) S 1 ( 5 ) + S 2 ( 3 ) + y 2 ( 0 ) ] = min ⁡ [ 0 + 1.5 + ∞ = ∞ 4 + 1.5 + ∞ = ∞ 5 + 1.5 + 15.5 = 22 6 + 1.5 + 14 = 21.5 7 + 1.5 + 11.5 = 20 8 + 1.5 + 9.5 = 19 ] = 19 \begin{aligned} y_3(3)&=\min\limits_{0\le x_3\le 5}[S_1(x_3)+S_2(3)+y(5-x_3)]\\ &=\min \begin{bmatrix} S_1(0)+S_2(3)+y_2(5)\\ S_1(1)+S_2(3)+y_2(4)\\ S_1(2)+S_2(3)+y_2(3)\\ S_1(3)+S_2(3)+y_2(2)\\ S_1(4)+S_2(3)+y_2(1)\\ S_1(5)+S_2(3)+y_2(0)\\ \end{bmatrix}=\min \begin{bmatrix} 0+1.5+\infty&=&\infty\\ 4+1.5+\infty&=&\infty\\ 5+1.5+15.5&=&22\\ 6+1.5+14&=&21.5\\ 7+1.5+11.5&=&20\\ 8+1.5+9.5&=&19\\ \end{bmatrix}=19 \end{aligned} y3(3)=0x35min[S1(x3)+S2(3)+y(5x3)]=minS1(0)+S2(3)+y2(5)S1(1)+S2(3)+y2(4)S1(2)+S2(3)+y2(3)S1(3)+S2(3)+y2(2)S1(4)+S2(3)+y2(1)S1(5)+S2(3)+y2(0)=min0+1.5+4+1.5+5+1.5+15.56+1.5+147+1.5+11.58+1.5+9.5======2221.52019=19

y 3 ( 4 ) = min ⁡ 0 ≤ x 3 ≤ 6 [ S 1 ( x 3 ) + S 2 ( 4 ) + y ( 6 − x 3 ) ] = min ⁡ [ S 1 ( 0 ) + S 2 ( 4 ) + y 2 ( 6 ) S 1 ( 1 ) + S 2 ( 4 ) + y 2 ( 5 ) S 1 ( 2 ) + S 2 ( 4 ) + y 2 ( 4 ) S 1 ( 3 ) + S 2 ( 4 ) + y 2 ( 3 ) S 1 ( 4 ) + S 2 ( 4 ) + y 2 ( 2 ) S 1 ( 5 ) + S 2 ( 4 ) + y 2 ( 1 ) S 1 ( 6 ) + S 2 ( 4 ) + y 2 ( 0 ) ] = min ⁡ [ 0 + 2 + ∞ = ∞ 4 + 2 + ∞ = ∞ 5 + 2 + ∞ = ∞ 6 + 2 + 15.5 = 23.5 7 + 2 + 14 = 23 8 + 2 + 11.5 = 21.5 9 + 2 + 9.5 = 20.5 ] = 20.5 \begin{aligned} y_3(4)&=\min\limits_{0\le x_3\le 6}[S_1(x_3)+S_2(4)+y(6-x_3)]\\ &=\min \begin{bmatrix} S_1(0)+S_2(4)+y_2(6)\\ S_1(1)+S_2(4)+y_2(5)\\ S_1(2)+S_2(4)+y_2(4)\\ S_1(3)+S_2(4)+y_2(3)\\ S_1(4)+S_2(4)+y_2(2)\\ S_1(5)+S_2(4)+y_2(1)\\ S_1(6)+S_2(4)+y_2(0)\\ \end{bmatrix}=\min \begin{bmatrix} 0+2+\infty&=&\infty\\ 4+2+\infty&=&\infty\\ 5+2+\infty&=&\infty\\ 6+2+15.5&=&23.5\\ 7+2+14&=&23\\ 8+2+11.5&=&21.5\\ 9+2+9.5&=&20.5\\ \end{bmatrix}=20.5 \end{aligned} y3(4)=0x36min[S1(x3)+S2(4)+y(6x3)]=minS1(0)+S2(4)+y2(6)S1(1)+S2(4)+y2(5)S1(2)+S2(4)+y2(4)S1(3)+S2(4)+y2(3)S1(4)+S2(4)+y2(2)S1(5)+S2(4)+y2(1)S1(6)+S2(4)+y2(0)=min0+2+4+2+5+2+6+2+15.57+2+148+2+11.59+2+9.5=======23.52321.520.5=20.5

· 当k=4时,d4=4,v4=0
y 4 ( 4 ) = min ⁡ 0 ≤ x 4 ≤ 4 [ S 1 ( x 4 ) + S 2 ( 0 ) + y ( 4 − x 4 ) ] = min ⁡ [ S 1 ( 0 ) + S 2 ( 0 ) + y 3 ( 4 ) S 1 ( 1 ) + S 2 ( 0 ) + y 3 ( 3 ) S 1 ( 2 ) + S 2 ( 4 ) + y 3 ( 2 ) S 1 ( 3 ) + S 2 ( 4 ) + y 3 ( 1 ) S 1 ( 4 ) + S 2 ( 4 ) + y 3 ( 0 ) ] = min ⁡ [ 0 + 0 + 20.5 = 20.5 4 + 0 + 19 = 23 5 + 0 + 17.5 = 22.5 6 + 0 + 16 = 22 7 + 0 + 14 = 21 ] = 20.5 \begin{aligned} y_4(4)&=\min\limits_{0\le x_4\le 4}[S_1(x_4)+S_2(0)+y(4-x_4)]\\ &=\min \begin{bmatrix} S_1(0)+S_2(0)+y_3(4)\\ S_1(1)+S_2(0)+y_3(3)\\ S_1(2)+S_2(4)+y_3(2)\\ S_1(3)+S_2(4)+y_3(1)\\ S_1(4)+S_2(4)+y_3(0)\\ \end{bmatrix}=\min \begin{bmatrix} 0+0+20.5&=&20.5\\ 4+0+19&=&23\\ 5+0+17.5&=&22.5\\ 6+0+16&=&22\\ 7+0+14&=&21\\ \end{bmatrix}=20.5 \end{aligned} y4(4)=0x44min[S1(x4)+S2(0)+y(4x4)]=minS1(0)+S2(0)+y3(4)S1(1)+S2(0)+y3(3)S1(2)+S2(4)+y3(2)S1(3)+S2(4)+y3(1)S1(4)+S2(4)+y3(0)=min0+0+20.54+0+195+0+17.56+0+167+0+14=====20.52322.52221=20.5
可得最小成本为20.5千元,反推可得x4=0,x3=6,x2=0,x1=5,整理可得

时期k01234
需求量-2324
生产量-5060
库存量03040

2. 用动态规划方法编程求解下面的问题:(状压dp)

在这里插入图片描述

问题分析:

从顶点v1出发,经过v2到v6的城市各一次后返回顶点v1,设dp[i,V]表示从顶点vi出发,经过集合V中所有顶点各一次后返回出发点vi的最短路径的长度。

  1. 当V为空集时,即从vi直接回到v1,dp[i,V] = D[i,v1]
  2. 当V不为空集时,可以把问题转化为对子问题的求解。d[i,V]=min(D[i,k]+dp[k,V-(k)])

注:其中D[i,j]表示邻接矩阵

  1. 其中集合V的状态共有24种,即16种集合V,dp数组的第二维要开16的大小来保存集合状态。而有关集合与dp数组下标的映射关系为:设当前集合中有vi则对应的第i位为1,计算集合对应的下标。例如,V={v1,v2}, 则对应二进制为00011,即映射到数组中下标3的位置。

由以上的分析可知动态规划状态转移方程为
d p ( i , V ) = { D [ i , v 1 ] , V = ∅ , i ≠ v   1   min ⁡ { D [ i , k ] + d p ( k , V − { k } ) } , k ∈ V , V ≠ ∅ dp(i,V)=\left\{ \begin{aligned} D[i,v_1]&,&V=\empty,i\ne v~1~\\ \min \{{D[i,k]}+dp(k,V-\{k\})\}&,&k\in V,V\ne \empty \end{aligned} \right. dp(i,V)={D[i,v1]min{D[i,k]+dp(k,V{k})},,V=,i=v 1 kV,V=


核心算法伪代码:

void Tsp_DP_Solution(vector<vector<int> >Dis){  // 其中Dis为邻接矩阵
    int len = Dis.size();
	int V = 1<<(len-1);// 状态压缩,将集合状态压缩至一维
	vector<vector<int> >dp(len,vector<int>(V)); //dp[i][j]表示从节点i出发,经过集合j中所有节点一次后返回i的最短距离
    for(int i=0;i<len;i++){  //初始化dp数组
        dp[i][0]=Dis[i][0];
    }
    for(int j=1;j<V;j++){
        for(int i=0;i<len;i++){
            dp[i][j]=1e9+10;
            if( ((j>>(i-1))&1)==1)  continue; //如果当前集合中有该顶点,不符合题意
            for(int k=1;k<len;k++){
                if(((j>>(k-1))&1)==0) continue;
                if( dp[i][j] > Dis[i][k] + dp[k][j^(1<<(k-1))]){
                    dp[i][j] = Dis[i][k] + dp[k][j^(1<<(k-1))];
                }
            }
        }
    }
    
    
}

程序实现与相关说明:

#include<iostream>
#include<vector>
#include<map>
#include<cstring>
using namespace std;
vector<vector<int> > Dis=
            {{0,10,20,30,40,50},
            {12,0,18,30,25,21},
            {23,19,0,5,10,15},
            {34,32,4,0,8,16},
            {45,27,11,10,0,18},
            {56,22,16,20,12,0}};
int len = Dis.size();  
int V = 1<<(len-1);
vector<vector<int> >dp(len,vector<int>(V));
vector<int> path;
void Tsp_DP_Solution(){ //动态规划求解结果
// init
    for(int i=0;i<len;i++){
        dp[i][0]=Dis[i][0];
    }
// 按照第二维遍历集合
    for(int j=1;j<V;j++){
        for(int i=0;i<len;i++){
            //如果当前集合中有该顶点,不符合题意
            dp[i][j]=1e9+10;
            if( ((j>>(i-1))&1)==1) continue;
            
            for(int k=1;k<len;k++){
                if(((j>>(k-1))&1)==0){
                    continue;
                }
                if( dp[i][j] > Dis[i][k] + dp[k][j^(1<<(k-1))]){
                    dp[i][j] = Dis[i][k] + dp[k][j^(1<<(k-1))];
                }
            }
        }
    }
}
vector<bool> vis(len); //求解最优路径时存储每个节点是否访问过
int main()
{
//------------------邻接矩阵设置--------------------------
    for(int i=0;i<len;i++){
        int tmp = Dis[i].size();
        for(int j=0;j<tmp;j++)  cout<<Dis[i][j]<<" ";
        cout<<endl;
    }//--------------------------------------

    Tsp_DP_Solution();
    cout<<"最短总行程为"<<dp[0][V-1]<<endl;
//----------------计算最优路径----------------------------
    int pre =0, minn = 1e9+7,S = V-1,tmp,cnt=1;
    path.push_back(0); //首先将起始节点入vector
    while(cnt<len){ // cnt用于记录选择点个数,边界条件
        for(int i=1;i<len;i++){
            if( vis[i]==false && (S&(1<<(i-1)))!=0 ){
                if(minn>Dis[i][pre]+dp[i][(S^(1<<(i-1)))]){
                    minn = Dis[i][pre]+dp[i][(S^(1<<(i-1)))];
                    tmp =i ;  // 找到没有加入集合中的距离最小的加入
               }
            }
        }
        pre=tmp;
        path.push_back(pre);
        vis[pre]=1;
        S = S^(1<<(pre - 1));
        minn = 1e9+7;
        cnt++;
    }
//----------------输出最优路径------------------------------
    cout<<"最优路径为:"<<endl;
    for(int i=0;i<path.size();i++)  cout<<path[i]<<"->";
    cout<<0;
    return 0;
}

时间复杂度分析:

设有n个地点,共有2n个状态,代码中存在三重循环部分复杂度最高。每个状态2n乘以n*n

时间复杂度为O(2nn2)

空间复杂度O(n*2n-1)

程序运行结果:
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值