传统算法: 匈牙利算法&KM算法

做为一个算法工程师,除了了解各种NN网络结构,调的一手好参数,传统算法这一部分也不能拉下。因此着手写这个系列,一方面加深自己对算法的理解,另一方面探讨在实际业务中的应用,毕竟AC不是目的,融汇贯通的应用才是真目标。

问题:

刚入职某网约车平台的L同学被安排了个任务,如下图所示,在一块区域有m个司机和n个乘客,考虑司机的接驾成本,司机只接距离三公里以内的乘客,以及一个司机只能接一个乘客,该如何匹配司机和乘客,使得被接上的乘客数最大?

司机乘客订单匹配
图 1  司机乘客接驾示意图

对原问题进行转换后,我们可以将上述问题转换成如下图所示的问题,若两者司乘之间的距离小于三公里,则两节点可由直线相连。该问题即二分图最大匹配问题

在正式介绍算法之前,我们首先介绍下二分图问题:对于二分图的最大匹配问题,可以用匈牙利算法进行求解。

笔者刷数模题的时候有一道题考到了“二分图最大权分配”,需要用到KM算法,但是书上对KM算法的介绍又臭又长,更何况有些同学“匈牙利算法”也没学过(由匈牙利数学家Edmonds提出),自然难以理解所谓的KM算法。本文旨在用通俗易懂的语言,向读者介绍匈牙利算法和KM算法。

引入

1.二分图

2.增广路

增广路主要应用于匈牙利算法中,用于求二分图最大匹配。

KM算法用来求二分图最大权完美匹配。这就是KM算法的整个过程,整体思路就是:每次都帮一个顶点匹配最大权重边,利用匈牙利算法完成最大匹配,最终我们完成的就是最优匹配

定义

增广路

若P是图G中一条连通两个未匹配顶点的路径,并且属于M的边和不属于M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径(举例来说,有A、B集合,增广路由A中一个点通向B中一个点,再由B中这个点通向A中一个点……交替进行)。

在正式介绍KM算法之前,我们先介绍匈牙利算法。

算法

代码

总结

该算法通常可用于平台型的互联网,撮合交易的。如某滴,分配司机和订单。来看就可以用KM算法实现价值最大化。

之后我们也可以通过公开的资料,来看看在网约车平台是如何实现分单的。

下一篇文章 异常检测的概论

猜你喜欢

转载自blog.csdn.net/Super_Json/article/details/82690378
今日推荐