OptaPlanner 的实体得分计算器回调
OptaPlanner's score calculator callbacks for entities
我的模型支持通过Solver#addProblemFactChange
和ProblemFactChange
界面进行实时更改。实现此接口的doChange
方法,我通过beforeEntityRemoved
、beforeProblemFactRemoved
、beforeProblemFactChanged
等方法主动使用scoreDirector
的通知。此外,模型的增量分数计算器实现了回调方法beforeEntityAdded
、beforeEntityRemoved
及其after
版本。
调查求解器行为,我从 optaplanner 看到了这样的分数计算器调用图:
也就是说,optaplanner 不会调用实体相关的计算器方法,尽管模型发生了变化。为什么会这样,为什么需要通知 scoreDirector
?
ProblemFactChange
api 被设计为允许对问题进行增量更改,因此您需要调用 before|afterProblemFactAdded|Changed|Removed()
,否则不可能实现增量问题更改(不更改API).
ScoreDirector
负责处理这些事件:
DroolsScoreDirector
也对问题事实进行增量处理(不仅仅是规划变量)。
IncrementalScoreDirector
还没有针对问题事实进行增量处理(但它针对规划变量进行了处理)。在 6.2 中只有 some stopgap code 有一个 TODO,它可以工作,但没有达到应有的速度。
我的模型支持通过Solver#addProblemFactChange
和ProblemFactChange
界面进行实时更改。实现此接口的doChange
方法,我通过beforeEntityRemoved
、beforeProblemFactRemoved
、beforeProblemFactChanged
等方法主动使用scoreDirector
的通知。此外,模型的增量分数计算器实现了回调方法beforeEntityAdded
、beforeEntityRemoved
及其after
版本。
调查求解器行为,我从 optaplanner 看到了这样的分数计算器调用图:
也就是说,optaplanner 不会调用实体相关的计算器方法,尽管模型发生了变化。为什么会这样,为什么需要通知 scoreDirector
?
ProblemFactChange
api 被设计为允许对问题进行增量更改,因此您需要调用 before|afterProblemFactAdded|Changed|Removed()
,否则不可能实现增量问题更改(不更改API).
ScoreDirector
负责处理这些事件:
DroolsScoreDirector
也对问题事实进行增量处理(不仅仅是规划变量)。IncrementalScoreDirector
还没有针对问题事实进行增量处理(但它针对规划变量进行了处理)。在 6.2 中只有 some stopgap code 有一个 TODO,它可以工作,但没有达到应有的速度。