在 optaplanner 中每次移动后如何最好地触发代码?

How best to trigger code after each move in optaplanner?

我需要运行在每次移动结束时将计算存入内存,然后根据此更新分数。计算的结果需要是有状态的,因为它在其他地方被引用(存储在解决方案中)。

文档建议这应该是 PlanningEntity 更新为 ShadowVariableVariableListener在主要实体上,但当然这自然会触发每个实体更改,不必要地重新计算。

  1. 如何在 移动 结束时触发,而不是根据 变量 触发?来自流口水?这不是黑客攻击吗?
  2. 如果不使用 VariableListener,它将不再是 PlanningEntity。难道不是与文档相反的 ProblemFact 吗?缺点是什么?

更多信息:

1) 听起来你应该使用影子变量。请注意,您仍然需要一个普通约束来根据影子变量的状态更新分数。

请注意,您可以有一个影子实体 class,它是一个单例(每个问题解决方案),它有一个单独的影子变量,如果任何计划实体发生变化,该变量就会更新。在 @PlanningSolution class 的字段上使用 @PlanningEntityProperty(没有 Collection)。

在移动结束时,每个移动调用 triggerShadowVariableListeners(),而不是在中间。所以如果你担心性能,你不应该担心。 如果您担心正确性 - 因为调用次数会影响您的计算 - 那么请不要 design/implement 这样...

2) ProblemFacts 在求解过程中不能改变(不算实时规划)。没有一个领域。否则它是一个 PlanningEntity。

0) MoveListener 不存在,有意(出于充分的理由),甚至在内部也不存在(即使是非常内部的 PhaseLifecycleListener 也只听步骤,不听移动)。