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 可以穿透它。但这不是你的问题。
ArrivalTimeUpdatingVariableListener 的这一行似乎有错误:
protected void updateArrivalTime(ScoreDirector scoreDirector, TimeWindowedCustomer sourceCustomer) {
Standstill previousStandstill = sourceCustomer.getPreviousStandstill();
Long departureTime = (previousStandstill instanceof TimeWindowedCustomer)
? ((TimeWindowedCustomer) previousStandstill).getDepartureTime() : null;
没有考虑 vehicle.getDepot().getReadyTime()
。
首先,感谢参与这个伟大图书馆的人们。
我的约束是:
- 我有一些客户已经做好准备和截止时间。
- 以及也有准备时间和截止时间的车辆。
我在 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 可以穿透它。但这不是你的问题。
ArrivalTimeUpdatingVariableListener 的这一行似乎有错误:
protected void updateArrivalTime(ScoreDirector scoreDirector, TimeWindowedCustomer sourceCustomer) {
Standstill previousStandstill = sourceCustomer.getPreviousStandstill();
Long departureTime = (previousStandstill instanceof TimeWindowedCustomer)
? ((TimeWindowedCustomer) previousStandstill).getDepartureTime() : null;
没有考虑 vehicle.getDepot().getReadyTime()
。