码迷,mamicode.com
首页 > 编程语言 > 详细

Hungarian method (匈牙利算法)----解决指派问题(转)

时间:2015-05-27 15:28:30      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:

Hungarian method (匈牙利算法)----解决指派问题(转)
---匈牙利解法是求解指派问题的一种新颖而又简便的解法。

---指派问题的最优解有这样一个性质,若从系数矩阵的一行(列)各元素中分别减去该行(列)的最小元素,得到新矩阵,那么以新矩阵为系数矩阵求得的最优解和用原矩阵求得的最优解相同.利用这个性质,可使原系数矩阵变换为含有很多0元素的新矩阵,而最优解保持不变.

---具体操作为第一步:使指派问题的系数矩阵经变换,在各行各列中都出现0元素.(1)从系数矩阵的每行元素减去该行的最小元素;(2)再从所得系数矩阵的每列元素中减去该列的最小元素.第二步:进行试指派.若此时得到的mPn,应回到第一步,重新对系数矩阵进行变换。但要把第一步的过程改为(1)从系数矩阵的每列元素减去该列的最小元素;(2)再从所得系数矩阵的每行元素中减去该行的最小元素.这样做就使得新矩阵的0元素比较多些.再进入第二步进行试指派就可以得到最优解.

---匈牙利解法的示例
   
  技术分享

  步骤一:将这系数矩阵进行变换,使各行各列都出现0元素.从系数矩阵的每行元素减去该行的最小元素即得每行每列都有有0元素的系数矩阵.

  技术分享-------------------------------- 技术分享

  步骤二:进行试指派,找出独立的0元素.独立0元素用Θ表示,其它0用Φ表示得到

  技术分享……(1)

  这里Θ的个数m=4,而n=5;问题没有得到求解,运用步骤三继续求解.

  步骤三:作最少的直线覆盖所有的0元素,以确定该系数矩阵中能找到最多的独立元素数.为此按以下步骤进行.

  (1)对没有Θ的行打√号:;

  (2)对已打√号的行中所含0元素的列打√号;

  (3)再对所有打√号的列中的含有@元素的行打√号;

  (4)重复2、3直到得不出新的打√号的行列为止.

  (5)对没有打√号的行画一横线,有打√号的列画一纵线,这就得到覆盖所有0元素的最少直线数.

  令直线数为l.若l < n,说明必须再变换当前的系数矩阵,才能找到n个独立的0元素,为此转换步骤四;若l = n,而m < n,应回到步骤二,另行试探.

  在此例中,对矩阵(1)按以下次序进行:

  先在第五行旁打√,接着可判断应在第一列下打√,接着在第3行旁打√,经检查不能再打√了.对没有打√行画一直线以覆盖0元素,对打√的列画一直线以覆盖0元素,得:

  技术分享……(2)

  由此可见l = 4 < n.所以应继续对(2)矩阵进行变换转步骤四.

  步骤四:对(2)矩阵进行变换的目的是增加0元素.

  为此在没有被直线覆盖的部分中找出最小元素.然后在打√行各元素中都减去这个最小元素,而在打√列的各元素上都加上这个最小元素,以保证原来0元素不变.这样得到新系数矩阵(它的最优解和原问题相同).若得到n个独立的0元素,则已得最优解,否则回到步骤三重复进行.

  在矩阵(2)中,在没有被覆盖部分(第3、5行)中找到最小元素为2,然后在第3、5行各元素分别减去2。给第l列各元素加2,得到新矩阵(3)

  技术分享……(3)

  按步骤二,找出所有的独立0元素。得到矩阵(4)

  技术分享……(4)

  它具有n个独立0元素.这就得到了最优解,相应解矩阵为

  技术分享

  由解矩阵得最优指派方案:

  甲——B,乙——D,丙——E,丁——C,戊——A

  所需总时间为minz=32.





Hungarian method (匈牙利算法)----解决指派问题(转)

标签:

原文地址:http://www.cnblogs.com/ZhangJinkun/p/91cb2cb67486f04970ffe6683c7a0e72.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!