我是OptaPlanner的新手,我正在尝试在我的项目中对其进行配置以解决CVRPTW问题。我当前的配置与您可以在项目的源代码中找到的示例非常相似,但是我的要求是不同的。
我的应用程序不断收到交付请求,其中:
平均服务时间为5分钟
DueTime-ReadyTime = 10分钟
位置之间的平均距离(时间上)约为2.5分钟
只有1个仓库
我的想法是每当收到新请求时重新运行求解算法。对于我来说,了解请求是否可行或是否需要在时间上向前或向后移动很有必要。
如果考虑以下问题说明(位置省略,但与仓库位置相当等距):
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是距先前位置的距离(时间) Next.D是到以下位置的距离(时间)。
如您所见,客户4过早收到了交货(到达时间为12:33:56,准备时间为13:25:00)。我了解规则ArrivingBeforeReadyTime是一个额外的软约束,但是我希望计划者建议我使用预留的交付方式交付给客户4。设置规则arrivingBeforeReadyTime作为额外的硬约束,大多数情况下,我会收到以下异常:
org.drools.core.RuntimeDroolsException: java.lang.NullPointerException
at org.drools.core.base.accumulators.SumAccumulateFunction.reverse(SumAccumulateFunction.java:85)
我有两个问题:
当我遇到上述异常时,是否应该将其视为“未解决的问题”?还是我必须调整配置?是我不应该得到的东西吗?
我应该如何管理连续交货方案?我是否必须定义不同的大型时间窗口以独立解决?但是如何定义这些窗口的边界?以及如何管理跨边界计划的交付? (此解决方案对我来说似乎不正确)
编辑1:
将OptaPlanner版本从6.0.0.CR3更新到6.0.0.CR4-Pre1解决了NullPointerException。
该文档对实时计划很明确,我已经在考虑以实时模式运行计划程序。但是由于在上面的示例中结果并不理想,所以我试图了解我可以做些什么来处理这种情况。
我将规则arrivingBeforeReadyTime从软约束转换为硬约束,现在我没有得到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客户。我正在使用示例的相同配置,但将VehicleCapacity作为硬约束。而且,如果我在使用硬约束的情况下,也会在准备时间之前为客户2和1提供服务。
最佳答案
如果还没有,请先阅读repeated planning上的文档,尤其是关于real-time planning的文档。
您可以在解决方案中单击VRP地图上的任意位置,以尝试在演示中进行实时计划。
该异常是一个错误(在您的代码或我们的代码中)。它永远不会发生。阅读上述文档部分中的警告。如果您遵循了这些规定,并认为该错误不在您的代码中,请file a jira。
让我知道文档是否没有明确回答这个问题。
PS:请确保您使用的是6.0.0.CR4。 Drools