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

如何根据问题规模条件决定OptaPlanner求解TWVRP时是否运行本地搜索阶段

实现方案

核心思路

OptaPlanner支持在代码层面动态修改求解器的阶段配置,你只需要先计算当前问题的规模,再根据阈值调整求解器的阶段列表,移除不需要的本地搜索阶段即可,无需维护多套独立的求解器配置。

具体实现步骤

  • 首先定义问题规模的计算规则与阈值,TWVRP场景通常可直接使用客户总量作为规模指标,阈值根据你自身的性能压测结果设定即可。
  • 加载基础求解器配置(支持从XML读取后修改,也可完全通过代码生成配置)
  • 根据阈值判断是否需要移除本地搜索阶段
  • 用修改后的配置构建求解器执行求解

代码示例

// 自定义规模阈值,可根据压测结果调整
private static final int PROBLEM_SIZE_THRESHOLD = 120;

public TwvrpSolution solveTwvrp(TwvrpProblem problem) {
    // 1. 计算当前问题规模,可根据业务调整计算逻辑
    int problemSize = problem.getCustomerList().size();
    // 2. 加载基础求解器配置
    SolverConfig solverConfig = SolverConfig.createFromXmlResource("your/twvrpSolverConfig.xml");
    
    if (problemSize >= PROBLEM_SIZE_THRESHOLD) {
        // 规模超过阈值,移除所有本地搜索阶段,仅保留构造启发式阶段
        List<PhaseConfig> phaseConfigs = solverConfig.getPhaseConfigList();
        if (phaseConfigs != null) {
            phaseConfigs.removeIf(config -> config instanceof LocalSearchPhaseConfig);
        }
    }
    
    // 3. 构建求解器并执行求解
    SolverFactory<TwvrpSolution> solverFactory = SolverFactory.create(solverConfig);
    Solver<TwvrpSolution> solver = solverFactory.buildSolver();
    return solver.solve(problem);
}

注意事项

  • 如果你使用Spring Boot/Quarkus的OptaPlanner启动器自动注入配置,不要直接使用自动注入的Solver实例,而是注入SolverConfig实例后按上述逻辑修改,再手动构建Solver即可。
  • 除了直接移除本地搜索阶段外,你也可以通过动态修改本地搜索阶段的终止条件(比如将求解时长设为0)实现相同效果,可根据自身使用习惯选择。
  • 如果你的构造启发式本身包含多个子阶段,修改时注意不要误删构造启发式的配置。

内容的提问来源于stack exchange,提问作者Magnus Våge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:15:01