首先,感谢那些参与这个伟大图书馆的人。
我的约束是:
我没有Java经验,我尝试使用提供的示例项目发送和接收xml来使用OptaPlanner。对于客户时间窗口,我使用了“VrmTimeWindowedCustomer”并且没有问题。对于车辆时间窗口约束,我尝试使用“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>
客户的到货时间对客户来说是好的,但小于该车辆的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问题的评论,但我无法唱歌并登录。我希望根据Stackoverflow的格式进行此编辑。
答案 0 :(得分:2)
我记得在txt导入器(see this line)中与车辆/仓库的到期时间相关的示例中做了一个黑客攻击。那还没有被清除,所以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()
。