Java Optaplanner-CVRP-中途返回车辆段
我的问题是对的修改,最终将包括时间窗口 由于示例中已经内置了时间窗口,所以我应该不太难理解它们。然而,我需要更改CVRP示例的一个核心约束,我对如何做有些茫然 我的模型 在我尝试建模的系统中,Java Optaplanner-CVRP-中途返回车辆段,java,optaplanner,vehicle-routing,Java,Optaplanner,Vehicle Routing,我的问题是对的修改,最终将包括时间窗口 由于示例中已经内置了时间窗口,所以我应该不太难理解它们。然而,我需要更改CVRP示例的一个核心约束,我对如何做有些茫然 我的模型 在我尝试建模的系统中,车辆可以离开其仓库,前往多个不同的客户,然后装载物料。然而,我的模型与示例不同之处在于车辆可以访问任何仓库中链以存放其当前负载 问题 我一直在研究如何做到这一点,到目前为止,我的基本理解是,我必须更改仓库(可能通过实施静止)的定义,以便能够成为车辆访问的位置链的一部分,和/或可能只是将仓库整合到客户中,使用
车辆可以离开其仓库
,前往多个不同的客户
,然后装载物料。然而,我的模型与示例不同之处在于车辆
可以访问任何仓库
中链以存放其当前负载
问题
我一直在研究如何做到这一点,到目前为止,我的基本理解是,我必须更改仓库
(可能通过实施静止
)的定义,以便能够成为车辆访问的位置链的一部分,和/或可能只是将仓库
整合到客户
中,使用某种特殊规则,即访问仓库
会清空车辆,而不是增加需求
我也一直在研究阴影变量和变量侦听器,但我不知道这是否是正确的方法。这一切都有点令人困惑
在我把自己挖得太深之前,谁能给我一些提示或建议,或者给我指出正确的方向,从哪里开始 根据杰弗里的建议,将您的车辆
类重命名为VehicleTrip
,通过给它一个值previousVehicleTrip
和nextVehicleTrip
,让它指向上一次和下一次行程,并给它一个可变的开始时间和结束时间(Kotlin中的代码示例):
您可以在启动车辆trips
时设置这些值。当基于VehicleTrip.hashCode()
得到StackOverflowerError
时,只需重写VehicleTrip
类的hashCode()
函数。(也许有人有更好的建议来处理这个问题?)
更新阴影变量。
在Customer
类中,应该有一个变量arrivalTime
(如CVRPTW示例中所示),它是一个自定义的影子变量。在该变量的listener类中,您通常只更新车辆到达客户处的时间,以及这次旅行中下一位客户的到达时间。现在,您还需要更新当前客户旅行后的所有旅行时间
例如,您可能有两个行程VT1
和VT2
,以及三个客户C1
、C2
和C3
。从
VT1 - C1 - VT2 - C2 - C3
到
您希望更新的内容是(按顺序)
C2.到达时间
C1.到达时间
VT1.endTime
VT2.startTime
C3.到达时间
VT2.endTime
请注意,在TimeWindowedCustomer
示例中,变量侦听器仅执行步骤1。和2.,因此我们必须添加步骤3。直到6点
为此,首先向VehicleTrip
的开始和结束时间添加@CustomShadowVariable
注释(不要忘记将VehicleTrip
标记为规划实体),该注释使用与时间窗口客户相同的变量侦听器类:
class VehicleTrip(
...,
@CustomShadowVariable(
variableListenerRef = PlanningVariableReference(
entityClass = TimeWindowedCustomer::class,
variableName = "arrivalTime"
))
var startTime: LocalDateTime? = null,
...
) : Standstill {
...
}
现在在ArrivalTimeUpdateingVariableListener
类中,可以添加步骤3。直到6点。与步骤1类似。二,。这些都得到了实施。确保您保持更新这些变量的顺序,并且在使用beforeVariableChanged()
和afterVariableChanged()
方法更改变量时通知ScoreDirector
将车辆类别重命名为VehicleTrip,这样一辆车可以进行多次旅行?如果您有时间窗,则将每辆车的行程连接到上一次行程(提前确定)。给每辆车3次左右的行程。@GeoffreyDeSmet如果我这样做了,我仍然需要一些方法来连接它们,我不知道如何让解算器考虑到这一点。如何将每辆车的结束时间链接到另一辆车的开始时间?同样,我想做一个可变的监听器,但我不完全理解这些内容。请回答您的问题,并提供指向所提到的文档的链接。也许一些或视觉草图模型可以显示您的尝试,并为我们提供一个开始指导您的基础。
VT1 - C2 - C1 - VT2 - C3
class VehicleTrip(
...,
@CustomShadowVariable(
variableListenerRef = PlanningVariableReference(
entityClass = TimeWindowedCustomer::class,
variableName = "arrivalTime"
))
var startTime: LocalDateTime? = null,
...
) : Standstill {
...
}