我的模型支持通过Solver#addProblemFactChange
和ProblemFactChange
界面进行实时更改。实现此接口的doChange
方法时,我通过scoreDirector
,beforeEntityRemoved
,beforeProblemFactRemoved
等方法积极使用beforeProblemFactChanged
通知。此外,模型的增量分数计算器实现了回调方法beforeEntityAdded
,beforeEntityRemoved
及其after
-版本。
在研究求解器行为时,我看到了来自optaplanner的分数计算器调用图:
也就是说,尽管模型发生了变化,但是optaplanner不会调用与计算器相关的实体相关方法。为什么会发生,为什么有必要通知scoreDirector
?
最佳答案
ProblemFactChange
api被设计为允许对问题进行增量更改,因此您需要调用before|afterProblemFactAdded|Changed|Removed()
,否则将无法实现增量问题更改(无需更改API)。ScoreDirector
负责处理这些事件:DroolsScoreDirector
也可以针对问题事实(不仅是计划变量)进行增量工作。IncrementalScoreDirector
尚未针对问题事实进行增量处理(但针对计划变量则进行了处理)。在6.2中只有some stopgap code和TODO,它可以工作,但没有达到应有的速度。
I created a jira issue to track this issue.