java OptaPlanner CVRPTW连续交付
我是OptaPlanner的新手,我正试图在我的项目中配置它以解决CVRPTW问题。我当前的配置与项目源代码中的示例非常相似,但我的要求不同。 我的应用程序在以下情况下连续收到交付请求:
- 平均服务时间为5分钟
- DueTime-ReadyTime=10分钟
- 地点之间的平均距离(时间)约为2.5分钟
- 只有一个仓库
我的想法是在每次收到新请求时重新运行求解算法。这对我理解请求是否可行或是否需要及时向前或向后移动是必要的。 如果考虑以下问题陈述(位置省略,但与仓库位置相当等距):
CUST_ID READY_TIME DUE_TIME SERV_DUR DEMAND
1 12:45:00 12:55:00 00:05:00 1
2 12:35:00 12:45:00 00:05:00 8
3 12:25:00 12:35:00 00:05:00 5
4 13:25:00 13:35:00 00:05:00 5
考虑到有2辆车可用,两辆车的容量都是10辆,我得到了以下解决方案(每辆车的时间表):
**Vehicle 1 Capacity 10 - delivery sequence starting from Depot [1]**
Cust[3] D: 5 Ar.T: 12:25:00 Ap.T: 12:23:08 Prev.D: 00:01:52 Next.D: 00:03:46
Cust[4] D: 5 Ar.T: 12:33:56 Ap.T: 12:30:00 Prev.D: 00:03:56 Next.D: --:--:--
**Vehicle 2 Capacity 10 - delivery sequence starting from Depot [1]**
Cust[2] D: 8 Ar.T: 12:35:00 Ap.T: 12:33:03 Prev.D: 00:01:57 Next.D: 00:03:05
Cust[1] D: 1 Ar.T: 12:42:47 Ap.T: 12:40:00 Prev.D: 00:02:47 Next.D: --:--:--
其中D是需求,Ar.T是到达时间,Ap。T是接近时间(需要离开前一个地点才能准时到达所选地点的时间),Prev。D是距离上一个位置和下一个位置的距离(时间)。D是距离以下位置的距离(时间)
正如您所看到的,客户4提前收到了发货(到达时间是12:33:56,而准备时间是13:25:00)。我知道规则到达时间是一个额外的软约束,但我希望规划师建议我使用预约交付方式交付给客户4。将规则arrivalbeforeadtime设置为额外的硬约束,大多数情况下,我会遇到以下异常:
org.drools.core.RuntimeDroolsException: java.lang.NullPointerException
at org.drools.core.base.accumulators.SumAccumulateFunction.reverse(SumAccumulateFunction.java:85)
我有两个问题:
- 当我遇到上述异常时,我是否应该将其视为“问题未解决”?还是我必须调整配置?这是我不应该得到的东西吗李>
- 我应该如何管理连续交付场景?我应该定义不同的大时间窗口来独立解决吗?但如何定义这些窗口的边界呢?以及如何管理跨边界计划的交付?(这个解决方案对我来说似乎不正确)
编辑1:
正在从6.0.0更新OptaPlanner版本。CR3到6.0.0。CR4-Pre1解决了NullPointerException。 文档中明确了实时计划,我已经在考虑以实时模式运行我的计划程序。但由于在上面的例子中,结果并不好,我试图理解我还能做些什么来应对这种情况。 我将规则ArrivalBeforReadyTime从软约束切换到硬约束,现在我没有得到NullPointerException,时间安排似乎得到了正确的管理,结果如下(例如):
问题陈述:
CUSTID RTIME DTIME SERVDUR DEMAND
1 12:45:00 12:55:00 00:05:00 5
2 12:35:00 12:45:00 00:05:00 3
3 12:25:00 12:35:00 00:05:00 10
4 14:25:00 14:35:00 00:05:00 2
解决方案
**Vehicle 1 Capacity 10 - delivery sequence starting from Depot [1]**
Cust[3] D: 10 Ar.T: 12:25:00 Ap.T: 12:23:08 Prev.D: 00:01:52 Next.D: 00:02:26
Cust[2] D: 3 Ar.T: 12:32:26 Ap.T: 12:30:00 Prev.D: 00:02:26 Next.D: 00:03:05
Cust[1] D: 5 Ar.T: 12:42:47 Ap.T: 12:40:00 Prev.D: 00:02:47 Next.D: --:--:--
**Vehicle 2 Capacity 10 - delivery sequence starting from Depot [1]**
Cust[4] D: 2 Ar.T: 14:25:00 Ap.T: 14:22:53 Prev.D: 00:02:07 Next.D: --:--:--
正如您所见,第一次交付是不可行的,因为需求的总和超过了车辆的容量。我应该假设它是正确的吗?我的意思是,在这种情况下,一个好的解决方案是使用这两种工具来管理客户1,2,3。我使用与示例相同的配置,车辆容量是一个硬约束。此外,客户2和客户1在准备时间之前就被送达,如果我对其使用硬约束的话
# 1 楼答案
如果你还没有读过repeated planning的一般文档,更具体地说是关于real-time planning的文档
您可以在演示中尝试实时规划,方法是在VRP地图解算时单击地图上的任何位置
该异常是一个bug(在您的代码或我们的代码中)。这不应该发生。阅读上述文档部分中的警告。如果您遵循了这些,并且认为错误不在代码中,那么请file a jira
如果医生没有明确回答这个问题,请告诉我
PS:确保你使用的是6.0.0。CR4。流口水<;=CR3有一个与VRP时间窗口中的阴影变量有关的错误