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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:35:15