欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

【运筹学】匈牙利法 ( 匈牙利法示例 2 | 第一步 : 变换系数矩阵 | 第二步 : 试指派 | 行列打√ | 直线覆盖 | 第二轮试指派 )

发布时间:2025/6/17 编程问答 64 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【运筹学】匈牙利法 ( 匈牙利法示例 2 | 第一步 : 变换系数矩阵 | 第二步 : 试指派 | 行列打√ | 直线覆盖 | 第二轮试指派 ) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • 一、使用匈牙利法求解下面的指派问题
  • 二、第一步 : 变换系数矩阵 ( 每行每列都出现 0 元素 )
  • 三、第二步 : 试指派 ( 找独立 0 元素 )
  • 四、第二步 : 试指派 ( 打 √ )
  • 五、第二步 : 试指派 ( 直线覆盖 )
  • 五、第二步 : 试指派 ( 第二轮 )





一、使用匈牙利法求解下面的指派问题



四人分别完成四项工作所用时间 :

AAABBBCCCDDD
777151515131313444
999444141414151515
888141414161616131313
777888111111999
444888111111999




二、第一步 : 变换系数矩阵 ( 每行每列都出现 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 行只有 111000 元素 , 该元素是独立 000 元素 ( 红色矩形框 ) , 位于第 222 列 ;

同时第 222 列中的其它 000 元素标记为 废弃 000 元素 ( 绿色矩形框 );

333 行只有 111000 元素 , 该元素是独立 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-11 , 覆盖的列 +1+1+1 ;

1,41, 41,4 行中的元素 −1-11, 第 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-11 , 覆盖的列 +1+1+1 ;

1,2,3,41, 2,3,41,2,3,4 行中的元素 −1-11, 第 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 | 第一步 : 变换系数矩阵 | 第二步 : 试指派 | 行列打√ | 直线覆盖 | 第二轮试指派 )的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。