我是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

09-05 06:21