交通 | 司乘匹配:基于增量成本计算的优化算法

news2024/11/28 9:32:44

在这里插入图片描述

编者按:

司乘匹配是打车服务中一项至关重要的任务,如果这一步做得不够优化,可能导致乘客需要更长的时间才能到达目的地,同时司机的收入也会因此减少。由于司乘匹配是一个持续进行的过程,每一时刻都在不断涌入新的打车订单和新的司机,这使得计算最优匹配成为一项非常具挑战性的任务。今天解读的这篇文章是由东南亚打车公司Grab在2021年发表于数据库顶会VLDB [1],并被评选为当年的Best Scalable Data Science Paper。作者发现了一个有意思的事情,最优匹配问题中最常用的Kuhn-Munkres算法(也称为匈牙利算法)中的一步对算法的效率提升有很大的影响,并且作者还用实际场景中观察到的一个特性来改进算法,今天我们将结合作者自己曾经写过的技术博客 [2],来从一个全新的角度探讨司乘匹配问题。
[1] Tenindra Abeywickrama, Victor Liang, and Kian-Lee Tan. 2021. Optimizing bipartite matching in real-world applications by incremental cost computation. Proc. VLDB Endow. 14, 7 (March 2021), 1150–1158
[2] https://engineering.grab.com/using-real-world-patterns-to-improve-matching

一、引例

在这里插入图片描述
图1. 司乘匹配场景示例

让我们从图1所示的简单匹配场景开始来介绍一些基础的概念,假设有三位司机(D1、D2 和 D3)和三位乘客(P1、P2 和 P3),乘客和司机是通过行驶时间来进行匹配的,找到行驶时间涉及计算从每位司机到每位乘客的最快路径,例如从 D1 到 P1、P2 和 P3 的虚线路径。为了找到最小总行驶时间的司乘分配方案,我们可以把问题表示为下面显示的二分图。在二分图中,乘客集合和司机集合分别构成二分图的两个集合,连接它们的边代表着最短路径,相对应的行驶时间如右侧矩阵所示,这个矩阵我们称它为成本矩阵。寻找两个集合间的最优分配也被称为解决最小权重二分匹配问题(也称为分配问题),一种常用来解决这个问题的算法叫Kuhn-Munkres(KM)算法(也称为匈牙利算法)。回忆一下,KM算法的原理是在不断迭代更新二分集合 𝑈(相应地,𝑉)的一组标签 l u l_u lu(或 l v l_v lv),以生成降低的成本 c r ( u , v ) = c ( u , v ) − l u − l v c_r(u,v)=c(u,v)-l_u-l_v cr(u,v)=c(u,v)lulv为零的边。如果在这些边之间存在完美匹配,那么这个匹配就是最小权重二分匹配问题的最优解。用KM算法来求解以上示例,我们会得到成本矩阵上标红的最优匹配方案,即 P 1 − D 1 , P 2 − D 3 , P 3 − D 2 P_1 -D_1, P_2 -D_3, P_3 -D_2 P1D1,P2D3,P3D2。然而到目前为止,我们都还没有涉及到和成本矩阵计算相关的事情,而事实证明,在实际场景中,这一步对计算性能有相当大的影响。那么接下来,我们就来讨论一下有关成本矩阵计算的影响。

二、成本矩阵的计算

在这里插入图片描述
图2. 针对不同m值成本矩阵计算与分配的时间比

我们发现在以往解决分配问题的研究里大多都假设成本矩阵是作为输入给定的,但在实际场景中,我们观察到计算成本矩阵所需要的时间实际上是非常值得关注的。首先,司乘匹配是一个连续的过程,成本会随着司机的移动和新的订单的接收而不断变化。这意味着即使是间隔几秒钟,都有可能需要重新计算一次成本矩阵。其次,寻找单个乘客和司机之间的最短路径就需要不低的算力,而我们需要为所有可能的司机乘客对进行此操作,由此可想算力上可能会面临的挑战。作者发现在实际问题中,计算成本矩阵所需的时间甚至比计算最优分配所需的时间更长!

