【问题标题】:Optaplanner - timewindow is not fulfilledOptaplanner - 时间窗未完成
【发布时间】:2014-12-04 14:20:22
【问题描述】:

我正在使用 OptaPlanner 进行与业务相关的优化。

关于 6.1.0。最终版本:当我修改优化问题,使得车辆必须在时间窗口内到达(尽可能早和最晚到达时间,太早或太晚都会受到硬分数的惩罚)并且当我只乘坐 1 辆车时两个客户,其中时间窗 1 比时间窗 2 早得多(时间窗 1 的结束时间 + 到客户 2 的行驶时间

车辆 (2363) 首先从 270 号站点出发,到达客户 13 号(时间窗口为 8:50-10:50),并于 8:50 准确到达。工作时间有75分钟。 10:05发车,10:12到达客户16(时间窗口为15:45-17:45)。 在某些业务案例中,最好等待而不是过早到达。

如何强制车辆等待,以便及时到达下一位客户的位置?

PS:圆圈表示可能到达时间的时间窗口(内圈:0-12h,外圈:12-24h)。位置之间的时间和距离由 GraphHopper 确定

【问题讨论】:

    标签: optaplanner


    【解决方案1】:

    所以您想在之前的停顿处(= 之前的客户或仓库)等待,而不是在当前的客户处等待?

    在 OptaPlanner VRP 示例中,departureTime = arrivalTime + duration。所以arrivalTime 是一个影子变量(基于previousStandstill),而departmentTime 只是在此之上的一个计算(所以departureTime 本身不是影子变量,因为它甚至不是一个字段(或者换一种说法,因为它是不是 java 变量,它不能是计划变量(正版或影子)。

    在您的变体中,也将departureTime 设为影子变量,定义如下:departureTime = Math.max((arrivalTime + duration), nextCustomer.readyTime - drivingTime)。新的影子变量(因此它是 VariableListener)取决于计划变量 arrivalTimenextCustomer。所以阴影变量取决于阴影变量。 注意这个提案中没有循环:使用了 nextCustomer.readyTime,但 readyTime 是一个问题事实。

    您可能需要为此升级到6.2.0.CR2 或更高版本,因为6.1 可能还不支持依赖于影子变量的影子变量(我不记得了)。我还担心 optaplanner 不会自动重新排序变量侦听器触发尚未遵循层次结构(随意对此进行 jira),因此这意味着您必须使用变量侦听器声明 getter,如下所示:previousStandstill、nextCustomer、到达时间,出发时间。

    VariableListener 触发顺序将在未来的版本中更加形式化。

    【讨论】:

    • Optaplanner 6.2.0 中的示例“带时间窗口的车辆路线”是否在当前客户处实现了等待时间?我使用修改后的 XML-Input 文件对 3 个客户(8-9h、12-13h、16-17h)进行了测试。工作时间总是30分钟。只有第一个活动恰好在上午 8 点举行。在其他 2 个活动中,车辆过早到达。我看不到车辆在当前客户处等待。
    • 它有一个serviceDuration,见导入txt文件。但在 serviceDuration 完成后,车辆将驶向下一位客户。如果它太早到达下一位客户,它会在那里等到客户窗口打开,然后在此等待 serviceDuration。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    相关资源
    最近更新 更多