我正在使用OptaPlanner进行与业务相关的优化。
关于6.1.0。最终版本:当我修改优化问题时,车辆必须到达时间窗口内(尽可能早和可能的最晚到达时间,过早或过晚都会受到硬分数的惩罚)以及当我只带一辆车时两个客户,其中时间窗口1比时间窗口2(时间窗口1的结束+到客户2的时间和时间窗口2的开始时间)早得多,然后车辆恰好在最早的时间满足时间窗口1,但到达客户2也是如此早。
车辆(2363)首先从仓库270开始到客户13(时间窗口是8:50-10:50)并且恰好在8:50到达。工作时间为75分钟。出发时间是10:05,车辆在客户16的10点12分到达(时间窗口是15:45-17:45)。 在某些商业案例中,最好等到太早到达。
如何强制车辆等待,以便及时到达下一位客户的位置?
PS:圆圈显示可能到达时间的时间窗口(内圈:0-12h,外圈:12-24h)。位置之间的时间和距离由GraphHopper
确定答案 0 :(得分:1)
所以你想等待之前的停顿(=以前的客户或仓库),而不是现在的客户?
在OptaPlanner VRP示例中,departureTime = arrivalTime + duration
。所以arrivalTime
是一个影子变量(基于previousStandstill
),而离开时间只是一个计算(因此departureTime
本身不是影子变量,因为它不是偶数一个字段(或者换一种方式,因为它不是一个java变量,它不能是一个计划变量(真实或阴影))。
在您的变体中,也将departureTime
设为阴影变量,定义如下:departureTime = Math.max((arrivalTime + duration), nextCustomer.readyTime - drivingTime)
。新的影子变量(以及它的VariableListener)取决于计划变量arrivalTime
和nextCustomer
。所以阴影变量取决于影子变量。
请注意此提案中的NO周期如何:使用nextCustomer.readyTime,但readyTime是一个问题事实。
您可能需要升级到6.2.0.CR2
或更高版本,因为6.1可能还不支持依赖阴影变量的阴影变量(我不再记得)。我还担心optaplanner不会自动重新排序变量监听器触发但仍然遵循层次结构(随意制作一个jira),这意味着你必须使用变量监听器声明getter,如下所示: previousStandstill,nextCustomer,arrivalTime,departureTime。
在未来的版本中,VariableListener触发顺序将更加正式化。