首页 > 解决方案 > 有没有办法保存所有找到的可行分数?

问题描述

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

我需要能够输出多个潜在的时间表,这样如果出于某种原因他们不想要“最佳”时间表(也许他们不喜欢其中一个),学生将可以选择一个时间表而不是另一个时间表教授们,也许他们不想要早上 8 点的课,无论如何)

我最初的想法是使用 bestSolutionChanged 事件监听器保存所有可行的解决方案。这样做的问题是,一旦找到 0hard/0soft 分数,它就会忽略之后的所有分数,包括相等的分数。

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

标签: optaplanner

解决方案


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

破解BestSolutionRecaller显然不仅仅是一个大痛苦,它也是我们不想鼓励的行为,因为它使升级到新版本成为更大的痛苦。所以不要指望我们通过在求解器配置中添加一个简单的方法来解决这个问题。话虽如此,显然需要解决这个常见问题。

当找到新的最佳解决方案时,它计划从工作解决方案(OptaPlanner 中的内部解决方案)克隆(参见文档以了解定义)。这使我们能够在工作解决方案更改时记住新的最佳解决方案。这也意味着 BestSolutionChangedEvents 获得了一个计划克隆,并且可以安全地将其发送到另一个线程,例如将其编组到客户端(假设ProblemFactChange您创建的任何 s 都执行副本而不是更改),而不会被修改工作的求解器线程破坏解决方案。

新的最佳解决方案意味着workingScore > bestScore. 当它这样做的时候workingScore >= bestScore,我们需要更多的计划克隆(这有点 CPU 昂贵),但是我们也可以为此发送 BestSolutionChangedEvents,当且仅当一个标志被启用时,因为大多数用户(不像你自己) 不想要这种行为。

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

另一个建议是只在<solver>配置中有一个标志,>从.>=BestSolutionChangedEvent

请创建一个 jira(请参阅网页上的“获取帮助”)并将其链接到此处,或创建支持票证(另请参阅网页上的“获取帮助”)。


推荐阅读