1.历史

匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,广泛应用在运筹学领域, 美国数学家哈罗德·库恩于1955年提出该算法,之所以被称作匈牙利算法是因为算法很大一部分是基于以前匈牙利数学家Dénes Kőnig(1884-1944)和Jenő Egerváry(1891-1958)的工作上创建起来的。

Kuhn H W. The Hungarian method for the assignment problem[J]. Naval research logistics quarterly, 1955, 2(1‐2): 83-97.

2.指派问题

匈牙利算法被用来求解任务分配问题,也叫指派问题,即n项任务,对应分配给n个人去做,应该由哪个人来完成哪项任务,能够使完成效率最高。

基于上图中的指派问题模型,匈牙利算法求解指派问题时的条件是,1)目标函数最小 2)人和任务数相同 3)效率非负,根据目标函数:
minZ=∑i∑jcijxijmin Z = \sum_{i} \sum_{j} c_{ij}x_{ij} minZ=i∑​j∑​cij​xij​
匈牙利算法的目标,就是在变换系数矩阵中找到n个不同行不同列的0元素,以求解指派问题最优解。

现在借用一个例子来说明匈牙利算法的步骤。由一份说明书需要翻译成ABCD四种语言,现有甲乙丙丁四人去做四种语言的翻译所需要的时间见下表,需要求得的是如何指派任务使完成翻译工作需要的工时最少。

  • 步骤1:系数矩阵在每行列上减去对应行列中的最小值,使各行各列都出现0元素

  • 步骤2:试寻找指派最优解

  • 步骤3:经过步骤2,第4行依然没有0元素,也就是丙这个人当前没有任务去做,第3步即增加矩阵中的0元素,给丙分配任务

  • 步骤4:重复步骤2、3,直到找到n个位于不同行不同列的0元素,即最优解

  • 最优解:

即最优方案为甲翻译D,乙翻译A,丙翻译B,丁翻译C

3.二部图与匈牙利算法

