传统算法: 匈牙利算法&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算法实现价值最大化。

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

 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值