求解传输问题(四) Modified Distribution算法
作者:互联网
Modified Distribution算法(MODI)其实可以看成是Stepping-Stone算法的变体,它和Stepping-Stone算法的主要区别在于MODI是通过数学表达式直接计算空单元格对总cost的变化情况,而不是先识别Loop
我们还是使用之前的例子:
三个Supply结点,其供应量为:
仓库 | 库存(Supply) |
---|---|
1. 堪萨斯 | 150 |
2. 奥马哈 | 175 |
3. 得梅因 | 275 |
Total | 600 |
三个Demand结点,其需求量为:
面粉厂 | 需求(Demand) |
---|---|
A. 芝加哥 | 200 |
B. 圣路易斯 | 100 |
C. 辛辛那提 | 300 |
Total | 600 |
路径的单位花销:
A.芝加哥 | B.圣路易斯 | C.辛辛那提 | |
1. 堪萨斯 | $6 | $8 | $10 |
2. 奥马哈 | $7 | $11 | $11 |
3. 得梅因 | $4 | $5 | $12 |
根据上面的已知量,采用Minimum-Cell-Cost算法,得到了如下表所示的初始解:
要进行MODI,我们需要对初始的TP表进行扩展,在表的外层添加
u
u
u列和
v
v
v行:
新增的
u
i
u_i
ui和
v
j
v_j
vj序列和具有分配值的单元格的单位花销构成这样的等式约束:
u
i
+
v
j
=
C
i
j
\begin{aligned} u_i+v_j=C_{ij} \end{aligned}
ui+vj=Cij
例如对于单元格1B,有:
u
1
+
v
B
=
C
1
B
=
8
\begin{aligned} u_1+v_B=C_{1B}=8 \end{aligned}
u1+vB=C1B=8
剩下的等式:
u
1
+
v
C
=
10
u
2
+
v
C
=
11
u
3
+
v
A
=
4
u
3
+
v
B
=
5
\begin{aligned} u_1+v_C=10 \\ u_2+v_C=11 \\ u_3+v_A=4 \\ u_3+v_B=5 \end{aligned}
u1+vC=10u2+vC=11u3+vA=4u3+vB=5
我们需要例用这五个等式计算出六个
u
i
u_i
ui和
v
j
v_j
vj的值;不过因为只有5个等式,我们必须手动把其中一个置零才能计算剩下的变量,一般就直接让
u
1
=
0
u_1=0
u1=0,然后就可以计算出剩下的变量值:
x
1
B
:
u
1
+
v
B
=
8
0
+
v
B
=
8
v
B
=
8
x
1
C
:
u
1
+
v
C
=
10
0
+
v
C
=
10
v
C
=
10
x
2
C
:
u
2
+
v
C
=
11
u
2
+
10
=
11
u
2
=
1
x
3
B
:
u
3
+
v
B
=
5
u
3
+
8
=
5
u
3
=
−
3
x
3
A
:
u
3
+
v
A
=
4
−
3
+
v
A
=
4
v
A
=
7
\begin{aligned} x_{1B}:u_1+v_B&=8 \\ 0+v_B&=8 \\ v_B&=8\\ x_{1C}:u_1+v_C&=10\\ 0+v_C&=10\\ v_C&=10\\ x_{2C}:u_2+v_C&=11 \\ u_2+10&=11 \\ u_2&=1 \\ x_{3B}:u_3+v_B&=5\\ u_3+8&=5 \\ u_3&=-3\\ x_3A:u_3+v_A&=4\\ -3+v_A&=4\\ v_A&=7\\ \end{aligned}
x1B:u1+vB0+vBvBx1C:u1+vC0+vCvCx2C:u2+vCu2+10u2x3B:u3+vBu3+8u3x3A:u3+vA−3+vAvA=8=8=8=10=10=10=11=11=1=5=5=−3=4=4=7
现在TP表如下表所示:
在计算出
u
i
u_i
ui和
v
j
v_j
vj序列后,我们可以使用下面的公式直接计算出空单元格重分配的单位cost变化值:
c
i
j
−
u
i
−
v
j
=
k
i
j
\begin{aligned} c_{ij}-u_i-v_j=k_{ij} \end{aligned}
cij−ui−vj=kij
对于当前TP表中的四个空单元格,我们运用这个公式计算一下:
x
1
A
:
k
1
A
=
c
1
A
−
u
1
−
v
A
=
6
−
0
−
7
=
−
1
x
2
A
:
k
2
A
=
c
2
A
−
u
2
−
v
A
=
7
−
1
−
7
=
−
1
x
2
B
:
k
2
B
=
c
2
B
−
u
2
−
v
B
=
11
−
1
−
8
=
+
2
x
3
C
:
k
3
C
=
c
3
C
−
u
3
−
v
C
=
12
−
(
−
3
)
−
10
=
+
5
\begin{aligned} x_{1A}: &k_{1A}=c_{1A}-u_1-v_A=6-0-7=-1\\ x_{2A}: &k_{2A}=c_{2A}-u_2-v_A=7-1-7=-1\\ x_{2B}: &k_{2B}=c_{2B}-u_2-v_B=11-1-8=+2\\ x_{3C}:&k_{3C}=c_{3C}-u_3-v_C=12-(-3)-10=+5 \end{aligned}
x1A:x2A:x2B:x3C:k1A=c1A−u1−vA=6−0−7=−1k2A=c2A−u2−vA=7−1−7=−1k2B=c2B−u2−vB=11−1−8=+2k3C=c3C−u3−vC=12−(−3)−10=+5
这个计算结果其实和使用Stepping-Stone算法的结果是一样的;根据计算结果,应该选择
x
1
A
x_{1A}
x1A作为分配对象,那么接下来的操作其实和Stepping-Stone算法一致,从
x
1
A
x_{1A}
x1A出发,构造Loop,然后使用需要减数量的单元格中最小的数量分别进行重分配,得到了新的TP表同时外层的
u
i
u_i
ui和
v
j
v_j
vj被清空:
需要重新计算
u
i
u_i
ui和
v
j
v_j
vj的值,同样,先让
u
1
=
0
u_1=0
u1=0,然后依次计算出其他的变量值:
接着使用公式
c
i
j
−
u
i
−
v
j
=
k
i
j
c_{ij}-u_i-v_j=k_{ij}
cij−ui−vj=kij计算空单元格的cost变化值:
x
1
A
:
k
1
B
=
c
1
B
−
u
1
−
v
B
=
8
−
0
−
7
=
+
1
x
2
A
:
k
2
A
=
c
2
A
−
u
2
−
v
A
=
7
−
1
−
6
=
0
x
2
B
:
k
2
B
=
c
2
B
−
u
2
−
v
B
=
11
−
1
−
7
=
+
3
x
3
C
:
k
3
C
=
c
3
C
−
u
3
−
v
C
=
12
−
(
−
2
)
−
10
=
+
4
\begin{aligned} x_{1A}: &k_{1B}=c_{1B}-u_1-v_B=8-0-7=+1 \\ x_{2A}: &k_{2A}=c_{2A}-u_2-v_A=7-1-6=0\\ x_{2B}: &k_{2B}=c_{2B}-u_2-v_B=11-1-7=+3\\ x_{3C}: &k_{3C}=c_{3C}-u_3-v_C=12-(-2)-10=+4\\ \end{aligned}
x1A:x2A:x2B:x3C:k1B=c1B−u1−vB=8−0−7=+1k2A=c2A−u2−vA=7−1−6=0k2B=c2B−u2−vB=11−1−7=+3k3C=c3C−u3−vC=12−(−2)−10=+4
可以看到现在所有的cost变化值都大于等于零,所以当前解已经是最优解,可以停止MODI算法了.
可以看到相比于Stepping-Stone算法,MODI可以更直接地计算空单元格的cost变化值,但是因为要计算 u i u_i ui和 v j v_j vj的值,并且重分配时也要构建Loop,所以实际的计算量也并没有比Stepping-Stone算法少很多
总结下Modified Distribution算法的步骤:
- 在所有有分配值的单元格上应用 u i + v j = c i j u_i+v_j=c_{ij} ui+vj=cij来计算 u i u_i ui和 v j v_j vj序列的值;
- 对每个空单元格使用公式 c i j − u i − v j = k i j c_{ij}-u_i-v_j=k_{ij} cij−ui−vj=kij计算cost的变化值;
- 选择 k i j k_{ij} kij最小的那个空单元格(负数),构建Loop并重分配数量得到新的TP表;
- 重复1到3,直到所有的 k i j k_{ij} kij都大于等于零
标签:11,10,vj,单元格,Modified,算法,ui,Distribution,aligned 来源: https://blog.csdn.net/wangzhenyang2/article/details/113744349