KM算法的一点总结

之前做毕设的时间用到图匹配算法,其中有一步是用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,将权重矩阵代入算法就能输出两个点集具体的点配对关系。

Reference:

1、http://philoscience.iteye.com/blog/1754498

2、https://blog.csdn.net/denghecsdn/article/details/77619308


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值