如何将现有系统的求解结果作为Optaplanner的规划起始输入
完全可以实现,Optaplanner原生支持导入外部生成的可行解作为求解起始点,不需要依赖重复规划相关能力,具体操作步骤如下:
步骤1:构造符合规范的初始解对象
把现有系统输出的最优结果,逐字段映射到你定义的@PlanningSolution类对应属性中,需要保证:
- 所有标注
@PlanningEntity的实体集合、@ProblemFactCollectionProperty标注的问题事实赋值完整 - 所有规划变量的取值和现有系统的输出完全对齐
- 优先保证构造的初始解为可行解:即满足Optaplanner约束定义中的所有硬约束,若存在硬约束不满足的情况,Optaplanner默认会先进入构造启发式阶段修复不可行性,不会直接以传入解为起点运行元启发式迭代。
步骤2:关闭默认构造启发式阶段
Optaplanner默认会自动运行构造启发式阶段生成初始解,你需要手动关闭该阶段:
- XML配置示例:
<solver xmlns="https://www.optaplanner.org/xsd/solver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.optaplanner.org/xsd/solver https://www.optaplanner.org/xsd/solver/optaplanner-solver-8.38.xsd"> <!-- 保留其他常规求解配置 --> <constructionHeuristic> <enabled>false</enabled> </constructionHeuristic> <!-- 正常配置你需要的元启发式算法阶段,比如本地搜索、禁忌搜索等 --> <localSearch> <!-- 元启发式参数配置 --> </localSearch> </solver>
- Java代码配置示例:
SolverConfig solverConfig = new SolverConfig() .withConstructionHeuristicPhaseConfig(new ConstructionHeuristicPhaseConfig().withEnabled(false)) // 其他求解配置、元启发式阶段配置 ;
如果是通过Quarkus、Spring Boot Starter集成Optaplanner,仅需对应修改求解器配置文件即可,逻辑完全一致。
步骤3:传入初始解启动求解
直接把你构造完成的@PlanningSolution实例传入Solver.solve()方法,Optaplanner会自动跳过构造启发式阶段,直接以该解为起点运行后续的元启发式迭代优化。
如果现有系统输出的解无法保证全量满足硬约束,也可以额外配置忽略初始解不可行性校验,直接启动元启发式迭代,不过该场景下前期迭代会优先修复硬约束,整体优化效率会略低。
内容的提问来源于stack exchange,提问作者sindeaf
相关产品推荐
相关产品推荐

