有没有办法保存找到的所有可行分数?

时间:2019-05-13 15:45:00

标签: optaplanner

我正在构建一个学生时间表生成器,我需要一种产生多个解决方案的方法。有什么方法可以节省可行分数或Xhard / Ysoft分数吗?

我需要能够输出多个潜在的时间表,这样,无论出于何种原因,学生都不愿意“最佳”时间表(也许他们不希望这样做),学生可以选择一个时间表而不是另一个时间表。像其中一位教授一样,也许他们不希望早上八点上课)

我的最初想法是使用bestSolutionChanged事件侦听器保存所有可行的解决方案。问题在于,一旦找到0hard / 0soft分数,它将忽略此后的所有分数,包括相等的分数。

理想情况下,我想保存所有0hard / -3soft或更好的分数,但是能够保存任何可行的分数或迫使optaplanner寻找新的最佳分数也是有用的。

1 个答案:

答案 0 :(得分:0)

这不是解决方案,而是对问题的分析:

显然,BestSolutionRecaller带来的痛苦不仅仅在于痛苦,而且我们不希望鼓励这种行为,因为升级至新版本的痛苦更大。因此,不要指望我们通过添加一种简单的方法来解决此问题,因为该方法会很快在解决程序配置中进行配置。话虽这么说,显然需要解决这个常见问题的方法。

找到新的最佳解决方案时,将从工作解决方案(OptaPlanner的内部解决方案)中计划克隆(请参阅文档以获取定义)。这使我们能够记住随着工作解决方案的变化而出现的最佳新解决方案。这也意味着BestSolutionChangedEvents获得一个 plannng克隆,并且可以安全地将其发送到另一个线程,例如,将其封送给客户端(假定您创建的任何ProblemFactChange个文件都是副本而不是更改) ,而不会被修改工作解决方案的求解器线程破坏。

新的最佳解决方案意味着workingScore > bestScore。相反,当它执行workingScore >= bestScore时,我们需要更多的计划克隆(这会占用大量CPU),但是我们也可以为此发送BestSolutionChangedEvents,如果且仅当启用了标志时< / em>当然是因为大多数用户(与您不同)不希望这种行为。

一个建议是在BestSolutionChangedOrSameEvent旁边创建一个单独的BestSolutionChangedEvent。这可能不是理想的,因为我们需要能够检测是否有人需要这些额外的计划克隆。

另一建议是在<solver>配置中仅包含一个标志,以将>的行为从>=切换到BestSolutionChangedEvent

请创建一个jira(请参见网页上的“获得帮助”)并在此处链接它,或者创建支持票证(也请参见网页上的“获得帮助”)。