Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optaplanner 有没有办法保存所有找到的可行分数?_Optaplanner - Fatal编程技术网

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

Optaplanner 有没有办法保存所有找到的可行分数?,optaplanner,Optaplanner,我正在构建一个学生时间表生成器,我需要一种生成多个解决方案的方法。是否有某种方法可以节省可行分数或Xhard/Ysoft分数 我需要能够输出多个潜在的时间表,这样,如果出于任何原因,学生不想要“最佳”时间表,那么他们可以选择一个时间表而不是另一个(可能他们不喜欢某位教授,可能他们不想要上午8点的课,等等) 我最初的想法是使用bestSolutionChanged事件侦听器保存所有可行的解决方案。问题是,一旦找到0硬/0软分数,它将忽略其后的所有分数,包括相等的分数 理想情况下,我希望保存所有0h

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

我需要能够输出多个潜在的时间表,这样,如果出于任何原因,学生不想要“最佳”时间表,那么他们可以选择一个时间表而不是另一个(可能他们不喜欢某位教授,可能他们不想要上午8点的课,等等)

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


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

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

破解
BestSolutionRecaller
显然不仅仅是一个巨大的痛苦,它也是我们不想鼓励的行为,因为它使升级到新版本成为一个更大的痛苦。因此,不要指望我们能通过在解算器配置中添加一种简单的配置方法来解决这个问题。尽管如此,显然需要解决这一共同问题

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

新的最佳解决方案意味着
workingScore>bestScore
。当它改为
workingScore>=bestScore
时,我们需要更多的计划克隆(这有点CPU昂贵),但我们也可以为此发送BestSolutionChangedEvents,当然,如果且仅当启用了一个标志,因为大多数用户(与您不同)不希望出现这种行为

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

另一个建议是在
配置中设置一个标志,用于将
的行为从
切换到
=


请创建jira(请参见网页上的“获取帮助”)并将其链接到此处,或创建支持通知单(请参见网页上的“获取帮助”)。

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

破解
BestSolutionRecaller
显然不仅仅是一个巨大的痛苦,它也是我们不想鼓励的行为,因为它使升级到新版本成为一个更大的痛苦。因此,不要指望我们能通过在解算器配置中添加一种简单的配置方法来解决这个问题。尽管如此,显然需要解决这一共同问题

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

新的最佳解决方案意味着
workingScore>bestScore
。当它改为
workingScore>=bestScore
时,我们需要更多的计划克隆(这有点CPU昂贵),但我们也可以为此发送BestSolutionChangedEvents,当然,如果且仅当启用了一个标志,因为大多数用户(与您不同)不希望出现这种行为

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

另一个建议是在
配置中设置一个标志,用于将
的行为从
切换到
=


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

我几年前发现了这篇文章:听起来你必须破解BestSolutionRecaller才能获得这种行为,但我似乎找不到任何例子来说明这是如何实现的。这也与帕累托优化有关,因为你不只是想要所有的解决方案,而是想要帕累托前沿。所以扩展BestSolutionRecaller是目前解决这个问题的唯一方法?如果是这样,我有一个可能是愚蠢的或明显的问题:我如何实际告诉解算器使用扩展的BestSolutionRecaller类?配置文件中是否有我需要更改的内容?我真的很感谢你的帮助。我之所以这么问,主要是因为我所看到的所有关于这个话题的论坛都是2015年或更早的,我想在深入讨论之前确保没有任何方法可以实现。我在几年前发现了这篇文章:听起来你必须破解BestSolutionRecaller才能获得这种行为,但我似乎找不到任何例子来说明这是如何实现的。这也与帕累托优化有关,因为你不只是想要所有这些解决方案,而是