出于对二分图匹配问题的兴趣,接下来会从缘起、原理、打车匹配、外卖匹配来深入了解二分图匹配算法。
先从吴军老师在《得到》专栏里的一篇文章“打车软件匹配人和车是否比下围棋还复杂?”说起。
滴滴的人说打车调度比下围棋的算法还难
- 围棋只有19*19个=361个格子
- 把滴滴的车作为棋盘的行序列,打车的人比作纵序列,那交叉点比361要多很多
- 如果按公布的数字,车辆在千万级别,打车的人在亿级别,那组合可能是亿亿
吴军老师说打车匹配问题并没有想象的这么复杂
- 优步的车在全球范围内可比滴滴一点也不小,但是,从来没有听优步的人讲匹配问题多么复杂
- 和打车匹配相似的问题很多,这类问题在数学上是等价的,也就是说,一个问题解决了,其他的也就都迎刃而解了。
- Google的广告匹配问题:Google搜索的关键词和相应的广告匹配也是一个多对多的问题。有人说把最相关的、出价最高的广告显示在搜索页不就完了?其实问题哪儿有那么简单,因为并非相关的广告就会被点击,而且每个广告主每天都有预算的,你不能在一天早上五分钟就把出价最高的广告显示完,这样晚上上网的人就看不到广告了。如果再考虑到每个人点击习惯的不同,那么广告的展示策略就很有讲究了。
- Facebook的个性化广告:你可以把每一个Facebook的用户看成一个打车人,每个广告商当作一辆车,这个匹配和打车匹配非常像。注意,由Facebook的广告商也有预算,因此它可不是像电视台那样广播式的,把一种广告推给所有人,而是要一对一地推送,以便把几乎所有广告商的预算都花完。
- 交友网站的匹配:你可以把男性看成打车人,女性看成出租车司机,那么他们的匹配也和打车匹配等价。
- 亚马逊的推荐。
显然,你也没有听说上面任何一家公司说过匹配问题比下围棋难。那么这说明两个可能性必居其一:
- 第一个可能性,滴滴的人夸大其辞,以便吸引眼球;
- 第二个可能性,滴滴的人技术太差,搞不清楚下围棋的复杂度,也找不到自己问题的最佳算法。
这两类问题的复杂度:
- 下围棋的问题比较好分析。它有361个格子,每个格子都有三种可能性,黑棋、白棋和空格。由于在每一个格子落子都是随意的,因此有3的361次方种可能性,大约是10的172次方。
- 匹配问题的复杂度有多大呢?具体讲,如果整个网络中有M个人,N辆车,一一配对,复杂度只有M乘以N那么多,即O(M*N)。我们假定中国有1亿辆车同时在服务,全国10亿人都在路边等着打车,那么复杂度不过是十亿亿,即10的17次方,这个数字看上去不小,用1000台服务器也要算几个小时。事实上,不可能全国的人和车都在一个城市里。考虑到分散性之后,全中国所有打车匹配的计算量不超过几百亿,如果用1000台服务器算,是眨眼间就可以完成。
最后总结:
- 很多看似同样复杂的问题,可能真实的复杂度相差甚远。我们有时觉得一件事很复杂,是因为没有找到好办法。
- 对人来讲也是如此,两个看上去教育背景和经历差不多的人,本身的差距可能是数量级的,而见识上的差距就更大了。
- 很多看似不同的问题,其实它们背后的数学原理都是相同的,这也是为什么学习数学和善用数学工具很重要的原因。
- 对于媒体上的话,要有甄别能力。