有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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. 当我遇到上述异常时,我是否应该将其视为“问题未解决”?还是我必须调整配置?这是我不应该得到的东西吗
  2. 我应该如何管理连续交付场景?我应该定义不同的大时间窗口来独立解决吗?但如何定义这些窗口的边界呢?以及如何管理跨边界计划的交付?(这个解决方案对我来说似乎不正确)

编辑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) 个答案

  1. # 1 楼答案

    如果你还没有读过repeated planning的一般文档,更具体地说是关于real-time planning的文档

    您可以在演示中尝试实时规划,方法是在VRP地图解算时单击地图上的任何位置

    1. 该异常是一个bug(在您的代码或我们的代码中)。这不应该发生。阅读上述文档部分中的警告。如果您遵循了这些,并且认为错误不在代码中,那么请file a jira

    2. 如果医生没有明确回答这个问题,请告诉我

    PS:确保你使用的是6.0.0。CR4。流口水<;=CR3有一个与VRP时间窗口中的阴影变量有关的错误