OptaPlanner 车辆路线 - 车辆时间 Window

OptaPlanner Vehicle Routing - Time Window for vehicles

首先,感谢参与这个伟大图书馆的人们。

我的约束是:

我在 Java 方面没有经验,我尝试使用提供的示例项目通过发送和接收 xml 来使用 OptaPlanner。对于客户时间 window,我使用了 "VrmTimeWindowedCustomer" 并且没有问题。对于车辆时间 window 约束,我尝试使用 "VrpTimeWindowedDepot"

我的想法是:当一个站点可用时 (ReadyTime),车辆从该站点开始工作并前往客户。然而,在我的尝试中,OptaPlanner 并没有给出我期望的结果:

<depotList id="139">
    <VrpTimeWindowedDepot id="140">
      <id>1</id>
      <location class="VrpRoadLocation" reference="3"/>
      <readyTime>540000</readyTime>
      <dueTime>1020000</dueTime>
    </VrpTimeWindowedDepot>
    <VrpTimeWindowedDepot id="141">
      <id>2</id>
      <location class="VrpRoadLocation" reference="5"/>
      <readyTime>540000</readyTime>
      <dueTime>1020000</dueTime>
    </VrpTimeWindowedDepot>
  </depotList>

结果是:

<VrpVehicle id="143">
      <id>1</id>
      <capacity>100001002</capacity>
      <depot class="VrpTimeWindowedDepot" reference="140"/>
      <nextCustomer class="VrpTimeWindowedCustomer" id="144">
        <id>42</id>
        <location class="VrpRoadLocation" reference="85"/>
        <demand>206</demand>
        <previousStandstill class="VrpVehicle" reference="143"/>
        <nextCustomer class="VrpTimeWindowedCustomer" id="146">
           ...
        <vehicle reference="143"/>
        <readyTime>0</readyTime>
        <dueTime>1440000</dueTime>
        <serviceDuration>12000</serviceDuration>
        <arrivalTime>22137</arrivalTime>
      </nextCustomer>
      <vehicle reference="143"/>
      <readyTime>0</readyTime>
      <dueTime>1440000</dueTime>
      <serviceDuration>12000</serviceDuration>
      <arrivalTime>8527</arrivalTime>
    </nextCustomer>
  </VrpVehicle>

客户的 ArrivalTime 对客户来说是可以的,但小于该车辆的 Depot ReadyTime。

我在这里找不到我做错了什么。 我已阅读 Optaplanner - availability of Vehicles 和 OptaPlanner 文档;但无法理解和弄清楚我的情况该怎么做。

我也无法理解 drl 文件的语法,也找不到说明如何编写的文档。

编辑 - Geoffrey De Smet 的另一个问题

Geoffrey De Smet,非常感谢您的快速回复,非常感谢。我试过你的改变。根据 Depot 的 ReadyTime,到达时间现已确定。然而,关于 Depot 的 DueTime 可能存在另一个问题:

   <VrpTimeWindowedDepot id="144">
      <id>3</id>
      <location class="VrpRoadLocation" reference="7"/>
      <readyTime>540000</readyTime>
      <dueTime>1020000</dueTime>
    </VrpTimeWindowedDepot>

最后一位要访问该站点车辆的客户是:

<nextCustomer class="VrpTimeWindowedCustomer" id="183">
  <id>36</id>
  <location class="VrpRoadLocation" reference="73"/>
  <demand>187</demand>
  <previousStandstill class="VrpTimeWindowedCustomer" reference="182"/>
  <vehicle reference="146"/>
  <readyTime>0</readyTime>
  <dueTime>1440000</dueTime>
  <serviceDuration>10000</serviceDuration>
  <arrivalTime>1082091</arrivalTime>
</nextCustomer>

到达时间应该小于1020000吧? (3 个车厂有 3 辆车。在解决方案中只涉及 2 辆车,都有这样的完成时间。)

我试图将此添加为对 PLANNER-680 JIRA 问题的评论,但我无法注册和登录。我希望这个编辑可以根据 Whosebug 的格式进行。

我记得在与 txt 导入器 (see this line) 中 vehicle/depot 的到期时间相关的示例中进行了破解。那还没有清理干净,所以 XML 可以穿透它。但这不是你的问题。

A​​rrivalTimeUpdatingVariableListener 的这一行似乎有错误:

    protected void updateArrivalTime(ScoreDirector scoreDirector, TimeWindowedCustomer sourceCustomer) {
        Standstill previousStandstill = sourceCustomer.getPreviousStandstill();
        Long departureTime = (previousStandstill instanceof TimeWindowedCustomer)
? ((TimeWindowedCustomer) previousStandstill).getDepartureTime() : null;

没有考虑 vehicle.getDepot().getReadyTime()