如何根据问题规模条件决定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
相关产品推荐
相关产品推荐

