【运筹学】匈牙利法 ( 匈牙利法示例 2 | 第一步 : 变换系数矩阵 | 第二步 : 试指派 | 行列打√ | 直线覆盖 | 第二轮试指派 )
文章目录
- 一、使用匈牙利法求解下面的指派问题
- 二、第一步 : 变换系数矩阵 ( 每行每列都出现 0 元素 )
- 三、第二步 : 试指派 ( 找独立 0 元素 )
- 四、第二步 : 试指派 ( 打 √ )
- 五、第二步 : 试指派 ( 直线覆盖 )
- 五、第二步 : 试指派 ( 第二轮 )
一、使用匈牙利法求解下面的指派问题
四人分别完成四项工作所用时间 :
| 甲 | 777 | 151515 | 131313 | 444 |
| 乙 | 999 | 444 | 141414 | 151515 |
| 丙 | 888 | 141414 | 161616 | 131313 |
| 丁 | 777 | 888 | 111111 | 999 |
| 戊 | 444 | 888 | 111111 | 999 |
二、第一步 : 变换系数矩阵 ( 每行每列都出现 0 元素 )
先写出指派问题的系数矩阵 :
(cij)=[75981191271198546973696467511](c_{ij}) =\begin{bmatrix} & 7 & 5 & 9 & 8 & 11 & \\\\ & 9 & 12 & 7 & 11 & 9 & \\\\ & 8 & 5 & 4 & 6 & 9 & \\\\ & 7 & 3 & 6 & 9 & 6 & \\\\ & 4 & 6 & 7 & 5 & 11 & \\ \end{bmatrix}(cij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡79874512536974678116951199611⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
使每行都出现 000 元素 : (cij)(c_{ij})(cij) 系数矩阵中 , 每行都 减去该行最小元素 ;
- 第 111 行减去最小值 555 ;
- 第 222 行减去最小值 777 ;
- 第 333 行减去最小值 444 ;
- 第 444 行减去最小值 333 ;
- 第 555 行减去最小值 444 ;
(cij′)=[2043625042410254036302317](c_{ij}') =\begin{bmatrix} & 2 & 0 & 4 & 3 & 6 & \\\\ & 2 & 5 & 0 & 4 & 2 & \\\\ & 4 & 1 & 0 & 2 & 5 & \\\\ & 4 & 0 & 3 & 6 & 3 & \\\\ & 0 & 2 & 3 & 1 & 7 & \\ \end{bmatrix}(cij′)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡2244005102400333426162537⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
此时发现有两列 , 第 444 列 , 第 555 列 , 没有 000 元素 , 这两列每列都减去最小值 :
- 第 444 列减去最小值 111 ;
- 第 555 列减去最小值 222 ;
最终得到行列都有 000 元素的系数矩阵 (bij)(b_{ij})(bij) :
(bij)=[2042425030410134035102305](b_{ij}) =\begin{bmatrix} & 2 & 0 & 4 & 2 & 4 & \\\\ & 2 & 5 & 0 & 3 & 0 & \\\\ & 4 & 1 & 0 & 1 & 3 & \\\\ & 4 & 0 & 3 & 5 & 1 & \\\\ & 0 & 2 & 3 & 0 & 5 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡2244005102400332315040315⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
三、第二步 : 试指派 ( 找独立 0 元素 )
基于上一步的行列都有 000 元素的系数矩阵 ,
(bij)=[2042425030410134035102305](b_{ij}) =\begin{bmatrix} & 2 & 0 & 4 & 2 & 4 & \\\\ & 2 & 5 & 0 & 3 & 0 & \\\\ & 4 & 1 & 0 & 1 & 3 & \\\\ & 4 & 0 & 3 & 5 & 1 & \\\\ & 0 & 2 & 3 & 0 & 5 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡2244005102400332315040315⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
进行试指派 ;
找出每行的独立 000 元素 ,
优先从唯一选择开始 ,
第 111 行只有 111 个 000 元素 , 该元素是独立 000 元素 ( 红色矩形框 ) , 位于第 222 列 ;
同时第 222 列中的其它 000 元素标记为 废弃 000 元素 ( 绿色矩形框 );
第 333 行只有 111 个 000 元素 , 该元素是独立 000 元素 ( 红色矩形框 ) , 位于第 333 列 ;
同时第 333 列中的其它 000 元素标记为 废弃 000 元素 ( 绿色矩形框 );
第 222 行中原来有两个 000 元素 , 有一个被标记为 废弃 000 元素 , 因此只剩下一个 000 元素 , 标记为独立 000 元素 ;
第 444 行没有独立 000 元素 , 第 555 行都有多个 000 元素 ;
然后从列里面找独立 000 元素 , 第 2,3,52,3,52,3,5 列都已经找到了 000 元素 , 这里看 第 1,41,41,4 列 ;
第 111 列有 独立 000 元素 ( 红色矩形框 ) ; 位于第 555 行 , 将第 555 行的其它 000 元素标记为 废弃 000 元素 ( 绿色矩形框 ) ;
这里只找到了 444 个独立 000 元素 , 红色矩形框中 ;
使用最少的直线 , 覆盖所有的 000 元素 ;
四、第二步 : 试指派 ( 打 √ )
本步骤的目的是使用最少的直线 , 将所有的 000 元素都覆盖住 , 如果能一眼看出来最好 , 如果不能 , 就需要使用打钩的方法 ;
定位一个没有独立 000 元素的行 : 先对没有 000 元素的行打钩 √ : 第 444 行没有独立 000 元素 , 第 444 行打 √ ;
讨论第 444 行 : 第 444 行没有独立的 000 元素 , 但是有废弃的 000 元素 , 因为在第一步已经保证了每行每列都有 000 元素 ;
在第 444 行 的 废弃 000 元素所在列 , 即第 222 列 , 打 √ ;
讨论第 222 列 : 上述打钩的列中 , 查看是否有 独立的 000 元素 , 如果有对应的行就打 √ ;
第 111 行有独立的 000 元素 , 在第 111 行位置打 √ ;
讨论第 111 行 : 查看第 111 行是否有废弃的 000 元素 , 如果有就继续打 √ , 如果没有就停止 ;
第 111 行没有废弃的 000 元素 , 直接停止 ;
讨论 行 的时候讨论的是 废弃的 000 元素 ,
讨论 列 的时候讨论的是 独立的 000 元素 ;
五、第二步 : 试指派 ( 直线覆盖 )
本步骤的目的是使用最少的直线 , 将所有的 000 元素都覆盖住 , 如果能一眼看出来最好 , 如果不能 , 就需要使用打钩的方法 ;
打 √ 完毕 , 开始讨论覆盖 ,
没有 打 √ 的行划线 , 打 √ 的列划线 , 四条线就将所有的 000 元素覆盖了 ,
在没有被覆盖的元素中 , 找最小的元素 111 , 将该元素所在的没有覆盖的行 −1-1−1 , 覆盖的列 +1+1+1 ;
第 1,41, 41,4 行中的元素 −1-1−1, 第 222 列中的元素 +1+1+1 ;
最终得到如下矩阵 :
(bij)=[1031326030420133024003305](b_{ij}) =\begin{bmatrix} & 1 & 0 & 3 & 1 & 3 & \\\\ & 2 & 6 & 0 & 3 & 0 & \\\\ & 4 & 2 & 0 & 1 & 3 & \\\\ & 3 & 0 & 2 & 4 & 0 & \\\\ & 0 & 3 & 3 & 0 & 5 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡1243006203300231314030305⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
本质 : 没有覆盖的元素统一减去最小值 , 被覆盖的行列交叉值增加了该最小元素值 ;
五、第二步 : 试指派 ( 第二轮 )
再次进行试指派此时发现 , 试指派还是 444 个独立 000 元素 ,
先找有独立 000 元素的行 , 找到后 标记为 独立 000 元素 ( 红色矩形框 ) , 将对应列的 000 元素标记为废弃 ( 绿色矩形框 ) ;
然后找有独立 000 元素的列 ;
再次执行 打 √ ,
没有 000 元素的行为起点 :
将该行废弃 000 元素列打钩 , 有两个 :
将废弃 000 元素列中对应的 独立 000 元素 行 打钩 :
上述两行对应的 废弃 000 元素的列打钩 :
在上述打钩的列中 , 将独立 000 元素所在行打钩 :
直线覆盖 : 没打勾的行画一条直线 , 打钩的列画一条直线 ; 目的是使用最少的直线覆盖住所有的 000 ;
在没有被覆盖的元素中 , 找最小的元素 111 , 将该最小元素所在的没有覆盖的行 −1-1−1 , 覆盖的列 +1+1+1 ;
第 1,2,3,41, 2,3,41,2,3,4 行中的元素 −1-1−1, 第 2,3,42,3,42,3,4 列中的元素 +1+1+1 ;
最终矩阵为 :
(bij)=[0030316020320032023004406](b_{ij}) =\begin{bmatrix} & 0 & 0 & 3 & 0 & 3 & \\\\ & 1 & 6 & 0 & 2 & 0 & \\\\ & 3 & 2 & 0 & 0 & 3 & \\\\ & 2 & 0 & 2 & 3 & 0 & \\\\ & 0 & 4 & 4 & 0 & 6 & \\ \end{bmatrix}(bij)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡0132006204300240203030306⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
本质 : 没有覆盖的元素统一减去最小值 , 被覆盖的行列交叉值增加了该最小元素值 ;
这个矩阵 000 很多 , 选出 555 个独立 000 元素 , 成立的解有好多个 ;
如下指派 , 正好能找出 555 个独立 000 元素 ;
总结
以上是生活随笔为你收集整理的【运筹学】匈牙利法 ( 匈牙利法示例 2 | 第一步 : 变换系数矩阵 | 第二步 : 试指派 | 行列打√ | 直线覆盖 | 第二轮试指派 )的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【运筹学】匈牙利法 ( 克尼格定理 |
- 下一篇: 【OpenGL】二、Visual Stu