在 optaplanner 中每次移动后如何最好地触发代码?
How best to trigger code after each move in optaplanner?
我需要运行在每次移动结束时将计算存入内存,然后根据此更新分数。计算的结果需要是有状态的,因为它在其他地方被引用(存储在解决方案中)。
文档建议这应该是 PlanningEntity 更新为 ShadowVariable 和 VariableListener在主要实体上,但当然这自然会触发每个实体更改,不必要地重新计算。
- 如何在 移动 结束时触发,而不是根据 变量 触发?来自流口水?这不是黑客攻击吗?
- 如果不使用 VariableListener,它将不再是 PlanningEntity。难道不是与文档相反的 ProblemFact 吗?缺点是什么?
更多信息:
- "calculation" 是规划期间流网络值的预测,其中流水平取决于任务的当前位置。
- 我们正在使用实时计划,因此计划周期 window 会根据任务集大小进行调整,并随时间变化。
1) 听起来你应该使用影子变量。请注意,您仍然需要一个普通约束来根据影子变量的状态更新分数。
请注意,您可以有一个影子实体 class,它是一个单例(每个问题解决方案),它有一个单独的影子变量,如果任何计划实体发生变化,该变量就会更新。在 @PlanningSolution
class 的字段上使用 @PlanningEntityProperty
(没有 Collection
)。
在移动结束时,每个移动调用 triggerShadowVariableListeners()
,而不是在中间。所以如果你担心性能,你不应该担心。
如果您担心正确性 - 因为调用次数会影响您的计算 - 那么请不要 design/implement 这样...
2) ProblemFacts 在求解过程中不能改变(不算实时规划)。没有一个领域。否则它是一个 PlanningEntity。
0) MoveListener 不存在,有意(出于充分的理由),甚至在内部也不存在(即使是非常内部的 PhaseLifecycleListener 也只听步骤,不听移动)。
我需要运行在每次移动结束时将计算存入内存,然后根据此更新分数。计算的结果需要是有状态的,因为它在其他地方被引用(存储在解决方案中)。
文档建议这应该是 PlanningEntity 更新为 ShadowVariable 和 VariableListener在主要实体上,但当然这自然会触发每个实体更改,不必要地重新计算。
- 如何在 移动 结束时触发,而不是根据 变量 触发?来自流口水?这不是黑客攻击吗?
- 如果不使用 VariableListener,它将不再是 PlanningEntity。难道不是与文档相反的 ProblemFact 吗?缺点是什么?
更多信息:
- "calculation" 是规划期间流网络值的预测,其中流水平取决于任务的当前位置。
- 我们正在使用实时计划,因此计划周期 window 会根据任务集大小进行调整,并随时间变化。
1) 听起来你应该使用影子变量。请注意,您仍然需要一个普通约束来根据影子变量的状态更新分数。
请注意,您可以有一个影子实体 class,它是一个单例(每个问题解决方案),它有一个单独的影子变量,如果任何计划实体发生变化,该变量就会更新。在 @PlanningSolution
class 的字段上使用 @PlanningEntityProperty
(没有 Collection
)。
在移动结束时,每个移动调用 triggerShadowVariableListeners()
,而不是在中间。所以如果你担心性能,你不应该担心。
如果您担心正确性 - 因为调用次数会影响您的计算 - 那么请不要 design/implement 这样...
2) ProblemFacts 在求解过程中不能改变(不算实时规划)。没有一个领域。否则它是一个 PlanningEntity。
0) MoveListener 不存在,有意(出于充分的理由),甚至在内部也不存在(即使是非常内部的 PhaseLifecycleListener 也只听步骤,不听移动)。