Optaplanner - 增量计算理由

问题描述 投票:0回答:1

在我的应用程序中,用户需要能够手动覆盖时间表,我想预先计算硬约束匹配,以便此过程可以更加高效。

例如,在课程时间表问题中,我有一个现有的时间表,并且希望生成教师可以手动注册的其他潜在讲座。每个潜在的讲座都应根据现有计划进行验证,并且应将其违规情况呈现给用户(例如,“您此时不能在这个房间安排时间,因为同一时间段内还有另一场针对同一课程的讲座”)。

我们的约束流具有自定义理由,使我们能够生成用户可读的违规消息。但我们评估每堂课的方式效率很低。我们创建一个

SolutionManager
,然后对于每个潜在的讲座,创建一个新的
PlanningSolution
对象并告诉
SolutionManager
来解释它。这将导致
SolutionManager
重新计算现有时间表的许多限制,而不仅仅是新的潜在讲座的限制。

请注意,如果需要,我们可以放弃显示用户可读的约束违规消息的要求。在这种情况下,我们不需要完整的理由图,我们只需要重新评估的分数来确定硬分数是否变得更糟(我们将返回布尔值

isValidLecture
而不是字符串
violationMessage
) .

所有这些计算都发生在求解器实例之外,有没有办法利用增量评分来提高效率?

我们目前正在使用约束流和 Bavet 进行分数计算。我们使用的是 Optaplanner 版本 9.37.Final。

java optaplanner timefold
1个回答
0
投票

我们的约束流具有自定义理由,使我们能够生成用户可读的违规消息。但我们评估每堂课的方式效率很低。我们创建一个 SolutionManager,然后为每个潜在的讲座创建一个新的 PlanningSolution 对象并告诉 SolutionManager 对其进行解释。这将导致 SolutionManager 重新计算现有时间表的许多约束,而不仅仅是新的潜在讲座的约束。

这就是预期的方式。你是对的,它在技术上效率低下,但实际上,假设你的约束是有效的,它需要几毫秒。

如果你的约束本身效率低下,那就是你的主要问题,你应该集中精力解决它。一旦解决,整个问题就会消失,并且作为额外的好处,您的求解器将会更快。

© www.soinside.com 2019 - 2024. All rights reserved.