当使用某种初始化算法得到TP问题的一个初始解后,就可以使用迭代算法进行最优解的搜索;Stepping-Stone算法和Modified Distribution(MODI)算法是常用的两种算法,这篇文章先介绍Stepping-Stone算法,而初始化算法则默认使用Minimum-Cell-Cost算法
还是使用前面文章使用的例子来说明:
三个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算法,得到了如下表所示的初始解:
Stepping-Stone算法的基本思想是验证如果给一个空单元格进行分配,是否能达到一个更低的目标值。在上面的例子中,有4个单元格是空的:1A, 2A, 2B和3C,我们首先评估下给单元格1A进行分配造成的cost变化情况:如果我们给1A分配一个单位的数量,那么总cost将会提高$6;但是给1A多分配一个单位将使得第一行的总supply变成151,为了维持约束,我们必须在这一行中选择一个已经分配的单元格减去1单位;在第一行,1B是已分配状态,所以从1B上减掉1单位;从1B上减去1个单位将使得这一列的总demand变成99,所以我们又需要在这一列的3B上加1单位来维持约束;类似的,给3B加一单位,我们又需要从3A上减掉1个单位;而在3A这一列上,1A在最开始就加上了一单位,整个TP表刚好平衡了;那么1A->1B->3B->3A刚好构成了一个回路,也就是前面文章提到的Loop
现在我们可以计算一下按照这个Loop进行一单位数量的变化所引起的总Cost变化是多少:
1 A → 1 B → 3 B → 3 A + 6 − 8 + 5 − 4 = − 1 \begin{aligned} 1A\rightarrow1B\rightarrow3B\rightarrow3A \\ +6-8+5-4=-1 \end{aligned} 1A→1B→3B→3A+6−8+5−4=−1
可见,每次在1A上新加一单位的数量,将使得总的cost降低$1,也就意味着我们可以按照这个Loop进行数量的重分配来达到一个更优解;不过我们不急着这么做,因为还有另外3个空单元格没有评估,我们可以看看是否又能使得总cost降低更多的Loop
对于2A,其Loop和cost变化值:
2 A → 2 C → 1 C → 1 B → 3 B → 3 A + 7 − 11 + 10 − 8 + 5 − 4 = − 1 \begin{aligned} 2A\rightarrow 2C\rightarrow 1C \rightarrow 1B \rightarrow 3B \rightarrow 3A \\ +7-11+10-8+5-4=-1 \end{aligned} 2A→2C→1C→1B→3B→3A+7−11+10−8+5