二部图(Bigraph, Bipartite graph)也被称做二分图,是一种特殊的图,其顶点可以分成两个不相交的集合(UV),并且同属一个集合内的点两两不相连(EU=EV=ϕE_U=E_V=\phiEU​=EV​=ϕ,也就是说二分图中如有圈,则圈所包含的边的数量必定是偶数。

匹配:匹配(M)是定义为二部图中边的集合M⊂EM \subset EM⊂E且其中任意两条边不共点即∀e1,e2∈M,s.t.e1∩e2=ϕ\forall e_1,e_2\in M,s.t. e_1 \cap e_2 = \phi∀e1​,e2​∈M,s.t.e1​∩e2​=ϕ

上图中红色的边{e1,e6e_1,e_6e1​,e6​}组成的集合就是1个匹配,其他还可以定义各种匹配如{e5e_5e5​}、{e2e_2e2​,e5e_5e5​}等,这些红色的边被称为匹配边,匹配边所连接的点被称为匹配点。同样可以定义非匹配边非匹配点

如果二分图里的某一个匹配包含的边的数量,在该二分图的所有匹配中最大,那么这个匹配称为最大匹配(Maximum Matching)

如上图就是1个最大匹配{e2,e3,e5,e7e_2,e_3,e_5,e_7e2​,e3​,e5​,e7​}

交错路径:M是二部图G的一个匹配,G的一条M交错路径是指,其边在M和E(G)-M中交替出现的路径,如{e2,e7e_2,e_7e2​,e7​}是一个匹配,则{e1,e2,e6,e7e_1,e_2,e_6,e_7e1​,e2​,e6​,e7​}就是一条交错路径。

增广路径:在二分图的匹配中,如果一条路径的首尾是非匹配点,路径中除此之外(如果有)其他的点均是匹配点,那么这条路径就是一条增广路径(Agumenting path),从定义可知增广路径是一种特殊的交错路径。结合上面的图可知{e1,e6e_1,e_6e1​,e6​}是匹配时,{e7,e6,e2,e1,e3e_7,e_6,e_2,e_1,e_3e7​,e6​,e2​,e1​,e3​}是一条增广路径。

基于上述术语引出Hall定理,图G中的一个匹配M是最大匹配的充分必要条件是G中不存在M的增广路径。证明可参考

增广路径的首尾是非匹配点。因此,增广路径的第一条和最后一条边,必然是非匹配边;由交错路径的定义可知,增广路径从非匹配边开始,匹配边和非匹配边依次交替,最后由非匹配边结束。这样一来,增广路径中非匹配边的数目总比匹配边大 1。

考虑置换增广路径中的匹配边和非匹配边,由于增广路径的首尾是非匹配点,其余则是匹配点,这样的置换不会影响原匹配中其他的匹配边和匹配点,因而不会破坏匹配;而增广路径的置换,可使匹配的边数加1,得到比原有匹配更大的匹配。

由于二分图的最大匹配必然存在(比如,上限是包含所有顶点的完全匹配),所以,在任意匹配的基础上,如果有办法不断地搜寻出增广路径,直到最终我们找不到新的增广路径为止,就有可能得到二分图的一个最大匹配。匈牙利算法正是基于这种思想来实现的。

二部图的最大匹配可分成有权二部图和无权二部图,无权二部图的实例表示如宠物匹配,有权二部图实例如任务指派。

无权二部图的最大匹配不能使用贪心算法,可以使用**网络流问题**来进行求解。

有权二部图满足约束条件后可使用匈牙利算法来求最大匹配,两边的结点相同∣U∣=∣V∣=n|U|=|V|=n∣U∣=∣V∣=n,匈牙利算法的时间复杂度为O(n3)O(n^3)O(n3)。

4.在线工具及代码实现

  • 可以输入系数矩阵,在线使用匈牙利算法来求解任务分配问题的一个网站
  • 匈牙利算法的C++实现

1.https://www.bilibili.com/video/BV1hF411h7eX?spm_id_from=333.337.search-card.all.click
2.https://zh.wikipedia.org/wiki/%E5%8C%88%E7%89%99%E5%88%A9%E7%AE%97%E6%B3%95
3.https://www.zhihu.com/question/313845998
4.https://liam.page/2016/04/03/Hungarian-algorithm-in-the-maximum-matching-problem-of-bigraph/?utm_source=wechat_session&utm_medium=social&utm_oi=574981213526167552
5.https://www.youtube.com/watch?v=6DFWUgV5Osc&ab_channel=ShusenWang

(二)匈牙利算法简介相关推荐

  1. 多目标跟踪之匈牙利算法

    0 前言 目标跟踪(Object Tracking)是自动驾驶中非常常见的任务,根据跟踪目标数量的不同,目标跟踪可分为: 单目标跟踪(Single Object Tracking,SOT) 多目标跟踪 ...

  2. 推荐系统概述推荐系统算法简介

    文章目录 一. 推荐系统概述 1. 推荐系统目的 2. 推荐系统的应用 3. 推荐系统的基本思想 数据分析(数据源) 4. 推荐系统的分类 二. 推荐系统算法简介 1. 基于人口统计学的推荐算法 2. ...

  3. 推荐系统算法_机器学习和推荐系统(二)推荐算法简介

    推荐算法简介 一. 基于人口统计学的推荐算法 二.基于内容的推荐算法 三. 基于协同过滤的推荐算法 协同过滤(Collaborative Filtering , CF) 基于近邻的系统过滤 基于用户( ...

  4. 量子计算(二十):量子算法简介

    文章目录 量子算法简介 一.概述 二.量子经典混合算法 量子算法简介 一.概述 量子算法是在现实的量子计算模型上运行的算法,最常用的模型是计算的量子电路模型.经典(或非量子)算法是一种有限的指令序列, ...

  5. SPH算法简介(二): 粒子受力分析

    SPH算法简介(二): 粒子受力分析 2011年03月31日  |本网站遵守CC版权协议 转载请注明出自www.thecodeway.com     SPH算法的基本设想,就是将连续的流体想象成一个个 ...

  6. hihocoder 1122 : 二分图二•二分图最大匹配之匈牙利算法

    首先,匈牙利算法是用来求二分图的最大匹配的,它的核心问题就是找增广路径.匈牙利算法的时间复杂度为O(VE),其中 V为二分图左边的顶点数,E为二分图中边的数目. 现在我们来看看增广路有哪些性质: (1 ...

  7. 【数据挖掘】基于划分的聚类方法 ( K-Means 算法简介 | K-Means 算法步骤 | K-Means 图示 )

    文章目录 一. 基于划分的聚类方法 二. K-Means 算法 简介 三. K-Means 算法 步骤 四. K-Means 方法的评分函数 五. K-Means 算法 图示 一. 基于划分的聚类方法 ...

  8. 二分图的最大匹配—匈牙利算法

    [基本概念]: 二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分 ...

  9. 匈牙利算法学习笔记_Python代码

    学习华为上机测试题,遇见了下面题,很有意思,核心是匈牙利算法问题. 特此学习记录.资料均参考自网络. 匈牙利算法目的:找出两边最大的匹配的数量. 参考资料: https://blog.csdn.net ...

最新文章

  1. python运输问题_叶片运输优化问题学习笔记
  2. 安装elasticsearch5.4.1集群和head插件
  3. 使多个线程循环输出0-99-0-99
  4. webgis从基础到开发实践_开源WebGIS教程系列——11.1 GISLite 的开发背景与设计
  5. redis单线程原理___Redis为何那么快-----底层原理浅析
  6. 飞秋教程:日程安排记事提醒
  7. 112_Power Pivot 销售订单按 sku 订单类型特殊分类及占比相关
  8. 港中文等提出:开放世界实体分割
  9. vant在cell中加表格_Vant Cell 单元格
  10. 周杰伦178首歌被网易云侵权 单曲仅获赔4500元
  11. 如何提升鸿蒙战绩,蛰伏一年 鸿蒙系统2.0为我们带来了哪些升级?
  12. ios 销毁当前页面重新开启_利用Vue中keep-alive,快速实现页面缓存
  13. 帆软函数TOIMAGE应用
  14. python抽签程序_【一点资讯】python打造一个抽奖程序 www.yidianzixun.com
  15. 未来IT互联网企业的发展前景
  16. 2022半入耳式蓝牙耳机怎么选?半入耳式耳机排行榜
  17. ABR与ASBR是什么?区别又是什么?
  18. 分享112个HTML娱乐休闲模板,总有一款适合您
  19. 算法之-判断某个整数是否为素数的自定义函数:
  20. SAP schema增强

热门文章

  1. bzoj 4033: [HAOI2015]树上染色(树形DP)
  2. bzoj 1059: [ZJOI2007]矩阵游戏(二分匹配)
  3. [Python] 字典 get(key, default=None):获取字典中相应键的对应值
  4. 贺利坚老师汇编课程48笔记:转移指令如jcxz
  5. node 创建静态web服务器(上)
  6. C# 值类型和引用类型
  7. Python collections模块总结
  8. button点击事件不响应的解决方法(子视图大小超过父视图)
  9. edit box小技巧
  10. SQL语法集锦一:SQL语句实现表的横向聚合