我们先浅浅地来从时间复杂度来看一下为什么是如此。如果 m m m代表我们试图匹配的司机/乘客的数量,那么KM算法的时间复杂度为 O ( m 3 ) O(m^3) O(m3);如果 n n n代表道路网络中的顶点数,那么使用Dijkstra最短路径搜索算法计算成本矩阵的时间复杂度为 O ( m n l o g n ) O(mnlogn) O(mnlogn)。我们知道新加坡道路网络的节点数 n n n大约为400,000(对于更大的城市而言,这个数值更大),因此我们可以合理地期望在实际场景中(一般m小于1500), O ( m n l o g n ) O(mnlogn) O(mnlogn)将占主导地位。我们在新加坡的道路网络上进行了实验来验证这一点,如图2所示。在图2(a)中,我们可以看到当 m m m小于等于2500时,计算矩阵的时间主导了寻找最优匹配的时间。即使我们使用像Contraction Hierarchies这样更现代快速的方法来计算最快路径,这样的观察结果仍然成立,如图2(b)所示。这表明如果我们能够减少矩阵计算时间,整体的匹配效率就可以得到显著提高。

三、匹配的空间局部性

在这里插入图片描述
图3. 匹配的空间局部性场景示例

在研究乘客和司机的实际位置时,我们观察到了一个有趣的属性,我们将其称为“匹配的空间局部性”。我们发现,在最优匹配中,分配给每个司机的乘客是距离该司机最近的乘客之一(可能不是最近的)。这一点是非常直观的,因为乘客和司机是分布在整个城市的,而对于特定的司机来说,最优匹配不太可能出现在城市的另一边。

在图3中,我们可以看到一个展示这个属性的场景示例图,虽然这是一个理想化的示意图,但它也并没有太偏离实际情况。从所示的成本矩阵中,我们可以很容易地看出怎么样分配将提供最小的总行驶时间。现在,有了这样的直觉,我们想要考虑的问题是,我们到底有没有必要计算出完整的成本矩阵来找到最优匹配?比如,我们是否可以避免计算从 D3 到 P1 的成本,因为它们相隔太远,所以根本不太可能匹配?

四、改进后的KM算法

在这里插入图片描述
图4. 增量KM算法实现的框架

我们发现确实有一种方法可以利用匹配的空间局部性来减少成本计算的时间。作者提出了一种叫增量KM的算法,意思是仅在需要时才去计算成本,以有效的避免计算所有成本。修改过的KM算法采用了一种便捷的下界技术来实现这一点。我们用地标下界(Landmark Lower-Bounds, LLBs)作为最短路径的下界值,它所用到的核心思想其实就是三角不等式,不仅通俗易懂,还可以以较低的计算成本求出来。具体来讲,LLBs需要随机选择 𝑘 个“地标”顶点,并在离线预处理步骤中计算从每个地标到道路网络中所有顶点的距离并储存起来。在线上阶段,再用到任意地标顶点 𝑙 的距离以及三角不等式 L B l ( q , p ) = ∣ d ( l , q ) − d ( l , p ) ∣ ≤ d ( q , p ) LB_l(q,p)=|d(l,q)-d(l,p)| \leq d(q,p) LBl(q,p)=d(l,q)d(l,p)d(q,p)就可以计算出任意两个顶点 q q q p p p之间的下界距离。通过考虑所有 𝑘 个地标的最大下界 L B m a x ( q , p ) = max ⁡ l ∈ L ( ∣ d ( l , q ) − d ( l , p ) ∣ ) LB_{max}(q,p)=\max\limits_{l \in L}(|d(l,q)-d(l,p)|) LBmax(q,p)=lLmax(d(l,q)d(l,p)),我们发现即使对于较小的 𝑘 值,仍然可以计算出令人惊讶准确的最短路径下界。

