一、" 最小元素法 " 分析
在上一篇博客 【运筹学】表上作业法 ( 求初始基可行解 | 最小元素法 ) 中 , 按照 " 最小元素法 " 找到了初始基可行解 ,
使用 " 最小元素法 " , 属于贪婪算法 , 每次都找运费最小的优先供应 , 每个步骤的方案都是最优 , 局部最优 ,
每步最优不一定能使得全局最优 ;
二、Vogel 方法 ( 差额法 )
" Vogel 方法 " 的核心思想就是从运价表中 , 分别计算 各行 , 各列 的 最小运费 和 次最小运费 差额 , 填写到表的 最右列 和 最下行 ;
基于如下运输问题进行分析 : 下面的表格代表 3 3 3 个产地 , 4 4 4 个销地 的运输规划问题 , 表格中的内容是 某产地运往某销地的运费 ;
B 1 \rm B_1 B1 | B 2 \rm B_2 B2 | B 3 \rm B_3 B3 | B 4 \rm B_4 B4 | 产量 | 行差额 | |
---|---|---|---|---|---|---|
A 1 \rm A_1 A1 | 3 3 3 | 11 11 11 | 3 3 3 | 10 10 10 | 7 7 7 | 0 0 0 |
A 2 \rm A_2 A2 | 1 1 1 | 9 9 9 | 2 2 2 | 8 8 8 | 4 4 4 | 1 1 1 |
A 3 \rm A_3 A3 | 7 7 7 | 4 4 4 | 10 10 10 | 5 5 5 | 9 9 9 | 1 1 1 |
销量 | 3 3 3 | 6 6 6 | 5 5 5 | 6 6 6 | ||
列差额 | 2 2 2 | 5 5 5 | 1 1 1 | 3 3 3 |
列差额 :
第 1 1 1 列 列差额 : 最小运费 1 1 1 , 次最小运费 3 3 3 , 差额是 2 2 2 ;
第 2 2 2 列 列差额 : 最小运费 4 4 4 , 次最小运费 9 9 9 , 差额是 5 5 5 ;
第 3 3 3 列 列差额 : 最小运费 2 2 2 , 次最小运费 3 3 3 , 差额是 1 1 1 ;
第 4 4 4 列 列差额 : 最小运费 5 5 5 , 次最小运费 8 8 8 , 差额是 3 3 3 ;
行差额 :
第 1 1 1 行 行差额 : 最小运费 3 3 3 , 次最小运费 3 3 3 , 差额是 0 0 0 ;
第 2 2 2 行 行差额 : 最小运费 1 1 1 , 次最小运费 2 2 2 , 差额是 1 1 1 ;
第 3 3 3 行 行差额 : 最小运费 4 4 4 , 次最小运费 5 5 5 , 差额是 1 1 1 ;
以 第 1 1 1 列 列差额 为例进行分析 , 最小运费 1 1 1 , 次最小运费 3 3 3 , 差额是 2 2 2 ; 如果不能使用最小运费 1 1 1 , 那么退而求其次 , 使用次最小运费 3 3 3 ; 最优方案无法使用 , 考虑次优方案 , 这两个方案的差距就是 列差额 2 2 2 , 次优方案比最优方案运费高 , 高 2 2 2 ;
第二列的列差额是 5 5 5 , 如果不能使用最优方案 , 使用次优方案 , 每个都要增加运费 5 5 5 , 这个增加的就太多了 , 应该 优先满足差额较高的行列 优先安排运输 ;
" Vogel 方法 " 将全局的最优考虑了进去 , 不再追求局部最优 , 使用该方法得出的初始基可行解 , 距离最优解更近 , 可以迭代更少次数 ;
第 1 1 1 个基变量 :
从所有 没有被划掉 的并且 没有被安排 的的运费中找到差额最大的 , 是 B 2 \rm B_2 B2 的列差额 5 5 5 ;
B 2 \rm B_2 B2 列最小运费 : 这里优先给 B 2 \rm B_2 B2 销地的最小运费 4 4 4 安排运输 , 避免为其安排次小运费 , 对应表格第 3 3 3 行第 2 2 2 列 , A 3 \rm A_3 A3 产地运往 B 2 \rm B_2 B2 销地的运费 ;
产地分析 : 对于产地 A 3 \rm A_3 A3 来说 , 其生产 9 9 9 个 , 已经安排了 0 0 0 个 , 还可以再安排 9 9 9 个 ;
销地分析 : 对于销地 B 2 \rm B_2 B2 来说需求 6 6 6 个 , 已经安排了 0 0 0 个 , 还可以再安排 6 6 6 个 ;
最大安排最小运费运输 , 从 A 3 \rm A_3 A3 向 B 2 \rm B_2 B2 运输 6 6 6 个产品 ;
B 1 \rm B_1 B1 | B 2 \rm B_2 B2 | B 3 \rm B_3 B3 | B 4 \rm B_4 B4 | 产量 | 行差额 | |
---|---|---|---|---|---|---|
A 1 \rm A_1 A1 | 3 3 3 | 1̸1 \not 11 11 | 3 3 3 | 10 10 10 | 7 7 7 | 0 0 0 |
A 2 \rm A_2 A2 | 1 1 1 | 9̸ \not 9 9 | 2 2 2 | 8 8 8 | 4 4 4 | 1 1 1 |
A 3 \rm A_3 A3 | 7 7 7 | 4̸ \not 4 4 , 6 6 6 | 10 10 10 | 5 5 5 | 9 9 9 | 1 1 1 |
销量 | 3 3 3 | 6 6 6 | 5 5 5 | 6 6 6 | ||
列差额 | 2 2 2 | 5̸ \not 5 5 | 1 1 1 | 3 3 3 |
此时 B 2 \rm B_2 B2 的销量已经全部消耗完毕 , 该列就不需要安排其它产地向 B 2 \rm B_2 B2 销地运输了 , 可以划掉这一列 , 讨论其它列的运输问题 ;
第 2 2 2 个基变量 :
划掉了 B 2 \rm B_2 B2 行 , 这里重新计算行差与列差 ,
B 1 \rm B_1 B1 , B 3 \rm B_3 B3 列最小运费 与 次小运费 没有变化 , 行差额不变 ;
A 1 \rm A_1 A1 , A 2 \rm A_2 A2 行最小运费 与 次小运费 没有变化 , 行差额不变 ;
A 3 \rm A_3 A3 行差额需要重新计算 , 最小运费被划掉了 , 此时最小运费是 5 5 5 , 次小运费是 7 7 7 , 行差额变为 2 2 2 ;
B 1 \rm B_1 B1 | B 2 \rm B_2 B2 | B 3 \rm B_3 B3 | B 4 \rm B_4 B4 | 产量 | 行差额 | |
---|---|---|---|---|---|---|
A 1 \rm A_1 A1 | 3 3 3 | 1̸1 \not 11 11 | 3 3 3 | 10 10 10 | 7 7 7 | 0 0 0 |
A 2 \rm A_2 A2 | 1 1 1 | 9̸ \not 9 9 | 2 2 2 | 8 8 8 | 4 4 4 | 1 1 1 |
A 3 \rm A_3 A3 | 7 7 7 | 4̸ \not 4 4 , 6 6 6 | 10 10 10 | 5 5 5 | 9 9 9 | 2 2 2 |
销量 | 3 3 3 | 6 6 6 | 5 5 5 | 6 6 6 | ||
列差额 | 2 2 2 | 5̸ \not 5 5 | 1 1 1 | 3 3 3 |
从所有 没有被划掉 的并且 没有被安排 的的运费中找到差额最大的 , 是 B 4 \rm B_4 B4 的列差额 3 3 3 ;
B 4 \rm B_4 B4 列最小运费 : 这里优先给 B 4 \rm B_4 B4 销地的最小运费 5 5 5 安排运输 , 避免为其安排次小运费 , 对应表格第 3 3 3 行第 4 4 4 列 , A 3 \rm A_3 A3 产地运往 B 4 \rm B_4 B4 销地的运费 ;
产地分析 : 对于产地 A 3 \rm A_3 A3 来说 , 其生产 9 9 9 个 , 已经安排了 6 6 6 个 , 还可以再安排 3 3 3 个 ;
销地分析 : 对于销地 B 4 \rm B_4 B4 来说需求 6 6 6 个 , 已经安排了 0 0 0 个 , 还可以再安排 6 6 6 个 ;
最大安排最小运费运输 , 从 A 3 \rm A_3 A3 向 B 4 \rm B_4 B4 运输 3 3 3 个产品 ;
B 1 \rm B_1 B1 | B 2 \rm B_2 B2 | B 3 \rm B_3 B3 | B 4 \rm B_4 B4 | 产量 | 行差额 | |
---|---|---|---|---|---|---|
A 1 \rm A_1 A1 | 3 3 3 | 1̸1 \not 11 11 | 3 3 3 | 10 10 10 | 7 7 7 | 0 0 0 |
A 2 \rm A_2 A2 | 1 1 1 | 9̸ \not 9 9 | 2 2 2 | 8 8 8 | 4 4 4 | 1 1 1 |
A 3 \rm A_3 A3 | 7̸ \not 7 7 | 4̸ \not 4 4 , 6 6 6 | 1̸0 \not 10 10 | 5̸ \not 5 5 , 3 3 3 | 9 9 9 | 2 2 2 |
销量 | 3 3 3 | 6 6 6 | 5 5 5 | 6 6 6 | ||
列差额 | 2 2 2 | 5̸ \not 5 5 | 1 1 1 | 3 3 3 |
此时 A 3 \rm A_3 A3 的产量已经全部消耗完毕 , 该行就不需要安排其它销地运输了 , 可以划掉这一行 , 讨论其它列的运输问题 ;
第 3 3 3 个基变量 :
划掉了 B 2 \rm B_2 B2 行 , 这里重新计算行差与列差 ,
A 1 \rm A_1 A1 , A 2 \rm A_2 A2 行最小运费 与 次小运费 没有变化 , 行差额不变 ;
B 1 \rm B_1 B1 , B 3 \rm B_3 B3 列最小运费 与 次小运费 没有变化 , 列差额不变 ;
B 4 \rm B_4 B4 列差额需要重新计算 , 最小运费被划掉了 , 此时最小运费是 8 8 8 , 次小运费是 10 10 10 , 行差额变为 2 2 2 ;
B 1 \rm B_1 B1 | B 2 \rm B_2 B2 | B 3 \rm B_3 B3 | B 4 \rm B_4 B4 | 产量 | 行差额 | |
---|---|---|---|---|---|---|
A 1 \rm A_1 A1 | 3 3 3 | 1̸1 \not 11 11 | 3 3 3 | 10 10 10 | 7 7 7 | 0 0 0 |
A 2 \rm A_2 A2 | 1 1 1 | 9̸ \not 9 9 | 2 2 2 | 8 8 8 | 4 4 4 | 1 1 1 |
A 3 \rm A_3 A3 | 7̸ \not 7 7 | 4̸ \not 4 4 , 6 6 6 | 1̸0 \not 10 10 | 5̸ \not 5 5 , 3 3 3 | 9 9 9 | 2̸ \not 2 2 |
销量 | 3 3 3 | 6 6 6 | 5 5 5 | 6 6 6 | ||
列差额 | 2 2 2 | 5̸ \not 5 5 | 1 1 1 | 2 2 2 |
从所有 没有被划掉 的并且 没有被安排 的的运费中找到差额最大的 , 是 B 1 \rm B_1 B1 和 B 4 \rm B_4 B4 的列差额 2 2 2 ; 这两个任选一个都可以 ;
B 4 \rm B_4 B4 列最小运费 : 这里优先给 B 4 \rm B_4 B4 销地的最小运费 8 8 8 安排运输 , 避免为其安排次小运费 , 对应表格第 2 2 2 行第 4 4 4 列 , A 2 \rm A_2 A2 产地运往 B 4 \rm B_4 B4 销地的运费 ;
产地分析 : 对于产地 A 2 \rm A_2 A2 来说 , 其生产 4 4 4 个 , 已经安排了 6 6 6 个 , 还可以再安排 4 4 4 个 ;
销地分析 : 对于销地 B 4 \rm B_4 B4 来说需求 6 6 6 个 , 已经安排了 3 3 3 个 , 还可以再安排 3 3 3 个 ;
最大安排最小运费运输 , 从 A 2 \rm A_2 A2 向 B 4 \rm B_4 B4 运输 3 3 3 个产品 ;
B 1 \rm B_1 B1 | B 2 \rm B_2 B2 | B 3 \rm B_3 B3 | B 4 \rm B_4 B4 | 产量 | 行差额 | |
---|---|---|---|---|---|---|
A 1 \rm A_1 A1 | 3 3 3 | 1̸1 \not 11 11 | 3 3 3 | 1̸0 \not 10 10 | 7 7 7 | 0 0 0 |
A 2 \rm A_2 A2 | 1 1 1 | 9̸ \not 9 9 | 2 2 2 | 8̸ \not 8 8 , 3 3 3 | 4 4 4 | 1 1 1 |
A 3 \rm A_3 A3 | 7̸ \not 7 7 | 4̸ \not 4 4 , 6 6 6 | 1̸0 \not 10 10 | 5̸ \not 5 5 , 3 3 3 | 9 9 9 | 2̸ \not 2 2 |
销量 | 3 3 3 | 6 6 6 | 5 5 5 | 6 6 6 | ||
列差额 | 2 2 2 | 5̸ \not 5 5 | 1 1 1 | 2̸ \not 2 2 |
此时 B 4 \rm B_4 B4 的销量已经全部消耗完毕 , 该列就不需要安排其它产地向 B 4 \rm B_4 B4 销地运输了 , 可以划掉这一列 , 讨论其它列的运输问题 ;
第 4 4 4 个基变量 :
划掉了 B 4 \rm B_4 B4 行列 , 这里重新计算行差与列差 ,
A 1 \rm A_1 A1 , A 2 \rm A_2 A2 行最小运费 与 次小运费 没有变化 , 行差额不变 ;
B 1 \rm B_1 B1 , B 3 \rm B_3 B3 列最小运费 与 次小运费 没有变化 , 列差额不变 ;
B 1 \rm B_1 B1 | B 2 \rm B_2 B2 | B 3 \rm B_3 B3 | B 4 \rm B_4 B4 | 产量 | 行差额 | |
---|---|---|---|---|---|---|
A 1 \rm A_1 A1 | 3 3 3 | 1̸1 \not 11 11 | 3 3 3 | 1̸0 \not 10 10 | 7 7 7 | 0 0 0 |
A 2 \rm A_2 A2 | 1 1 1 | 9̸ \not 9 9 | 2 2 2 | 8̸ \not 8 8 , 3 3 3 | 4 4 4 | 1 1 1 |
A 3 \rm A_3 A3 | 7̸ \not 7 7 | 4̸ \not 4 4 , 6 6 6 | 1̸0 \not 10 10 | 5̸ \not 5 5 , 3 3 3 | 9 9 9 | 2̸ \not 2 2 |
销量 | 3 3 3 | 6 6 6 | 5 5 5 | 6 6 6 | ||
列差额 | 2 2 2 | 5̸ \not 5 5 | 1 1 1 | 2̸ \not 2 2 |
从所有 没有被划掉 的并且 没有被安排 的的运费中找到差额最大的 , 是 B 1 \rm B_1 B1 的列差额 2 2 2 ;
B 1 \rm B_1 B1 列最小运费 : 这里优先给 B 1 \rm B_1 B1 销地的最小运费 1 1 1 安排运输 , 避免为其安排次小运费 , 对应表格第 2 2 2 行第 1 1 1 列 , A 2 \rm A_2 A2 产地运往 B 1 \rm B_1 B1 销地的运费 ;
产地分析 : 对于产地 A 2 \rm A_2 A2 来说 , 其生产 4 4 4 个 , 已经安排了 3 3 3 个 , 还可以再安排 1 1 1 个 ;
销地分析 : 对于销地 B 1 \rm B_1 B1 来说需求 3 3 3 个 , 已经安排了 0 0 0 个 , 还可以再安排 3 3 3 个 ;
最大安排最小运费运输 , 从 A 2 \rm A_2 A2 向 B 1 \rm B_1 B1 运输 1 1 1 个产品 ;
B 1 \rm B_1 B1 | B 2 \rm B_2 B2 | B 3 \rm B_3 B3 | B 4 \rm B_4 B4 | 产量 | 行差额 | |
---|---|---|---|---|---|---|
A 1 \rm A_1 A1 | 3 3 3 | 1̸1 \not 11 11 | 3 3 3 | 1̸0 \not 10 10 | 7 7 7 | 0 0 0 |
A 2 \rm A_2 A2 | 1̸ \not 1 1 , 1 1 1 | 9̸ \not 9 9 | 2̸ \not 2 2 | 8̸ \not 8 8 , 3 3 3 | 4 4 4 | 1̸ \not 1 1 |
A 3 \rm A_3 A3 | 7̸ \not 7 7 | 4̸ \not 4 4 , 6 6 6 | 1̸0 \not 10 10 | 5̸ \not 5 5 , 3 3 3 | 9 9 9 | 2̸ \not 2 2 |
销量 | 3 3 3 | 6 6 6 | 5 5 5 | 6 6 6 | ||
列差额 | 2 2 2 | 5̸ \not 5 5 | 1 1 1 | 2̸ \not 2 2 |
此时 A 2 \rm A_2 A2 的产量已经全部消耗完毕 , 该行就不需要安排其它销地运输了 , 可以划掉这一行 , 讨论其它列的运输问题 ;
第 5 5 5 个基变量 :
划掉了 A 2 \rm A_2 A2 行 , 这里重新计算行差与列差 ,
A 1 \rm A_1 A1 , A 2 \rm A_2 A2 行最小运费 与 次小运费 没有变化 , 行差额不变 ;
B 1 \rm B_1 B1 | B 2 \rm B_2 B2 | B 3 \rm B_3 B3 | B 4 \rm B_4 B4 | 产量 | 行差额 | |
---|---|---|---|---|---|---|
A 1 \rm A_1 A1 | 3 3 3 | 1̸1 \not 11 11 | 3 3 3 | 1̸0 \not 10 10 | 7 7 7 | 0 0 0 |
A 2 \rm A_2 A2 | 1̸ \not 1 1 , 1 1 1 | 9̸ \not 9 9 | 2̸ \not 2 2 | 8̸ \not 8 8 , 3 3 3 | 4 4 4 | 1̸ \not 1 1 |
A 3 \rm A_3 A3 | 7̸ \not 7 7 | 4̸ \not 4 4 , 6 6 6 | 1̸0 \not 10 10 | 5̸ \not 5 5 , 3 3 3 | 9 9 9 | 2̸ \not 2 2 |
销量 | 3 3 3 | 6 6 6 | 5 5 5 | 6 6 6 | ||
列差额 | 2 2 2 | 5̸ \not 5 5 | 1 1 1 | 2̸ \not 2 2 |
从所有 没有被划掉 的并且 没有被安排 的的运费中找到差额最大的 , A 1 \rm A_1 A1 的行差额 0 0 0 ;
A 1 \rm A_1 A1 列最小运费 : 这里优先给 A 1 \rm A_1 A1 销地的最小运费 3 3 3 安排运输 , 避免为其安排次小运费 , 对应表格第 1 1 1 行第 1 1 1 列 , A 1 \rm A_1 A1 产地运往 B 1 \rm B_1 B1 销地的运费 ; ( 次小运费 = 最小运费 , 任选一个即可 )
产地分析 : 对于产地 A 1 \rm A_1 A1 来说 , 其生产 7 7 7 个 , 已经安排了 0 0 0 个 , 还可以再安排 7 7 7 个 ;
销地分析 : 对于销地 B 1 \rm B_1 B1 来说需求 3 3 3 个 , 已经安排了 1 1 1 个 , 还可以再安排 2 2 2 个 ;
最大安排最小运费运输 , 从 A 1 \rm A_1 A1 向 B 1 \rm B_1 B1 运输 2 2 2 个产品 ;
B 1 \rm B_1 B1 | B 2 \rm B_2 B2 | B 3 \rm B_3 B3 | B 4 \rm B_4 B4 | 产量 | 行差额 | |
---|---|---|---|---|---|---|
A 1 \rm A_1 A1 | 3̸ \not 3 3 , 2 2 2 | 1̸1 \not 11 11 | 3 3 3 | 1̸0 \not 10 10 | 7 7 7 | 0 0 0 |
A 2 \rm A_2 A2 | 1̸ \not 1 1 , 1 1 1 | 9̸ \not 9 9 | 2̸ \not 2 2 | 8̸ \not 8 8 , 3 3 3 | 4 4 4 | 1̸ \not 1 1 |
A 3 \rm A_3 A3 | 7̸ \not 7 7 | 4̸ \not 4 4 , 6 6 6 | 1̸0 \not 10 10 | 5̸ \not 5 5 , 3 3 3 | 9 9 9 | 2̸ \not 2 2 |
销量 | 3 3 3 | 6 6 6 | 5 5 5 | 6 6 6 | ||
列差额 | 2 2 2 | 5̸ \not 5 5 | 1 1 1 | 2̸ \not 2 2 |
此时 B 1 \rm B_1 B1 的销量已经全部消耗完毕 , 该列就不需要安排其它产地向 B 1 \rm B_1 B1 销地运输了 , 可以划掉这一列 , 讨论其它列的运输问题 ;
第 6 6 6 个基变量 :
此时只剩下最后一个运费没有被安排 , A 1 \rm A_1 A1 产地运往 B 3 \rm B_3 B3 销地的运费 ;
产地分析 : 对于产地 A 1 \rm A_1 A1 来说 , 其生产 7 7 7 个 , 已经安排了 2 2 2 个 , 还可以再安排 5 5 5 个 ;
销地分析 : 对于销地 B 3 \rm B_3 B3 来说需求 5 5 5 个 , 已经安排了 0 0 0 个 , 还可以再安排 5 5 5 个 ;
最大安排最小运费运输 , 从 A 1 \rm A_1 A1 向 B 3 \rm B_3 B3 运输 5 5 5 个产品 ;
B 1 \rm B_1 B1 | B 2 \rm B_2 B2 | B 3 \rm B_3 B3 | B 4 \rm B_4 B4 | 产量 | 行差额 | |
---|---|---|---|---|---|---|
A 1 \rm A_1 A1 | 3 3 3 , 2 2 2 | 1̸1 \not 11 11 | 3 3 3 , 5 5 5 | 1̸0 \not 10 10 | 7 7 7 | 0 0 0 |
A 2 \rm A_2 A2 | 1̸ \not 1 1 , 1 1 1 | 9̸ \not 9 9 | 2̸ \not 2 2 | 8̸ \not 8 8 , 3 3 3 | 4 4 4 | 1̸ \not 1 1 |
A 3 \rm A_3 A3 | 7̸ \not 7 7 | 4̸ \not 4 4 , 6 6 6 | 1̸0 \not 10 10 | 5̸ \not 5 5 , 3 3 3 | 9 9 9 | 2̸ \not 2 2 |
销量 | 3 3 3 | 6 6 6 | 5 5 5 | 6 6 6 | ||
列差额 | 2 2 2 | 5̸ \not 5 5 | 1 1 1 | 2̸ \not 2 2 |
此时 B 3 \rm B_3 B3 的销量已经全部消耗完毕 , 该列就不需要安排其它产地向 B 3 \rm B_3 B3 销地运输了 , 可以划掉这一列 , 讨论其它列的运输问题 ;
至此 , 所有的产量与销量分配完毕 ;
上述初始基可行解方案总运费 :
( 2 × 3 ) + ( 3 × 5 ) + ( 1 × 1 ) + ( 3 × 8 ) + ( 4 × 6 ) + ( 3 × 5 ) = 85 \rm ( 2 \times 3 ) + ( 3 \times 5 ) + ( 1 \times 1 ) + ( 3 \times 8 ) + ( 4 \times 6 ) + ( 3 \times 5 ) = 85 (2×3)+(3×5)+(1×1)+(3×8)+(4×6)+(3×5)=85
最小元素法求出来的初始基可行解的 总运费是 86 86 86 , " Vogel 方法 " 比 " 最小元素法 " 能找出更近的初始基可行解 ;