计算出租车行程

时间:2013-04-10 19:58:24

标签: algorithm combinatorics

假设我有N辆出租车,有N名顾客等着被出租车接走。客户和出租车的初始位置是随机/任意的。

现在我想将每辆出租车分配给一个客户。

客户都是固定的,出租车都以相同的速度移动。为简单起见,我们假设没有障碍物,出租车可以直线移动到指定的客户。

我现在希望最小化直到最后一位顾客进入他/她的出租车的时间。

是否有标准算法来解决这个问题?我有成千上万的出租车/客户。解决方案不一定是最佳的,只是'好'。

问题几乎可以建模为标准的“分配问题”,可以使用Hungarian algorithm(Kuhn-Munkres算法或Munkres分配算法)解决。但是,我希望最大限度地降低成本最高的分配成本,而不是最小化分配成本的总和。

4 个答案:

答案 0 :(得分:3)

既然你提到了匈牙利算法,我想你可以做的一件事是使用一些不同的距离测量而不是欧几里德距离,然后运行匈牙利算法。例如,而不是使用

d = sqrt((x0 - x1)^ 2 +(y1 - y0)^ 2)

使用

d =((x0 - x1)^ 2 +(y1 - y0)^ 2)^ 10

可能导致算法严重惩罚大数字,这可能会限制最大距离的长度。

编辑:本文“几何有助于瓶颈匹配和相关问题 问题“可能包含更好的算法。但是,我仍然在阅读它。

答案 1 :(得分:1)

我不确定匈牙利算法是否可以解决您的问题。根据链接,它运行n ^ 3次。插入25,000作为n将产生25,000 ^ 3 = 15,625,000,000,000。这可能需要一段时间才能运行。

由于解决方案不需要是最佳的,因此您可以考虑使用simulated annealinggenetic algorithm。这些中的任何一个都应该更快,并且仍然可以产生接近最佳的解决方案。

如果使用遗传算法,可以设计适应度函数以最小化个体需要等待的最长时间段。但是,你必须要小心,因为如果这是唯一的标准,那么当只有一辆最靠近最远的乘客的驾驶室时,解决方案将无法正常工作。因此,适应度函数也需要考虑其他等待时间。解决这个问题的一个想法是迭代运行模型并在每次迭代后移除最长的驾驶室行程(驾驶室和人员)。但是,对于所有10,000多辆出租车/人来说这样做可能会花费很多时间。

我认为任何出租车车主或经理都不会考虑尽量减少最后一位客户进入出租车的等候时间,以减少所有出租车等候时间的总和 - 仅仅是因为他们在最小化总和时总体上赚了更多钱等待时间。至少Louie DePalma永远不会这样做......所以,我怀疑你遇到的真正问题与出租车很少或没有任何关系......

答案 2 :(得分:0)

解决问题的“好”算法是Greedy Algorithm。由于出租车和人员有一个职位,这些职位可能与“中心”地点有关。对出租车和需要按顺序拾取的人进行排序(与“中心”相关)。然后开始按顺序分配出租车,以便按顺序接载人员。这个贪婪的规则将确保离中心最近的出租车能够接近离中心最近的人,最远的出租车最远可以接到最远的人。

更好的方法可能是使用Dynamic Programming但是,我不确定也没有时间投资。可以找到动态编程的好教程here

答案 3 :(得分:0)

对于最佳解决方案:构建一个加权的二分图,每个出租车和客户都有一个顶点,每个出租车到每个客户的边缘,其权重是旅行时间。按照非减少重量的顺序扫描边缘,保持包含到目前为止扫描的边缘的子图的最大匹配。当匹配完美时停止。