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+xk∞whenxkwhenxkwhenxk=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.5∗vk
故第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=vk−1+xk−dk,且有vk−1>=0,即xk≤vk+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)+yk−1(vk+dk−xk)],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)=0≤x2≤3min[S1(x2)+S2(0)+y(3−x2)]=min⎣⎢⎢⎡S1(0)+S2(0)+y1(3)S1(1)+S2(0)+y1(2)S1(2)+S2(0)+y1(1)S1(3)+S2(0)+y1(0)⎦⎥⎥⎤=min⎣⎢⎢⎡0+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)=0≤x2≤4min[S1(x2)+S2(1)+y(4−x2)]=min⎣⎢⎢⎢⎢⎡S1(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)⎦⎥⎥⎥⎥⎤=min⎣⎢⎢⎢⎢⎡0+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)=0≤x2≤5min[S1(x2)+S2(2)+y(5−x2)]=min⎣⎢⎢⎢⎢⎢⎢⎡S1(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)⎦⎥⎥⎥⎥⎥⎥⎤=min⎣⎢⎢⎢⎢⎢⎢⎡0+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)=0≤x2≤6min[S1(x2)+S2(3)+y(6−x2)]=min⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡S1(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)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤=min⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡0+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+2−x3)]其中σ3=min(v3+2,6),对v3在0至min[4,6−2]=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)=0≤x3≤2min[S1(x3)+S2(0)+y(2−x3)]=min⎣⎡S1(0)+S2(0)+y2(2)S1(1)+S2(0)+y2(1)S1(2)+S2(0)+y2(0)⎦⎤=min⎣⎡0+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)=0≤x3≤3min[S1(x3)+S2(1)+y(3−x3)]=min⎣⎢⎢⎡S1(0)+S2(1)+y2(3)S1(1)+S2(1)+y2(2)S1(2)+S2(1)+y2(1)S1(3)+S2(1)+y2(0)⎦⎥⎥⎤=min⎣⎢⎢⎡0+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)=0≤x3≤3min[S1(x3)+S2(2)+y(4−x3)]=min⎣⎢⎢⎢⎢⎡S1(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)⎦⎥⎥⎥⎥⎤=min⎣⎢⎢⎢⎢⎡0+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)=0≤x3≤5min[S1(x3)+S2(3)+y(5−x3)]=min⎣⎢⎢⎢⎢⎢⎢⎡S1(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)⎦⎥⎥⎥⎥⎥⎥⎤=min⎣⎢⎢⎢⎢⎢⎢⎡0+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)=0≤x3≤6min[S1(x3)+S2(4)+y(6−x3)]=min⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡S1(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)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤=min⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡0+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)=0≤x4≤4min[S1(x4)+S2(0)+y(4−x4)]=min⎣⎢⎢⎢⎢⎡S1(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)⎦⎥⎥⎥⎥⎤=min⎣⎢⎢⎢⎢⎡0+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,整理可得
时期k | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
需求量 | - | 2 | 3 | 2 | 4 |
生产量 | - | 5 | 0 | 6 | 0 |
库存量 | 0 | 3 | 0 | 4 | 0 |
2. 用动态规划方法编程求解下面的问题:(状压dp)
问题分析:
从顶点v1出发,经过v2到v6的城市各一次后返回顶点v1,设dp[i,V]表示从顶点vi出发,经过集合V中所有顶点各一次后返回出发点vi的最短路径的长度。
- 当V为空集时,即从vi直接回到v1,dp[i,V] = D[i,v1]
- 当V不为空集时,可以把问题转化为对子问题的求解。d[i,V]=min(D[i,k]+dp[k,V-(k)])
注:其中D[i,j]表示邻接矩阵
- 其中集合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 k∈V,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)
程序运行结果: