Partition Search 的最终成绩为什么下降的很厉害
Why does the final score of Partition Search drop badly
我是 Optaplanner 的新手。我试图通过分区策略取得好成绩。这是我非常基本的求解器配置:
<solutionClass>com.my.package.SolutionClass</solutionClass>
<entityClass>com.my.package.EntityClass</entityClass>
<scoreDirectorFactory>
<constraintProviderClass>com.my.package.ConstraintsClass</constraintProviderClass>
</scoreDirectorFactory>
<partitionedSearch>
<solutionPartitionerClass>com.my.package.PartitionerClass</solutionPartitionerClass>
<localSearch>
<termination>
<secondsSpentLimit>60</secondsSpentLimit>
</termination>
</localSearch>
</partitionedSearch>
</solver>
为了测试它,我将我的问题分成了两个子问题。当我查看单个分区获得的最佳分数时,它们还不错(-3hard/10soft,-2hard/15soft)。
然而,一般的“降低”分数似乎如下:
[org.opt.cor.imp.par.DefaultPartitionedSearchPhase] (executor-thread-0) Partitioned Search phase (0) ended: time spent (60104), best score (-29hard/15soft), score calculation speed (7735/sec), step total (29), partCount (2), runnablePartThreadLimit (6).
这是为什么?我错过了什么吗?
这就是分区搜索的本质。每个分区都将单独优化,因此这些单独的分区将获得不错的分数。然而,这两个分区随后需要合并,合并到最终解决方案中。此步骤未优化,因此会产生一些额外的低效率。
您可能想在最终解决方案上尝试 运行 非分区求解器,看看它能帮到您。但如果你能做到这一点,你可能一开始就不会使用分区搜索。
请参阅 OptaPlanner documentation on Partitioned Search 讨论效率低下的原因。
[补充 Lukas 的精彩回答]
分区搜索仅在您的分区与您的约束兼容时才有效。在你的情况下,我相信你的分区程序不是。
例如,在员工排班中,假设存在硬约束,即每个员工最多分配 10 个班次。现在,如果您在 1000 个班次的分区中划分了 8000 个班次,但不划分 300 个员工 - 每个分区都包含所有 300 个员工(这是错误的)。
然后分区 1 可以为 Ann 分配 9 个班次,而不会破坏硬约束 (0hard)。类似地,分区 2 可以为 Ann 分配 8 个班次,而不会破坏硬约束 (0hard)。然而,合并后,将有 17 个班次分配给 Ann,硬性分数为 -7hard。
我认为这就是您在 -3hard/10soft + -2hard/15soft = -29hard/15soft
中看到的情况
我是 Optaplanner 的新手。我试图通过分区策略取得好成绩。这是我非常基本的求解器配置:
<solutionClass>com.my.package.SolutionClass</solutionClass>
<entityClass>com.my.package.EntityClass</entityClass>
<scoreDirectorFactory>
<constraintProviderClass>com.my.package.ConstraintsClass</constraintProviderClass>
</scoreDirectorFactory>
<partitionedSearch>
<solutionPartitionerClass>com.my.package.PartitionerClass</solutionPartitionerClass>
<localSearch>
<termination>
<secondsSpentLimit>60</secondsSpentLimit>
</termination>
</localSearch>
</partitionedSearch>
</solver>
为了测试它,我将我的问题分成了两个子问题。当我查看单个分区获得的最佳分数时,它们还不错(-3hard/10soft,-2hard/15soft)。 然而,一般的“降低”分数似乎如下:
[org.opt.cor.imp.par.DefaultPartitionedSearchPhase] (executor-thread-0) Partitioned Search phase (0) ended: time spent (60104), best score (-29hard/15soft), score calculation speed (7735/sec), step total (29), partCount (2), runnablePartThreadLimit (6).
这是为什么?我错过了什么吗?
这就是分区搜索的本质。每个分区都将单独优化,因此这些单独的分区将获得不错的分数。然而,这两个分区随后需要合并,合并到最终解决方案中。此步骤未优化,因此会产生一些额外的低效率。
您可能想在最终解决方案上尝试 运行 非分区求解器,看看它能帮到您。但如果你能做到这一点,你可能一开始就不会使用分区搜索。
请参阅 OptaPlanner documentation on Partitioned Search 讨论效率低下的原因。
[补充 Lukas 的精彩回答]
分区搜索仅在您的分区与您的约束兼容时才有效。在你的情况下,我相信你的分区程序不是。
例如,在员工排班中,假设存在硬约束,即每个员工最多分配 10 个班次。现在,如果您在 1000 个班次的分区中划分了 8000 个班次,但不划分 300 个员工 - 每个分区都包含所有 300 个员工(这是错误的)。 然后分区 1 可以为 Ann 分配 9 个班次,而不会破坏硬约束 (0hard)。类似地,分区 2 可以为 Ann 分配 8 个班次,而不会破坏硬约束 (0hard)。然而,合并后,将有 17 个班次分配给 Ann,硬性分数为 -7hard。
我认为这就是您在 -3hard/10soft + -2hard/15soft = -29hard/15soft