除此之外,我们还用到数据库领域一个非常经典的概念k-最近邻搜索来实现每个司机 u i u_i ui的优先队列 Q i Q_i Qi,如图4所示。这些优先队列通过行驶时间的下界来检索最近的乘客,而优先队列的顶部则储存着所有尚未检索的乘客的行驶时间下界。KM算法可以用相关优先队列的下界来避免计算精确成本,然后照常运行。对于一些情况下下界对于KM计算最优匹配不够准确的问题,我们进而提出了一些改进规则。一旦触发了一条规则,我们就通过检索顶部元素并计算其精确成本来改进队列,这就是为什么我们称之为“增量”成本计算。如果你对具体细节感兴趣,可以在原文中去更深入地了解改进规则、算法的内部运作以及数学证明。

我们发现增量KM算法能够生成与原始KM算法完全相同的结果!它只是采用了一种乐观的增量方式完成,希望可以在不计算所有成本的情况下找到结果,这非常适用于我们打车问题中的匹配的空间局部性。我们不仅节约了大量计算精确成本的时间,也避免了计算那些距离很远的乘客的行驶时间(往往耗费更大的计算资源)。

五、实验结果

我们通过实验对比来验证所提出算法的实际性能。我们实现了两个版本的增量KM算法,它们分别在优先队列和所使用的最短路径算法的实现上有所不同。

  • IKM-DIJK:使用Dijkstra算法计算最短路径,优先队列即是从每个司机展开的Dijkstra搜索优先队列,这跟常规KM算法相比没有额外的花费。
  • IKM-GAC:使用最先进的下界技术COLT来实现优先队列和一种快速计算最短路径的方法G-tree。每个分配都必须构建COLT索引,这个会包含在所有运行时间中。

我们将提出的两个算法与使用Dijkstra和G-tree分别计算整个成本矩阵的常规KM算法进行比较并在新加坡真实的道路网络上进行了实验。除此之外,我们还用到了一个包括2018年12月的7天内的Grab打车订单。

性能评估:

我们首先选择一个以秒为单位大小为 W W W的窗口,然后在一个随机选择的大小为 W W W的窗口中对所有预订进行批量处理,并使用这些订单中的乘客和司机的位置来构建二分图集合。接下来,我们用每种算法去找到一个最优匹配,并在多个随机选择的窗口上对各个度量标准的结果取均值。

在这里插入图片描述
图5. 每种算法计算成本矩阵的平均比例 v.s. 窗口大小

在图5中,验证了我们提出的算法的确与其对应的方法相比计算了更少的精确成本(原始的KM算法计算了100%的矩阵)。

在这里插入图片描述
图6. 每种算法寻找最优分配的平均时间 v.s. 窗口大小

在图6中,我们可以看到每种算法的运行时间。图中的结果证实,减少精确成本的计算显著减少了超过一个数量级的运行时间,这也验证了节省的时间是大于任何添加的额外时间的。请注意,IKM-DIJK的改进本质上没有消耗额外的算力成本!另外值得注意的是,使用IKM-GAC可以实现非常低的运行时间。

在这里插入图片描述
图7. 每种算法支持的最大吞吐量 v.s. 窗口大小

在图7中,我们展示了每种算法支持的最大吞吐量,即在时间窗口 W W W内可以批量处理的乘客/司机的最大数量。如图所示,我们的算法可以支持明显更高的吞吐量。

六、总结

总的来说,计算分配成本确实对寻找最优分配的运行时间产生了显著影响。然而,我们发现通过利用实际分配问题中的匹配的空间局部性,可以通过修改KM算法以增量的方式运作,来避免计算非必要的精确成本。

而且,值得一提的是,我们提出的方法框架还可以适用于除了司乘匹配外其他用到分配问题的场景中。

