如何在Optaplanner中创建无可视化通用线性规划程序并导入模型约束求解?
核心步骤:剥离OptaPlanner示例中的可视化,聚焦线性规划核心逻辑
1. 定位模型类(POJO)
- 示例里的模型类通常在
domain包下,是不带UI注解的纯Java/Kotlin对象,比如org.optaplanner.examples.cloudbalancing.domain.CloudProcess。 - 核心标识注解:
@PlanningEntity标注决策变量所属的实体,@PlanningSolution标注包含所有实体、问题事实和目标的根类,这些和可视化完全无关。 - 决策变量字段用
@PlanningVariable标注,问题事实类(如资源约束载体)仅为普通Bean,无需特殊注解。
2. 提取约束逻辑
- 约束通常写在
constraints包下的ConstraintProvider实现类中,比如org.optaplanner.examples.cloudbalancing.solver.CloudBalancingConstraintProvider,代码全是纯约束逻辑,无UI关联:public Constraint requiredCpuPower(ConstraintFactory constraintFactory) { return constraintFactory.forEach(CloudProcess.class) .join(CloudComputer.class, Joiners.equal(CloudProcess::getComputer)) .filter((process, computer) -> process.getRequiredCpuPower() > computer.getCpuPower()) .penalize("Required CPU power", HardSoftScore.ONE_HARD); } - 若示例用Drools规则写约束,对应文件在
src/main/resources/rules下(后缀.drl),同样是纯约束逻辑。
3. 简化求解器配置
- 求解器配置文件(如
solverConfig.xml)中,仅保留核心配置,忽略所有可视化/监控相关内容:<solver> <solutionClass>org.optaplanner.examples.cloudbalancing.domain.CloudBalance</solutionClass> <entityClass>org.optaplanner.examples.cloudbalancing.domain.CloudProcess</entityClass> <scoreDirectorFactory> <constraintProviderClass>org.optaplanner.examples.cloudbalancing.solver.CloudBalancingConstraintProvider</constraintProviderClass> </scoreDirectorFactory> <termination> <secondsSpentLimit>30</secondsSpentLimit> </termination> </solver>
4. 编写最简求解代码
- 删除示例中所有UI启动代码,仅保留求解核心逻辑:
public class SimpleSolverRunner { public static void main(String[] args) { // 构建求解器 SolverFactory<CloudBalance> solverFactory = SolverFactory.createFromXmlResource("solverConfig.xml"); Solver<CloudBalance> solver = solverFactory.buildSolver(); // 输入自定义问题实例 CloudBalance unsolvedProblem = buildYourLinearProgrammingModel(); // 执行求解 CloudBalance solvedProblem = solver.solve(unsolvedProblem); // 输出结果 System.out.println("求解得分:" + solvedProblem.getScore()); for (CloudProcess process : solvedProblem.getProcessList()) { System.out.println("任务" + process.getId() + "分配至计算机" + process.getComputer().getId()); } } private static CloudBalance buildYourLinearProgrammingModel() { // 替换为你的模型构建逻辑 CloudBalance model = new CloudBalance(); // 添加问题事实与决策实体 return model; } }
关键提示
- 所有带
@PlanningXxx注解的类、ConstraintProvider实现、核心求解器配置,以及solve()方法调用,是OptaPlanner处理线性规划的核心,与可视化完全分离。 - 示例中的
ui包、Swing/JavaFX相关代码、监控配置等,均可删除,不影响求解功能。
内容的提问来源于stack exchange,提问作者J. Schmidt
相关产品推荐
相关产品推荐

