高效的公交车装载


10

这是我很久以前为一家公交旅行公司所做的事情,但我对结果并不满意。我最近在考虑那个旧项目,以为我会重新考虑这个问题。

问题:

巴士旅行公司有几辆载客量不同的巴士(例如15辆50座客车,25辆30座客车...等)。他们专门为大型团体(每团体300多名乘客)提供交通服务。由于每个团队都需要一起旅行,因此他们需要有效地管理其车队以减少浪费。

例如,三辆30座客车(2个空座位)要比2座50座客车(12个空座位)更好地服务88位乘客。再举一个例子,一架50人座的公共汽车和30人座的公共汽车(混合类型)将为75名乘客提供更好的服务。

有什么好的算法可以做到这一点?


3
别太挑剔,但是我会从巴士公司的角度怀疑,由于汽油成本仅朝着2辆公交车而不是3辆,汽油效率提高了2辆50辆,这实际上是您的做法吗?
Dunk 2012年

8
这听起来像背包问题,这是NP难题。实际上,给定路线的搜索空间应该很小。
chrisaycock 2012年

@Dunk-我将第一个承认我对巴士和旅游物流一无所知,但这他们的要求。他们甚至有一个高薪的顾问,他们是手工完成的。
系统停机

空座位无关紧要,算上是运营成本。因此看一下哲学家的答案。
Loren Pechtel 2012年

@LorenPechtel-就像我之前说过的那样,我不决定业务规则,而是执行它们。
系统停机

Answers:


8

这是垃圾箱问题的一个示例,该问题经常与背包问题混淆。在垃圾箱包装中,您具有一定容量的垃圾箱,并且您正在尝试将各种尺寸的物体分配到垃圾箱中。这个想法是使用最少数量的箱。

但是,您并不是要尽力减少垃圾箱的数量,而是要尽力减少空座位的数目。而且,您可能试图将整个机队的空座位数减至最少,也就是说,您有四个不同大小的旅行组,并且您希望为所有这些空座位容纳最少的空座位数。我想不出一个实例,但我想可能可以组建一支车队和一组旅行团,这样对于某些小组来说,采用不合格的解决方案会更好,因为它可以避免为其他小组使用更差的解决方案。

情况变得更糟。如果您有20,30和50辆客车怎么办。每个人使用不同数量的燃料,但运行50个燃料比运行20个和30个燃料效率更高。但是从我们的单一衡量标准(空座位数最少)来看,运行50个燃料是有意义的旅客游览。

而且,带有奇怪数字的公交车(例如28或39)会歪曲我们的许多快捷方式。

因此,根据情况的复杂性,您可以执行以下两项操作之一:

首先,穷举搜索树:使用总线的所有可能组合。如果您只有3或4种总线大小,这可能是一个合理的解决方案。否则,诸如“最佳拟合降低”之类的结果将产生合理的结果,而不是最佳的结果。


我无法想象为什么这个答案被否决了。竞相补偿。做得好。
戴维·康拉德

1

这是Python中的一个快速解决方案:

def add50(passengers, buses):
    proposed = buses + [50]
    if sum(proposed) < passengers:
        return add50(passengers, proposed)
    return proposed

def add30(passengers, buses):
    proposed = buses + [30]
    if sum(proposed) < passengers:
        proposed30 = add30(passengers, proposed)
        proposed50 = add50(passengers, proposed)
        return proposed30 if sum(proposed30) < sum(proposed50) else proposed50
    return proposed

print add30(88, [])
print add30(75, [])
print add30(105, [])

当我运行它时,我得到:

[30, 30, 30]
[30, 50]
[30, 30, 50]

该代码在可能的情况下进行了深度优先搜索。由于顺序无关紧要([30, 50]与相同[50, 30]),我们可以通过仅添加相同大小或更大的总线来使搜索空间小得多。这就是为什么add30()可以致电add50(),而不是相反的原因。


0

我将从客户的角度回答这个问题。我不想为此应用程序使用硬编码算法。有太多的变量可以随时间变化。尽管关于您的公交车的一切都不会改变,但这些因素的权重可能会发生变化,或者可能会发现我从未想到的新因素(例如,加班,法律和其他驾驶员费用)。

因此,我希望能够根据所请求的乘客数量范围创建自己的查找表,并且我将为最佳公交车组合创建自己的设置。例如:31-50 = 1 X 50,51-60 = 2 X30。是否真的需要计算?比起一系列考虑座位,汽油和驾驶员因素的公式,更改设置更容易。找出最佳组合并完成它,并留出足够的空间供用户根据自己的意愿更改这些设置。

可以发现新的因素。大型巴士的通行费是否会成倍增加?当一部载有30名以上乘客的公共汽车的新的附加认证和许可法律出台时,我能为小型公共汽车的司机提供便宜些的服务吗?

他们聘请了一位新顾问,但其逻辑与他们的公式不同,因此您的应用可能需要重写。您的意思是您必须考虑停车费用?


这是行不通的:31-50 = 50座公共汽车,除非它们已经被其他团体使用,服务中断或由于其他原因而无法使用。从这个问题出发,拥有15辆50人座公共汽车的公共汽车公司很可能一次拥有多个客户。
MSalters 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.