描述

最近在做特征级别的感知结果融合算法。我的工作目的,是要将多种不同传感器的感知结果,通过一定的机制融合起来,得到融合后的感知结果。为此看了一些资料,了解到Apollo中使用了匈牙利匹配算法,之前不懂就学习了一下。这个算法挺好理解的,将个人对匈牙利匹配算法的理解写在这里。

这篇感觉是我写过最搞笑的文章。。。

一、算法简介

匈牙利算法(Hungarian Algorithm),该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法,是一种能够在多项式时间内解决分配问题的组合优化算法。

网上有些作者比喻得很贴切,一句话先简单理解下匈牙利算法吧:有100个男人和100个女人,使用匈牙利算法可以凑出更多的夫妻(一男一女…)。

为了更深的理解算法是如何运行的,我们需要补充一些图论知识:比如,什么是二分图,什么又是增广矩阵,等等。(图论中非相关知识自行学习)

二、算法所需的图论知识

二分图

一个图中的所有顶点可划分为两个不相交的集合 U 和 V ,使得每一条边都分别连接U、V中的顶点。如果存在这样的划分,则此图为一个二分图,又称二部图。

“这个二分图可以理解为某个世界,在该世界中人非男即女。那么每个人其实都是这个图中的一个顶点,男人集合和女人集合彼此割裂,男人就是男人,女人就是女人,男人可以和女人结合,这实际上就是一个二分图。”

匹配

二分图中的一个匹配,就是此时二分图中一些边的集合,这个边集合中的任意两条边没有公共的顶点,也构不成一个圈。

“100个男人和100个女人组成的二分图中,如果可以任意结婚,那么就会有很多种结婚组合。我们把其中的一种结婚组合的可能性,称为一次匹配。在这次匹配中,任意一对夫妻都是合法夫妻,没有任何性别的第三者存在哈哈。”

最大匹配

一个图的所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。最大匹配数,就是最大匹配时边的数目。

“100个男人和100个女人,在平行时空下肯定有很多种结婚的组合啊,也就是有很多种匹配。那么,在所有匹配中,结婚对数最多的那次匹配,就是这个二分图的最大匹配。匈牙利算法是个月老和丘比特,他的目标就是要凑出最多的新人”

完美匹配

如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。显然,完美匹配一定是最大匹配(完美匹配的任何一个点都已经匹配,添加一条新的匹配边一定会与已有的匹配边冲突)。但并非每个图都存在完美匹配。

“100个男人和100个女人,每个男人都和一个女人结婚了,而且他们都是没有重婚罪的合法夫妻,这就是这个图的完美匹配。显然,这是一次最大匹配了。如果100个男人和99个女人构成的二分图,即使匈牙利算法再厉害,也还是会有个单身狗,并不存在完美匹配。”

三、算法原理

匈牙利算法有两个重要概念,先介绍一下。

交错路径

给定图G的一个匹配M,如果一条路径的边交替出现在M中和不出现在M中,我们称之为一条M-交错路径

增广路径

如果一条M-交错路径,它的两个端点都不与M中的边关联,我们称这条路径叫做M-增广路径。增广路径有一个重要特点:非匹配边比匹配边多一条。

我画了一幅图,我们有一幅8个顶点构成的图G。其中有一种匹配,是图中的黑线表示的2和4两条边,这两条边加上8个顶点,构成了图G的一种匹配M。

为了方便理解,我将图中的8个顶点按照二分图进行划分,绿色点表示男人,黄色点表示女人。

显然匹配M的意思就是,8个人中,由边2和边4代表的两对男女结成了夫妻。

按照交错路径的概念,1234、2345、12345都是M-交错路径(123456都不是,因为5和6均不在匹配M中,01234同理),而在这三个交错路径中,只有12345才是M-增广路径。那么,找出匹配M的增广路径意义合在呢?

我们会发现,在路径12345中,还存在着另外一种匹配1、3、5,它的匹配数是3,要大于匹配M的匹配数2。那么我们就得到了新的一个匹配N,它比匹配M更优。按照同样的方式,我们来寻找N-增广路径,会发现0123456是匹配N的增广路径,它的匹配数是4。因此图G的最大匹配,实际上是由0、2、4、6等四条边构成的匹配。

因此,研究增广路径的意义就是改进匹配模式,只要把增广路径中的匹配边和非匹配边的身份交换就可以了。身份交换后,图中的匹配边数目,将比原来增多 1 条。

匈牙利算法的核心,就是通过不断寻找原有匹配M的增广路径,来增加匹配中的匹配边和匹配点,从而达到该图下的最大匹配。

四、算法流程

概念

  • 饱和
    设一个图为G,G中一些不相邻的边组成了一个集合M,这个集合M就是G的一个匹配。匹配M中的每条边都有两个端点,这两个端点都称为是M饱和的。

    “有一些男人一些女人婚姻关系未明(一个图G),一些男女结成了夫妻(一种匹配关系M),结婚的男女都算已婚了(M饱和)”

    综上,就把饱和——理解成已婚,比较好理解我下面的分析。

4.1 匈牙利算法单边饱和

  • 第0步
    10个男人,9个女人,怎么饱和?如果10个男人,有10个及以上的女人,存在饱和的可能性,任选一种匹配M,准备去找一个饱和X匹配。

  • 第1步
    如果当前匹配M,已经X饱和了,10个男人都匹配了老婆,算法停止;否则,任取一个没老婆的男人x(取X中一个M非饱和点x),这个男人放进集合S中,并设一个集合T为空集。集合S中会存储已经结婚的男人+这个单身狗,集合T是这些男人的已婚配偶。

  • 第2步
    如果集合S中的位于匹配顶点的男人,他们可以匹配的女人(顶点的临接顶点N(S)),全部是已婚配偶(∈T),那么算法停止,当前的图就是会有男人找不到老婆。否则,我们找到了一个没有在当前路径的女人y(y∈N(S)-T),当然了这个女人可能有老公(也在匹配M中,只不过是不同路径),也有可能是硬拆散的(算法首次进入第2步,由于集合T为空,会强拆掉一组夫妻),也有可能压根就是未婚的。

  • 第3步
    如果上一步选择的女人y,她是有老公z的(y是M饱和的,yz∈M)。我们暂时先把他们拆开,老公z放进集合S中,女人y放进集合T中,然后去执行第2步。去执行第2步,意味着也许也许也许…拆掉现有的一对夫妻,这对夫妻中的老婆能解决之前狼少肉多问题的同时,老公还能找到新的老婆。
    否则,如果上一步选择的女人y,是没有老公的。我们找到了新的一种结婚方案(一条增广路P(x,y)),这个方案里让单身狗x去娶一个已婚的女人,然后原匹配夫妻中每个已婚男人都去娶别人老婆,剩下的一个已婚男人去娶这个小姑娘y。大家都很happy……hahahaha(增广路取反)

4.2 二部图最大匹配的匈牙利算法


这里可以自行按照上面的分析,去理解算法。虽然真正理解算法较为困难,也不再这里赘述。

总结

这篇文章清晰明了的介绍了下匈牙利算法。如何与多传感器融合特征算法相结合,会在以后的文章中介绍。

参考链接

  1. https://blog.csdn.net/zsfcg/article/details/20738027
  2. https://blog.csdn.net/weixin_43152152/article/details/114235820