optaplanner学习笔记(二)OptPlanner求解步骤及配置

概述

使用OptaPlanner解决一个Planning Problem规划问题包括以下步骤:

  • 问题建模:将你的规划问题建模为一个带有@PlanningSolution注解的类,例如CloudBalance类。
  • 配置求解器:配置一个求解器,例如任何CloudBalance实例的First Fit和Tabu Search求解器(不同的求解器对不同的规划问题,其性能和结果有着很大的差别,后续再讲解如何选择适合的求解器)。
  • 组装问题数据:从数据层加载一个问题数据集,例如一个CloudBalance实例。这就是规划问题。
  • 调用求解器:用Solver.solve(problem)来解决这个问题,返回找到的最佳解决方案。

在这里插入图片描述

求解器配置

2.1通过 XML 配置求解器
使用. Solver_ 使用作为类路径资源(由 定义)提供的求解器配置 XML 文件进行SolverFactory配置:

SolverFactoryClassLoader.getResource()
   SolverFactory<NQueens> solverFactory = SolverFactory.createFromXmlResource(
           "org/optaplanner/examples/nqueens/solver/nqueensSolverConfig.xml");
   Solver<NQueens> solver = solverFactory.buildSolver();

在典型项目中(遵循 Maven 目录结构),solverConfig XML 文件将位于$PROJECT_DIR/src/main/resources/org/optaplanner/examples/nqueens/solver/nqueensSolverConfig.xml. 或者,SolverFactory可以从 a 创建一个Filewith SolverFactory.createFromXmlFile()。但是,出于可移植性的原因,建议使用类路径资源。

Solver和 SolverFactory都有一个名为的泛型类型Solution_,它是表示计划问题和解决方案的类。

求解器配置 XML 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<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/solver.xsd">
  <!-- Define the model -->
  <solutionClass>org.optaplanner.examples.nqueens.domain.NQueens</solutionClass>
  <entityClass>org.optaplanner.examples.nqueens.domain.Queen</entityClass>

  <!-- Define the score function -->
  <scoreDirectorFactory>
    <constraintProviderClass>org.optaplanner.examples.nqueens.score.NQueensConstraintProvider</constraintProviderClass>
  </scoreDirectorFactory>

  <!-- Configure the optimization algorithms (optional) -->
  <termination>
    ...
  </termination>
  <constructionHeuristic>
    ...
  </constructionHeuristic>
  <localSearch>
    ...
  </localSearch>
</solver>

注意其中的三个部分:

  1. 定义模型。

  2. 定义得分函数。

  3. (可选)配置优化算法。

本手册进一步解释了配置的这些不同部分。

OptaPlanner 只需更改配置即可相对轻松地切换优化算法。甚至还有一个Benchmarker,它允许您对彼此执行不同的配置并报告最适合您的用例的配置。

2.2. 通过 Java API 配置求解器
求解器配置也可以使用SolverConfigAPI 进行配置。这对于在运行时动态更改某些值特别有用。例如,要根据系统属性更改运行时间,在构建之前Solver:

 SolverConfig solverConfig = SolverConfig.createFromXmlResource(
            "org/optaplanner/examples/nqueens/solver/nqueensSolverConfig.xml");
    solverConfig.withTerminationConfig(new TerminationConfig()
                    .withMinutesSpentLimit(userInput));

    SolverFactory<NQueens> solverFactory = SolverFactory.create(solverConfig);
    Solver<NQueens> solver = solverFactory.buildSolver();

求解器配置 XML 中的每个元素都可用作包命名空间中的*Config类或类的属性。这些类是 XML 格式的 Java 表示。他们构建(包命名空间的)运行时组件并将它们组装成一个高效的.Configorg.optaplanner.core.configConfigorg.optaplanner.core.implSolver

要SolverFactory为每个用户请求动态配置,请在初始化期间构建模板SolverConfig并使用复制构造函数为每个用户请求复制它:

   private SolverConfig template;

    public void init() {
        template = SolverConfig.createFromXmlResource(
                "org/optaplanner/examples/nqueens/solver/nqueensSolverConfig.xml");
        template.setTerminationConfig(new TerminationConfig());
    }

    // Called concurrently from different threads
    public void userRequest(..., long userInput) {
        SolverConfig solverConfig = new SolverConfig(template); // Copy it
        solverConfig.getTerminationConfig().setMinutesSpentLimit(userInput);
        SolverFactory<NQueens> solverFactory = SolverFactory.create(solverConfig);
        Solver<NQueens> solver = solverFactory.buildSolver();
        ...
    }

2.3 OptPlanner注解
OptaPlanner需要知道业务模型中哪些类是PlanningEntity规划实体,哪些属性是PlanningVariable规划变量等等。有几种方法:

在业务模型上添加类注解和JavaBean属性注解(推荐)。属性注解必须是在getter方法上,而不是在setter方法上,这样的话getter不需要是公共的。
在业务模型上添加类注解和字段注解,这样的话字段也不需要是公共的。
使用XML:在一个XML文件中配置。但是部分属性还未支持。

OptaPlanner使用过程中重点使用第一种方式

2.4 Solver配置,支持自定义属性。自定义属性对于通过Benchmarker调整动态值非常有用。例如:假设EasyScoreCalculator有大量的计算(这些计算是缓存的),你想在一个基准中增加缓存的大小。

 <scoreDirectorFactory>
    <easyScoreCalculatorClass>...MyEasyScoreCalculator</easyScoreCalculatorClass>
    <easyScoreCalculatorCustomProperties>
      <property name="myCacheSize" value="1000"/><!-- Override value -->
    </easyScoreCalculatorCustomProperties>
  </scoreDirectorFactory>

每个自定义属性添加一个public的setter方法,在构建Solver时调用。

public class MyEasyScoreCalculator extends EasyScoreCalculator<MySolution, SimpleScore> {

        private int myCacheSize = 500; // Default value

        @SuppressWarnings("unused")
        public void setMyCacheSize(int myCacheSize) {
            this.myCacheSize = myCacheSize;
        }
}

自定义属性支持大多数数值类型,包括boolean、int、double、BigDecimal、String和enums)。

在学习optaplanner过程中,主要参考PeterOne老师的博客,https://juejin.cn/user/3835556294573207

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值