【程序人生】Hungarian Algorithm——匈牙利算法

【程序人生】Hungarian Algorithm——匈牙利算法

原文链接

http://www.hungarianalgorithm.com/hungarianalgorithm.php
http://www.hungarianalgorithm.com/examplehungarianalgorithm.php

匈牙利算法解决的问题

匈牙利算法(Hungarian Algorithm)是一种组合优化算法(combinatorial optimization algorithm),用于求解指派问题(assignment problem),算法时间复杂度为 O ( n 3 ) O(n^3)

匈牙利算法的步骤

匈牙利算法包括下面四个步骤,第一步和第二步只执行一次第三步和第四步重复执行,直到得到最优的指派方案。这个算法的输入是一个 n n n * n 的矩阵,且矩阵元素非负

  • 步骤一:每行元素减当前行最小值
    对于每一行,找到这一行的最小元素,这一行的每个元素都减去这个最小元素。
  • 步骤二:每列元素减当前列最小值
    同样,对于每一列,找到这一列的最小元素,这一列的每个元素都减去这个最小元素。注意此时矩阵已经是经过第一步处理后的矩阵,如果这一列的最小值是0,那么就减0,而不是减输入矩阵中这一列的最小值。
  • 步骤三:在矩阵上划横线或是竖线,用最少数量的线覆盖所有的0
    如果用线的数量等于矩阵的宽度 n n ,则已经找到最优指派方案,算法结束。如果用线的数量小于矩阵的宽度 n n ,则进行第四步。
  • 步骤四:找到没有被线覆盖的矩阵元素中的最小值,这里把它命名为 k k 。所有没有被线覆盖的矩阵元素减 k k ,所有同时被两条线覆盖的矩阵元素加 k k 。重复步骤三。

匈牙利算法的例子

这里有四份工作 J 1 , J 2 , J 3 , J 4 J_1, J_2, J_3, J_4 需要分配给四个工人 W 1 , W 2 , W 3 , W 4 W_1, W_2, W_3, W_4 ,每个人只分配到一份工作。每个工人对应每份工作的要求劳务矩阵如下,这里用匈牙利算法求得总劳务最低的指派方案。
在这里插入图片描述

  1. 每行减最小值
    在这里插入图片描述
  2. 每列减最小值
    在这里插入图片描述
  3. 用最少数量的线覆盖所有零元素
    在这里插入图片描述
  4. 线的数量为三,小于矩阵宽度四。所以找到没有被线覆盖的最小元素 k k ,所有没有被线覆盖的元素减 k k ,同时被两条线覆盖的元素加 k k
    在这里插入图片描述
  5. 重复执行步骤三
    在这里插入图片描述
  6. 线的数量为四,等于矩阵宽度四。找到最优指派方案,算法结束。
    在这里插入图片描述

结语

如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
手打很辛苦,如果我的文章对您有帮助,转载请注明出处。

发布了57 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Zhang_Chen_/article/details/102596299