我们有一个配送中心(仓库),我们实时获得订单,其距离仓库和其他订单位置的时间/距离是已知的。
时间矩阵=
W O1 O2 O3
W 0 5 20 2
O1 5 0 21 7
O2 20 21 0 11
O3 2 7 11 0
订单时间O1 = 10:00 AM
订单时间O2 = 10:20 AM
O3的订购时间=上午10:25
我想订购尽可能多的订单,以便任何订单的交货时间不超过订单时间的2小时。因此,问题是减少旅行次数(旅行是在送货代理人送货时)。
我正在尝试为此提出算法。
时有两个相互竞争的因素我们可以按顺序组合顺序中的所有订单,直到它在订购时间的2小时内满足订单交付的约束。
我们可以修改上述方法来找到瓶颈订单(由于我们现在无法在方法1中订购更多订单)。并将它从trip1中取出并使其成为行程2(新订单)的一部分并等待其他订单以trip1或trip2取决于它。
所有订单都是实时发送的。什么是征服这种情况的最佳方法。如果您需要更清楚,请告诉我。
答案 0 :(得分:0)
非常安全且简单的算法,保证不超过订单的最长等待时间:
让TSP()
成为一个函数,它返回访问给定位置所花费的时间估计值。估计是悲观的,即实际的骑行时间可以更短或等于估计,但不会更长。为了良好的开端,您可以非常轻松地以贪婪的方式实施TSP()
:从每个地方前往最近的地方。您可以减去从W出来的较长边的长度以获得更好的估计(因此汽车将始终从W出来的较短边缘)。如果TSP()
碰巧是最优的,那么这里给出的整个算法也是最优的。整体算法与TSP()
实现一样好,它在很大程度上取决于良好的估计。
让earliestOrderTime
成为最早未处理订单的时间。
每分钟重复一次:
如果有新订单:如果s
为空,请将earliestOrderTime
设置为当前时间。将其添加到集s
。计算t = TSP(s + W)
。
如果(当前时间+ t
> = earliestOrderTime
+ 2小时):发送一辆汽车进行TSP(s + W)
行程。将s
设为空集。
对于您的示例性数据,它将如下工作:
10:00。 earliestOrderTime
= 10:00。 s = {O1}
。 t = TSP({01, W}) = 10 - 5 = 5
。
10:00 + 0:05< 10:00 + 2:00,所以我们还没发车,我们等。
...
10:20。 s = {O1, O2}
。 t = 46 - 20 = 26
。
10:20 + 0:26< 10:00 + 2:00,所以我们等。
...
10:25。 s = {O1, O2, O3}
。 t = 2 + 7 + 21 + 20 - 20 = 30
。
10:25 + 0:30< 10:00 + 2:00,所以我们等。
...
11.30
11:30 + 0:30> = 10:00 + 2:00,我们发送汽车前往O3
,O1
,O2
并返回{ {1}}。他在11:32,1:39,12:00访问订单,并在12:20回来。等待67分,99分钟和100分钟的人。