编程语言
首页 > 编程语言> > 求解传输问题(四) Modified Distribution算法

求解传输问题(四) Modified Distribution算法

作者:互联网

Modified Distribution算法(MODI)其实可以看成是Stepping-Stone算法的变体,它和Stepping-Stone算法的主要区别在于MODI是通过数学表达式直接计算空单元格对总cost的变化情况,而不是先识别Loop

我们还是使用之前的例子:
三个Supply结点,其供应量为:

仓库库存(Supply)
1. 堪萨斯150
2. 奥马哈175
3. 得梅因275
Total600

三个Demand结点,其需求量为:

面粉厂需求(Demand)
A. 芝加哥200
B. 圣路易斯100
C. 辛辛那提300
Total600

路径的单位花销:

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​+vB​0+vB​vB​x1C​:u1​+vC​0+vC​vC​x2C​:u2​+vC​u2​+10u2​x3B​:u3​+vB​u3​+8u3​x3​A:u3​+vA​−3+vA​vA​​=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算法的步骤:

  1. 在所有有分配值的单元格上应用 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​序列的值;
  2. 对每个空单元格使用公式 c i j − u i − v j = k i j c_{ij}-u_i-v_j=k_{ij} cij​−ui​−vj​=kij​计算cost的变化值;
  3. 选择 k i j k_{ij} kij​最小的那个空单元格(负数),构建Loop并重分配数量得到新的TP表;
  4. 重复1到3,直到所有的 k i j k_{ij} kij​都大于等于零

标签:11,10,vj,单元格,Modified,算法,ui,Distribution,aligned
来源: https://blog.csdn.net/wangzhenyang2/article/details/113744349