【教程13】OptaPlaner Partitioned Search
文章目录
1. 算法描述
在处理大型数据集(通常超过5000个规划实体)时,将其分割成较小的部分并分别解决往往更加高效。Partitioned Search是多线程的,因此在多核机器上可以提供性能提升,因为CPU利用率更高。此外,即使只使用一个CPU,它也可以更快地找到初始解决方案,因为分区构建启发式算法的搜索空间远远小于非分区的变体。
然而,分区确实会导致次优的结果,即使分块被优化求解,如下所示:
它实际上是以短期解决方案质量的损失来换取长期的损失。补偿此损失的一种方法是在分区搜索阶段之后运行非分区的局部搜索。
并非所有的用例都可以进行分区。分区仅适用于规划实体和值范围可以在n个分区中分割,而且没有约束条件跨越分区边界的用例。
2. 配置
最简单的配置:
<partitionedSearch>
<solutionPartitionerClass>org.optaplanner.examples.cloudbalancing.optional.partitioner.CloudBalancePartitioner</solutionPartitionerClass>
</partitionedSearch>
在每个规划实体类和规划值类上添加@PlanningId注解。有几种方法可以对解决方案进行分区。
高级配置:
<partitionedSearch>
...
<solutionPartitionerClass>org.optaplanner.examples.cloudbalancing.optional.partitioner.CloudBalancePartitioner</solutionPartitionerClass>
<runnablePartThreadLimit>4</runnablePartThreadLimit>
<constructionHeuristic>...</constructionHeuristic>
<localSearch>...</localSearch>