Optaplanner VRP增量分数过度约束规划

时间:2017-03-11 12:48:25

标签: optaplanner

我想通过过度约束的计划为VRP创建增量分数。我创建了一个aditional虚拟车辆,其中包括所有未计划的客户。

问题在于,当optaplanner将客户转移到其他车辆时,它会调用afterVariableChanged并使用变量名称previousStandstill,并且该客户的车辆不会刷新。然后,我不知道该客户的车辆,我不知道我是否需要增加软成本或没有(对于虚拟车辆,我无法增加成本)。

如何解决这个问题?

示例:

Optaplanner将Customer1从Vehicle1移至Vehicle2:

beforeVariableChanged:  previousStandstill(Customer1),  customer.GetVehicle() = Vehicle1
beforeVariableChanged:  nextCustomer(Customer0),        customer.GetVehicle() = Vehicle1
afterVariableChanged:   nextCustomer(Customer0),        customer.GetVehicle() = Vehicle1
afterVariableChanged:   previousStandstill(Customer1),  customer.GetVehicle() = Vehicle1
beforeVariableChanged:  vehicle(Customer1),             customer.GetVehicle() = Vehicle1
afterVariableChanged:   vehicle(Customer1),             customer.GetVehicle() = Vehicle2

当我得到afterVariableChanged:previousStandstill(Customer1),在customer.GetVehicle()中我有旧的车辆价值,我不知道是否需要增加软成本(虚拟车辆成本被忽略)。 有没有什么方法可以在afterVariableChanged中获得实际车辆 - previousStandstill而不是afterVariableChanged - vehicle。

1 个答案:

答案 0 :(得分:1)

检查是否使用AnchorShadowVariable注释了vechicle字段:

@AnchorShadowVariable(sourceVariableName = "previousStandstill")
public VehicleNode getVehicleNode() {
    return vehicleNode;
}

该注释告诉Optaplanner更新vechicle字段。