OptaPlanner无需XML配置实现分区搜索及后续处理的方法咨询
分区搜索+本地搜索全Java实现方案
不需要手动为每个分区单独调用SolverJob,OptaPlanner的原生Java配置API支持直接配置分区搜索全流程,会自动完成分区拆分、子分区求解、解合并、全局后续搜索的逻辑,不需要你手动处理底层调度。
标准实现步骤(推荐)
你已经完成了SolutionPartitioner接口实现,只需要通过SolverConfig配置求解阶段即可,不需要修改原有求解调用逻辑:
- 第一步:构造包含分区搜索阶段的全局求解配置
import org.optaplanner.core.config.solver.SolverConfig; import org.optaplanner.core.config.constructionheuristic.ConstructionHeuristicPhaseConfig; import org.optaplanner.core.config.localsearch.LocalSearchPhaseConfig; import org.optaplanner.core.config.partitionedsearch.PartitionedSearchPhaseConfig; import org.optaplanner.core.config.solver.termination.TerminationConfig; import java.util.List; // 替换为你自己的业务类 SolverConfig solverConfig = new SolverConfig() .withSolutionClass(TimeTable.class) .withEntityClasses(Lesson.class) .withConstraintProviderClass(TimeTableConstraintProvider.class) .withPhaseList(List.of( // 第一阶段:分区搜索 new PartitionedSearchPhaseConfig() // 绑定你自己实现的分区器 .withSolutionPartitionerClass(TimeTablePartitioner.class) // 配置每个子分区的求解规则 .withPhaseConfigList(List.of( // 子分区先跑构造启发式生成初始解 new ConstructionHeuristicPhaseConfig(), // 子分区跑局部搜索优化 new LocalSearchPhaseConfig() .withTerminationConfig(new TerminationConfig() .withSecondsSpentLimit(30L)) )), // 第二阶段:合并分区解后的全局本地搜索,消弭跨分区冲突 new LocalSearchPhaseConfig() .withTerminationConfig(new TerminationConfig() .withSecondsSpentLimit(60L)) )) // 全局终止条件 .withTerminationConfig(new TerminationConfig() .withSecondsSpentLimit(90L));
- 第二步:直接用原有逻辑触发求解即可
OptaPlanner内部会自动调用你实现的splitWorkingSolution方法拆分分区,并行跑完所有子分区的求解任务后自动合并为完整解,再进入后续的全局本地搜索阶段,不需要你做额外处理:
SolverManager<TimeTable, Long> solverManager = SolverManager.create(solverConfig); SolverJob<TimeTable, Long> solverJob = solverManager.solve(new Random().nextLong(), problem); TimeTable finalSolution = solverJob.getFinalBestSolution();
手动实现分区调度的方案(仅自定义需求场景使用)
如果你有特殊的自定义分区调度、自定义解合并逻辑的需求,才需要手动调用每个分区的求解任务:
- 调用你实现的
SolutionPartitioner的splitWorkingSolution方法,将原始TimeTable实例拆分为多个独立的子分区解 - 为每个子分区解单独调用
solverJob求解,拿到所有分区的局部最优解 - 实现自定义合并逻辑:将所有子分区解的实体变量赋值同步到完整的
TimeTable实例中,注意处理跨分区的资源冲突、约束冲突 - 将合并后的完整解作为初始解,单独启动一次本地搜索任务求解,消除合并带来的冲突,得到最终全局最优解
内容的提问来源于stack exchange,提问作者Giulia Fois
相关产品推荐
相关产品推荐

