之前做毕设的时间用到图匹配算法,其中有一步是用Kuhn-Munkres算法求解二分图的匹配问题,KM算法也被称为二分图最大权匹配算法,它的核心思想简单来说就是给你两个点集(这样叫可能不准确,是一个二分图),将两个集合中的点进行“配对”,不断修改配对顺序,直到找到二分图的最大匹配(可以简单理解为一种最优的配对结果,可以通过匈牙利算法求解),当为不同的配对方式赋予一个权值时,就变成了二分图的最大权匹配问题,就是KM算法要解决的问题。我觉得KM算法就是在匈牙利算法的基础上加入了权值。
KM算法可以用来进行图匹配、航迹关联、任务分配等问题。
首先说明KM算法的基本流程如下:
1) 设定可行标号的初值;
2) 基于匈牙利算法求解二分图的完备匹配;
3) 找不到完备匹配时修改可行标号;
4) 重复2)3)步骤,一直到找出完备匹配。
根据KM算法流程说明几个概念:
二分图:二分图是一种图论模型。对于一幅图g(V,E),V表示为图g中点的集合,E表示图g中边的集合。假设所有的顶点能够分为两个集合R和S,这两个集合之间不存在重复的点,对于g中的任意一条边的两个顶点均分别属于集合R和S,那么g就是一个二分图。
二分图匹配:假设P是g中边集合E的子集,如果P中任意两条边均没有连接而且没有形成环路,那么P就称为二分图g的一个匹配。在图g中含有的边数最多的一个匹配叫做最大匹配,如果在各条边上加上权重w,则图g中权重总和最大的匹配称为最大权匹配,最小的匹配称为最小权匹配。
完备匹配:如果一个匹配中,图中的每一个顶点都和图中某条边相关联,则称此匹配为完全匹配,完全匹配也称作完备匹配
增广路径:若P是图g中一条连通两个未匹配顶点的路径,并且已匹配和待匹配的边在P上交替出现,则称P为一条增广路径。算法的重点是找到最大的增广路径。增广路径有以下特点:
- 有奇数条边
- 起点在二分图的R边,终点在二分图的S边
- 路径上的点一定是一个在R边,一个在S边,交错出现。
- 整条路径上没有重复的点
- 起点和终点都是目前还没有配对的点,其他的点都已经出现在匹配子图中
- 路径上的所有第奇数条边都是还没有进入目前匹配子图的边,而所有第偶数条边都已经进入目前匹配子图。奇数边比偶数边多一条
- 把所有第奇数条边都加到匹配子图中,把偶数条边都删除,匹配数增加了1
匈牙利算法:用于寻找二分图的最大匹配。算法根据一定的规则选择二分图的边加入匹配子图中,其基本模式为:
1) 初始化匹配子图为空
2) While 找得到增广路径
3) Do 把增广路径添加到匹配子图中
可行标号:R 和 S 中的每个点都设置有一个标号,记 lr[i] 为R方点 i 的标号,ls[j]为S方点 j 的标号。如果对于图中的任意(i, j, W)都有lr[i]+ls[j]>=W,(其中W表示关联权重)则这一组点标是可行的。特别地,对于lr[i]+ls[j]=W的边(i, j, W),称为可行边; L(r)+ L(s)== Wr,s,称为等价子图
修改可行标号的规则:
1)点i 和 j都在增广轨中:此时边 (i, j) 的 (lr[i]+ls[j]) 值不变,也就是这条边的可行性不变(原来是可行边则现在仍是,原来不是则现在仍不是);
2) 点 i 在增广轨中而 j 不在:此时边 (i, j) 的(lr[i]+ls[j])的值减少了d,也就是原来这条边不是可行边(否则j就会被遍历到了),而现在可能是;
3) 点 j 在增广轨中而i不在:此时边(i, j)的(lr[i]+ls[j])的值增加了d,也就是原来这条边不是可行边(若这条边是可行边,则在遍历到j时会紧接着执行DFS(i),此时i就会被遍历到),现在仍不是;
4) 点 i 和 j 都不在增广轨中:此时边(i, j)的(lr[i]+ls[j])值不变,也就是这条边的可行性不变。取所有第2)类边的 (lr[i]+ls[j]-W)的最小值作为d值
KM算法主要解决二分图的带权匹配问题,可以用来进行两个点集的最优匹配,最关键是设置权重矩阵C,将权重矩阵代入算法就能输出两个点集具体的点配对关系。
1、http://philoscience.iteye.com/blog/1754498
2、https://blog.csdn.net/denghecsdn/article/details/77619308