Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Optaplanner-CVRP-中途返回车辆段_Java_Optaplanner_Vehicle Routing - Fatal编程技术网

Java Optaplanner-CVRP-中途返回车辆段

Java Optaplanner-CVRP-中途返回车辆段,java,optaplanner,vehicle-routing,Java,Optaplanner,Vehicle Routing,我的问题是对的修改,最终将包括时间窗口 由于示例中已经内置了时间窗口,所以我应该不太难理解它们。然而,我需要更改CVRP示例的一个核心约束,我对如何做有些茫然 我的模型 在我尝试建模的系统中,车辆可以离开其仓库,前往多个不同的客户,然后装载物料。然而,我的模型与示例不同之处在于车辆可以访问任何仓库中链以存放其当前负载 问题 我一直在研究如何做到这一点,到目前为止,我的基本理解是,我必须更改仓库(可能通过实施静止)的定义,以便能够成为车辆访问的位置链的一部分,和/或可能只是将仓库整合到客户中,使用

我的问题是对的修改,最终将包括时间窗口

由于示例中已经内置了时间窗口,所以我应该不太难理解它们。然而,我需要更改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 {
        ...
    }