You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

手动实现分区调度的方案(仅自定义需求场景使用)

如果你有特殊的自定义分区调度、自定义解合并逻辑的需求,才需要手动调用每个分区的求解任务:

  1. 调用你实现的SolutionPartitioner的splitWorkingSolution方法,将原始TimeTable实例拆分为多个独立的子分区解
  2. 为每个子分区解单独调用solverJob求解,拿到所有分区的局部最优解
  3. 实现自定义合并逻辑:将所有子分区解的实体变量赋值同步到完整的TimeTable实例中,注意处理跨分区的资源冲突、约束冲突
  4. 将合并后的完整解作为初始解,单独启动一次本地搜索任务求解,消除合并带来的冲突,得到最终全局最优解

内容的提问来源于stack exchange,提问作者Giulia Fois

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:06:07