动态定价,或Yandex.Taxi如何预测高需求



以前,要打出租车,他们必须打不同数量的派遣服务,并等待汽车交付半小时或更长时间。 现在出租车服务已经实现了高度自动化,Yandex.Taxi在莫斯科的出租车平均交付时间约为3-4分钟。 但是下雨或结束群众活动是值得的,而且我们可能再次遇到免费汽车的短缺。

我叫Anton Skogorev,我是Yandex.Taxi平台性能开发小组的负责人。 今天,我将告诉哈勃(Habr)的读者,我们如何学会预测高需求并吸引驾驶员,以便用户随时可以找到免费汽车。 您将学习如何形成影响订单价值的系数。 那里的一切远非乍看之下那么简单。


动态定价挑战


动态定价的最重要任务是始终提供订购出租车的机会。 它是通过使用激增定价系数实现的,乘以计算出的价格即可。 我们称其为激增。 重要的是要说,激增不仅可以调节出租车的需求,而且还可以吸引新的驾驶员以增加供应。

如果激增幅度太大,我们将减少太多需求,免费汽车将会过多。 如果设置得太低,用户将看到“没有免费的汽车”。 您需要选择一个系数,在缺乏免费汽车和需求低迷之间,我们将如履薄冰。

该系数应取决于什么? 立即想到依赖于用户周围的汽车和订单数量的想法。 现在,您可以简单地将订单数量除以驱动程序数量,获得系数并将其转化为带有某些公式(可能是线性的)的波动。

但是此任务中存在一个小问题-可能无法为用户计算订单数。 毕竟,定单几乎总是一台已经被占用的机器,这意味着系数的增加总是很晚。 因此,我们考虑的不是创建订单,而是订购汽车的意图 。 引脚是用户在启动我们的应用程序时在卡上粘贴的标签“ A”。



让我们提出问题:我们需要在用户的某个位置读取机器和引脚的瞬时值。

我们计算周围的大头针和小汽车数量


当图钉位置发生变化(用户选择点“ A”)时,用户应用程序会将新坐标和一小页附加信息发送到后端,这有助于更准确地评估图钉(例如,所选费率)。

我们尝试遵守微服务架构,其中每个微服务都从事单独的任务。 Surger微服务从事喘振的计算。 它注册了引脚,将其保存到数据库中,还更新了RAM中的引脚块,它们非常适合它们。 这种工作期间的缓存滞后只有几秒钟,在我们的情况下是可以接受的。

关于数据库的几句话
注册后,每个引脚都会通过TTL索引异步添加到MongoDb中,其中TTL是引脚的“生命周期”,我们认为该引脚在计算提升系数时处于活动状态。 用户在我们执行这些操作时不会等待。 即使出了问题,丢掉别针也不是什么大悲剧。



使用地理哈希索引构建热缓存。 我们通过geohash将所有销钉分组,然后在订购点周围收集所需半径的销钉。

我们对汽车也是如此,但是在另一种称为Tracker的服务中,Surger只是简单地提出了一个问题:“在这个半径范围内有多少个驾驶员。”

因此,我们考虑系数的瞬时值。



快取


案例 :您正站在莫斯科的花园环上,想预订一辆汽车。 同时,价格经常上涨,这很烦人。

人们已经了解了机械原理,可以理解这可能是由于这样的事实,即驾驶员在突击请求时聚集在有条件的交通信号灯处,而且很快就离开。 因此,涨价和价格可能会明显“跳跃”。

为避免这种情况,我们按用户缓存了电涌值。 当用户来找一个电涌时,我们会查看该用户是否在可接受的半径范围内保存了电涌值(该用户所有已保存电涌的线性浏览)。 如果有,我们将其退还,否则,我们将指望一个新的并保存它。

这很好用,但是还有其他情况。

案例 :2位用户请求增加。 当过去一个案例的交通信号灯发出的汽车已经离开时,一个命令比另一个命令晚30秒。 我们得到一张图片,其中2个几乎同时订购的用户会有明显不同的波动。

在这里,我们从用户缓存到位置缓存。 现在,我们不再仅由用户来缓存喘振值,而是从我们已经知道的geo哈希值开始缓存它。 因此,我们几乎可以解决该问题。 为什么差不多? 因为风水的边界可能有所不同。 但是问题并不那么严重,因为我们已经进行了平滑处理。

平滑处理


也许,在阅读有关交通信号灯的案例时,您发现根据交通信号灯考虑瞬间激增在某种程度上是不公平的。 我们也这样认为,因此我们想出了解决问题的方法。

我们决定从机器学习中借用最近邻法来解决回归问题,以便确定即时电涌的值与周围发生的变化有多少不同。

如方法的正式描述中所述,训练阶段包括存储所有对象-在我们的示例中,是引脚中电涌的计算值,在将所有引脚加载到缓存时,我们已经完成了所有这些工作。 小事情是计算瞬时值,将其与区域中的值进行比较,并同意我们不能偏离区域中的值太多。

因此,我们得到了一个对事件有快速响应的系统,并允许您快速读取递增系数的值。

浪涌驱动卡


为了与驾驶员进行交流,我们需要能够在驾驶员的应用程序(出租车计价器)中显示喘振图。 这为驾驶员提供了有关他现在所在的地区是否有需求以及应该搬到哪里以获取最昂贵订单的反馈。 对我们来说,这意味着更多的驾驶员将来到需求量大的地区并解决。



我们生活在这样一个范例中,即驱动程序的设备是一个相当弱的设备。 因此,浪涌的六角形网格的渲染位于后端侧。 客户端来到瓷砖的后端。 这些是剪切的栅格图像,可直接显示在地图上。

我们有一个单独的服务,该服务会定期从Surger微服务中提取针脚铸件,并计算渲染六边形网格所需的所有元信息:每个十六进制的位置和哪个浪涌的位置。

结论


动态定价是在不断寻求供求之间的平衡的方法,因此用户始终可以免费使用汽车,包括通过将额外的驾驶员吸引到高需求区域的机制。 例如,我们目前正在更深入地使用机器学习来计算波动。 在此方向的任务之一的框架内,我们正在学习确定将图钉转换为订单的可能性,并考虑此信息。 这里有足够的工作,所以我们总是很高兴团队中的新专家

如果您想更详细地了解这个大主题的一部分,请在评论中写。 也欢迎反馈和想法!

PS在下一个出版物中,我的同事将讨论使用机器学习来预测出租车的预计到达时间。

Source: https://habr.com/ru/post/zh-CN429226/


All Articles