在我的Optaplanner模型中,我有一个在不同位置(PlanningVariable)进行计划的工作单(PlanningEntity)。
已连接几个工单。 它不是纯链。多个WorkOrder可以连接到一个,一个可以连接到以下几个。
订单有一个开始和停止变量,我在规则中使用它来防止一次在一个地方出现多个订单,依此类推。 它们还具有持续时间(内部变量-在评分规则中未使用),并且对于某些WorkOrder(主要是纯传输),持续时间由于先前的WorkOrders位置和随后的WorkOrders位置而发生变化
现在,我通过侦听器类开始和停止CustomShadowVariable引用位置PlanningVariable。在该监听器中,由于位置不同,我将重新计算所有持续时间,并相应地设置开始和结束值。
@CustomShadowVariable(variableListenerClass =
StartTimeUpdatingVariableListener.class,
sources = { @PlanningVariableReference(variableName = "workLocation")})
public Date getStart() {
return start;
}
和
@CustomShadowVariable(variableListenerRef =
@PlanningVariableReference(variableName = "start"))
public Date getStop() {
return stop;
}
在断言模式(完全和快速)下,已解决的场景似乎很好,但由于shadowvariables,我的分数出现了损坏:
VariableListener corruption: the entity (WorkOrder{…})'s shadow variable (WorkOrder.start)'s corrupted value (Fri Mar 23 20:02:41 CET 2018) changed to uncorrupted value (Fri Mar 23 20:02:36 CET 2018) after all VariableListeners were triggered without changes to the genuine variables.
Maybe the VariableListener class (StartTimeUpdatingVariableListener) for that shadow variable (WorkOrder.start) forgot to update it when one of its sources changed after completedAction (Initial score calculated).
仅在一个位置更改变量start,并在该位置通知scoreDirector:
scoreDirector.beforeVariableChanged(order, "start");
order.setStart(newStart);
scoreDirector.afterVariableChanged(order, "start");
我对如何进行到底有什么看法。