【问题标题】:OptaPlanner Vehicle Routing - Time Window for vehiclesOptaPlanner Vehicle Routing - 车辆的时间窗口
【发布时间】:2016-10-27 09:26:30
【问题描述】:

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

我的限制是:

  • 我的客户已经准备好和到期了。
  • 还有车辆也有准备和到期时间。

我在 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>

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

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

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

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

Geoffrey De Smet,非常感谢您的快速回复,非常感谢。我已经尝试过您的更改。根据仓库的 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 的格式,这个编辑没问题。

【问题讨论】:

    标签: java drools optaplanner


    【解决方案1】:

    我记得在 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()

    【讨论】:

    • 哇,真快:) 你能添加错误修复代码吗?或者有什么方法可以访问 7.0.0.Beta3 文件?
    • 查看 jira 问题中的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2020-08-04
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多