参考文献:
[1] Tenindra Abeywickrama, Victor Liang, and Kian-Lee Tan. 2021. Optimizing bipartite matching in real-world applications by incremental cost computation. Proc. VLDB Endow. 14, 7 (March 2021), 1150–1158
[2] https://engineering.grab.com/using-real-world-patterns-to-improve-matching
[3] H. W. Kuhn. 1955. The Hungarian method for the assignment problem. Naval Research Logistics Quarterly 2, 1-2 (1955), 83–97
[4] Dijkstra, E.W. A note on two problems in connexion with graphs. Numer. Math. 1, 269–271 (1959)
[5] Robert Geisberger, Peter Sanders, Dominik Schultes, and Daniel Delling. 2008. Contraction Hierarchies: Faster and Simpler Hierarchical Routing in Road Networks. In WEA. 319–333
[6] Ruicheng Zhong, Guoliang Li, Kian-Lee Tan, Lizhu Zhou, and Zhiguo Gong. 2015. G-Tree: An Efficient and Scalable Index for Spatial Search on Road Networks. IEEE Trans. Knowl. Data Eng. 27, 8 (2015), 2175–2189
[7] Tenindra Abeywickrama, Muhammad Aamir Cheema, and Sabine Storandt. 2020. Hierarchical Graph Traversal for Aggregate k Nearest Neighbors Search in Road Networks. In ICAPS. 2–10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1348965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MD5算法

一、引言 MD5(Message-Digest Algorithm 5)是一种广泛应用的密码散列算法,由Ronald L. Rivest于1991年提出。MD5算法主要用于对任意长度的消息进行加密,将消息压缩成固定长度的摘要(通常为128位)。在密码学…

微信小程序开发系列-11组件间通信02

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》 《微信小程序开发系列-02注册小程序》 《微信小程序开发系列-03全局配置中的“window”和“tabBar”》 《微信小程序开发系列-04获取用户图像和昵称》 《微信小程序开发系列-05登录小程序》 《…

图文证明 等价无穷小替换

等价无穷小替换 定义 等价无穷小是无穷小之间的一种关系,指的是:在同一自变量的趋向过程中,若两个无穷小之比的极限为1,则称这两个无穷小是等价的。无穷小等价关系刻画的是两个无穷小趋向于零的速度是相等的。 设当 x → x 0 时…

[python]matplotlib

整体图示 .ipynb 转换md时候图片不能通知携带&#xff0c;所有图片失效&#xff0c;不过直接运行代码可以执行 figure figure,axes与axis import matplotlib.pyplot as plt figplt.figure() fig2plt.subplots() fig3,axsplt.subplots(2,2) plt.show()<Figure size 640x480 …

大数据 - Hadoop系列《二》- Hadoop组成

目录 &#x1f436;3.1 hadoop组成 &#x1f436;3.1 HDFS 架构概述 1. NameNode&#xff08;nn&#xff09;&#xff1a; ​编辑2. DataNode(dn)&#xff1a; 3. Secondary NameNode(2nn)&#xff1a; &#x1f436;3.2 YARN 架构概述 &#x1f436;3.3 MapReduce 架构…

Vue Tinymce富文本组件添加自定义字体项

实现效果如下&#xff1a; Tinymce 组件进行字体设置 设置完后&#xff0c;就可以使用自定义的字体了。

[Mac软件]ColorWell For Mac 7.4.0调色板生成器

美丽而直观的调色板和调色板生成器是任何Web或应用程序开发人员工具包的必要补充&#xff01; 创建无限数量的调色板&#xff0c;快速访问所有颜色信息和代码生成&#xff0c;用于应用程序开发&#xff0c;非常简单。可编辑调色板数据库允许您存档和恢复任何调色板&#xff0c…

Django 学习教程-介绍与安装

系列 Django 学习教程- Hello world入门案例-CSDN博客 介绍 Django 是一个由 Python 编写用于Web 应用程序开发的高级 Python Web 框架 Django 提供了一套强大的工具&#xff08;无需重新发明轮子&#xff09;&#xff0c;使得开发者能够快速构建 Web 网站。 Django 采用了…

在线课程学习管理

### 起步1. 使用 IDEA 导入项目 2. 执行 sql 目录下的online_study_system.sql 文件 3. 修改 mysql.properties 中数据库连接信息 4. 运行程序| 用户名| 密码 | | ------------- |:-------------| | admin | 123 | | 李老师 | 123 | | 张老师 | 123 | | 刘老师 | 123 | | 曹老师…

javaWeb商城2

