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

问题描述 投票:1回答:1

我需要在每次移动结束时将计算结果存入内存,然后根据此更新分数。计算结果必须是有状态的,如在其他位置引用(存储在解决方案中)。

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

  1. 如何在move的末尾而不是每个variable触发?从流口水?那不是黑客吗?
  2. 如果不使用VariableListener,它将不再是PlanningEntity。难道不是与文档相反的ProblemFact吗?有什么缺点?
drools optaplanner
1个回答
0
投票

1)听起来像阴影变量。请注意,您仍然需要常规约束,也可以根据该阴影变量的状态更新分数。

在移动结束时,每个移动都调用triggerShadowVariableListeners(),而不是在中间。因此,如果您担心性能,那就不要了。如果您担心正确性-因为调用次数会影响您的计算-请勿以这种方式设计/实施...

2)问题事实在解决过程中不能更改(不计算实时计划)。他们没有一个领域。否则,它是一个PlanningEntity。

© www.soinside.com 2019 - 2024. All rights reserved.