第 7 章 配置红帽构建的 OptaPlanner solver
您可以使用以下方法配置 OptaPlanner solver:
- 使用 XML 文件。
-
使用
SolverConfig
API。 - 在域模型上添加类注释和 JavaBean 属性注解。
- 控制 OptaPlanner 用于访问您的域的方法。
- 定义自定义属性。
7.1. 使用 XML 文件配置 OptaPlanner solver
您可以使用 XML 文件配置解决器。在遵循 Maven 目录结构的典型项目中,在构建带有 SolverFactory
的 Solver
Factory 后,address rConfig
XML 文件位于 $PROJECT_DIR/src/main/resources/org/optaplanner/examples/<PROJECT>/solver
目录,其中 & lt;PROJECT
> 是 OptaPlanner 项目的名称。或者,也可以通过 SolverFactory
.createFromXmlFile()从文件创建一个 SolververFactory
。但是,出于便携性的原因,建议使用 classpath 资源。
Solver
和 SolverFactory
都有一个名为 Solution_
的通用类型,它是代表规划问题和解决方案的类。
OptaPlanner 通过更改配置相对容易地切换优化算法。
流程
-
使用
Solver
Factory 构建 Solverver
实例。 配置解析器配置 XML 文件:
- 定义模型。
- 定义分数函数。
可选:配置优化算法。
以下示例是 NQueens 问题的解析器 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> <scoreDrl>org/optaplanner/examples/nqueens/solver/nQueensConstraints.drl</scoreDrl> </scoreDirectorFactory> <!-- Configure the optimization algorithms (optional) --> <termination> ... </termination> <constructionHeuristic> ... </constructionHeuristic> <localSearch> ... </localSearch> </solver>
注意在某些环境中,如 OSGi 和 JBoss 模块,您的 JAR 文件中的解决方案、分数 DRL 和域类等类路径资源可能不适用于
optaplanner-core
JAR 文件的默认ClassLoader
。在这些情况下,以参数的形式为您的类提供类加载器:SolverFactory<NQueens> solverFactory = SolverFactory.createFromXmlResource( ".../nqueensSolverConfig.xml", getClass().getClassLoader());
使用解决器配置 XML 文件配置
SolverFactory
,以类路径资源形式提供,如ClassLoader.getResource()
所定义:SolverFasctory<NQueens> solverFactory = SolverFactory.createFromXmlResource( "org/optaplanner/examples/nqueens/solver/nqueensSolverConfig.xml"); Solver<NQueens> solver = solverFactory.buildSolver();