一、家居电子商城 线上电子商城系统&#xff0c;主要实现了用户注册&#xff0c;登录、浏览&#xff0c;查看家居商品信息&#xff0c;购物车&#xff0c;订单&#xff0c;支付&#xff0c;查看通知以及管理员对用户信息的管理&#xff0c;订单管理&#xff0c;商品管理&#…

基于Java SSM框架实现医院挂号系统项目【项目源码+论文说明】

基于java的SSM框架实现医院挂号上班打卡系统演示 摘要 在网络发展的时代&#xff0c;国家对人们的健康越来越重视&#xff0c;医院的医疗设备更加先进&#xff0c;医生的医术、服务水平也不断在提高&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个…

给零基础朋友的编程课09 上集 - 代码

给零基础朋友的编程课09 上 - 矩形、曲线、文字、案例5讲解 上_哔哩哔哩_bilibili 上半Code: / // 彩色案例 艺术仿制品4 // /// 色表 // // 238,150,43 橙 // 229,207,192 暖灰 // 204,50,47 暗红// 项目设定 size(825, 984); // 设置画布(窗口)尺寸 background(…

主成分分析(PCA):探索数据的核心

文章目录 前言1. 什么是 PCA &#xff1f;2. PCA 的原理2.1 协方差和方差2.2 核心思想2.3 步骤 3. PCA 的应用场景4. PCA 的优缺点5. 示例&#xff1a;人脸识别5.1 完整代码5.2 运行结果 结语 前言 当今社会&#xff0c;数据无处不在。从社交媒体到金融交易&#xff0c;从医疗…

SpringBoot快速集成多数据源(自动版)

有些人因为看见所以相信&#xff0c;有些人因为相信所以看见 有目录&#xff0c;不迷路 前期准备实现演示参考 最近研究了一下多数据源&#xff0c;这篇博客讲的是简单模式&#xff0c;下篇博客预计写自动切换模式 前期准备 本篇博客基于SpringBoot整合MyBatis-plus&#xff0…

IBM介绍?

IBM&#xff0c;全名国际商业机器公司&#xff08;International Business Machines Corporation&#xff09;&#xff0c;是一家全球知名的美国科技公司。它成立于1911年&#xff0c;总部位于美国纽约州阿蒙克市&#xff08;Armonk&#xff09;&#xff0c;是世界上最大的信息…

通过国家网络风险管理方法提供安全的网络环境

印度尼西亚通过讨论网络安全法草案启动了其战略举措。不过&#xff0c;政府和议会尚未就该法案的多项内容达成一致。另一方面&#xff0c;制定战略性、全面的网络安全方法的紧迫性从未像今天这样重要。 其政府官方网站遭受了多起网络攻击&#xff0c;引发了人们对国家网络安全…

PiflowX组件-JDBCWrite

JDBCWrite组件 组件说明 使用JDBC驱动向任意类型的关系型数据库写入数据。 计算引擎 flink 有界性 Sink: Batch Sink: Streaming Append & Upsert Mode 组件分组 Jdbc 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默…

ES应用_ES原理

1 ES简介 Elasticsearch&#xff1a;基于Apache Lucene并使用Java开发的分布式开源搜索和分析引擎。是 Elastic Stack 的核心&#xff0c;它集中存储您的数据。 Elastic Stack&#xff1a;包括 Elasticsearch、Logstash 、 Kibana 和Beats &#xff08;也称为 ELK Stack&…

简写英语单词

题目&#xff1a; 思路&#xff1a; 这段代码的主要思路是读取一个字符串&#xff0c;然后将其中每个单词的首字母大写输出。具体来说&#xff0c;程序首先使用 fgets 函数读取一个字符串&#xff0c;然后遍历该字符串中的每个字符。当程序遇到一个字母时&#xff0c;如果此时…

Git使用教程 gittutorial

该教程对该文章的翻译&#xff1a;https://git-scm.com/docs/gittutorial 本文介绍怎用使用 Git 导入新的工程、修改文件及如何其他人同步开发。 首先&#xff0c; 可以使用以下指令获取文档帮助 git help log笔者注&#xff1a;不建议看这个文档&#xff0c;标准的语法介绍…