我的模型支持通过Solver#addProblemFactChangeProblemFactChange界面进行实时更改。实现此接口的doChange方法时,我通过scoreDirectorbeforeEntityRemovedbeforeProblemFactRemoved等方法积极使用beforeProblemFactChanged通知。此外,模型的增量分数计算器实现了回调方法beforeEntityAddedbeforeEntityRemoved及其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.

07-26 04:56