OptaPlanner车辆路线 - 车辆时间窗

时间:2016-10-27 09:26:30

标签: java drools optaplanner

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

我的约束是:

  • 我的客户已准备就绪。
  • 还有准备好和适当时间的车辆。

我没有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的格式进行此编辑。

1 个答案:

答案 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()