第 1 章 与 OptaPlanner 7.x 或更早版本不兼容的更改
本节中列出的更改与 OptaPlanner 7.x 或更早版本的 OptaPlanner 7.x 不兼容。
需要 Java 11 或更高版本
主,公共 API
如果您使用 JRE 或 JDK 8,请升级到 JDK 11 或更高版本。
在 Linux 上,从 Linux 软件存储库获取 OpenJDK。在 Fedora 和 Red Hat Enterprise Linux 中输入以下命令:
sudo dnf install java-11-openjdk-devel
sudo dnf install java-11-openjdk-develCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 在 Windows 和 macOS 上,从 AdoptOpenJDK 网站下载 OpenJDK。
SolverFactory 和 PlannerBenchmarkFactory 不再支持 KIE 容器
主,公共 API
因为 OptaPlanner 现在与 Kogito 保持一致,所以 KIE 容器概念不再适用。因此,SolverFactory 不再允许您从 KIE 容器创建 Solver 实例。这也适用于 PlannerBenchmarkFactory 和基准。
已删除 OSGi 元数据
主,公共 API
由于 OSGi 的有限使用情况及其维护负担,OptaPlanner 8.x 系列中的 OptaPlanner JAR 文件不再将 OSGi 元数据包含在 META-INF/MANIFEST.MF 文件中。
禁止使用 Java 序列化
次,公共 API
在 OptaPlanner 8 中,大多数使用 Serializable 标记接口已从公共 API 中删除。考虑使用 JSON 或另一个格式进行序列化。
SolverFactory.getScoreDirectorFactory () 替换为 ScoreManager
主,公共 API
在 OptaPlanner 版本 7 中,需要使用 ScoreDirectorFactory 来解释分数。在 OptaPlanner 版本 8 中,新功能被添加到 ScoreManager 中,因此不再有理由创建 ScoreDirector 的新实例。
OptaPlanner 7 中的 *.java 文件示例:
ScoreDirectorFactory<CloudBalance> scoreDirectorFactory = solverFactory.getScoreDirectorFactory();
try (ScoreDirector<CloudBalance> scoreDirector = scoreDirectorFactory.buildScoreDirector()) {
scoreDirector.setWorkingSolution(solution);
Score score = scoreDirector.calculateScore();
}
ScoreDirectorFactory<CloudBalance> scoreDirectorFactory = solverFactory.getScoreDirectorFactory();
try (ScoreDirector<CloudBalance> scoreDirector = scoreDirectorFactory.buildScoreDirector()) {
scoreDirector.setWorkingSolution(solution);
Score score = scoreDirector.calculateScore();
}
OptaPlanner 8 中的 *.java 文件示例:
ScoreManager<CloudBalance> scoreManager = ScoreManager.create(solverFactory); Score score = scoreManager.updateScore(solution);
ScoreManager<CloudBalance> scoreManager = ScoreManager.create(solverFactory);
Score score = scoreManager.updateScore(solution);
允许您检索 ScoreDirector 和 ScoreDirectorFactory 实例的方法已从公共 API 中删除,而无需替换。ScoreDirector 接口的更小版本被提升到公共 API,以将 ProblemFactChange 接口提升到公共 API。
SolverFactory:getSolverConfig () 删除
次,公共 API
SolverFactory.getSolverConfig () 方法已弃用,并替换为 SolverFactory.create (SolverConfig) 方法。SolverConfig 实例现在在 SolverFactory 实例实例化前实例化,这会更自然。之前的顺序已被删除。
OptaPlanner 7 中的 *.java 文件示例:
SolverFactory<MySolution> solverFactory = SolverFactory.createFromXmlResource(".../mySolverConfig.xml");
SolverConfig solverConfig = solverFactory.getSolverConfig();
...
Solver<MySolution> solver = solverFactory.buildSolver();
SolverFactory<MySolution> solverFactory = SolverFactory.createFromXmlResource(".../mySolverConfig.xml");
SolverConfig solverConfig = solverFactory.getSolverConfig();
...
Solver<MySolution> solver = solverFactory.buildSolver();
OptaPlanner 8 中的 *.java 文件示例:
SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
如果您还传递 ClassLoader,请将其传递给 SolverConfig.createFromXmlResource () 和 SolverFactory.create ()。
SolverConfig:buildSolver () 删除
次,公共 API
SolverConfig.buildSolver () 方法是一个不属于公共 API 中的内部方法。使用 SolverFactory.buildSolver () 方法替代。
OptaPlanner 7 中的 *.java 文件示例:
SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
Solver<MySolution> solver = solverConfig.buildSolver();
SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
Solver<MySolution> solver = solverConfig.buildSolver();
OptaPlanner 8 中的 *.java 文件示例:
SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
PlannerBenchmarkConfig:buildPlannerBenchmark () 已删除
次,公共 API
PlannerBenchmarkConfig.buildPlannerBenchmark () 方法是一个不属于公共 API 中的方法。使用 PlannerBenchmarkFactory.buildPlannerBenchmark () 方法替代。
OptaPlanner 7 中的 *.java 文件示例:
PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
OptaPlanner 8 中的 *.java 文件示例:
PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.create(benchmarkConfig);
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.create(benchmarkConfig);
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
SolverFactory:cloneSolverFactory () removed
次,公共 API
SolverFactory.cloneSolverFactory () 方法已弃用,并替换为新的 SolverConfig (SolverConfig) 复制构造器,并且 SolverFactory.cloneSolverFactory () 方法已被删除。
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
SolverFactory:createEmpty () 已删除
次,公共 API
SolverFactory.createEmpty () 方法已弃用,并 替换为新的 SolverConfig () 方法。SolverFactory.createEmpty () 方法已被删除。
OptaPlanner 7 中的 *.java 文件示例:
SolverFactory<MySolution> solverFactory = SolverFactory.createEmpty(); SolverConfig solverConfig = solverFactory.getSolverConfig() ... Solver<MySolution> solver = solverFactory.buildSolver();
SolverFactory<MySolution> solverFactory = SolverFactory.createEmpty();
SolverConfig solverConfig = solverFactory.getSolverConfig()
...
Solver<MySolution> solver = solverFactory.buildSolver();
OptaPlanner 8 中的 *.java 文件示例:
SolverConfig solverConfig = new SolverConfig(); ... SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig); Solver<MySolution> solver = solverFactory.buildSolver();
SolverConfig solverConfig = new SolverConfig();
...
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
XML <solver/> root 元素现在属于 http://www.optaplanner.org/xsd/solver 命名空间
主,公共 API
OptaPlanner 现在为 solver 配置提供了一个 XML 模式定义。虽然 OptaPlanner 保留与现有 XML 配置的早期版本的兼容性,强烈建议迁移到 XSD,因为 OptaPlanner 可能以后只支持有效的配置 XML。
OptaPlanner 7 中的 *SolverConfig.xml 文件中的示例:
<?xml version="1.0" encoding="UTF-8"?> <solver> ... </solver>
<?xml version="1.0" encoding="UTF-8"?>
<solver>
...
</solver>
OptaPlanner 8 中的 *SolverConfig.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"> ... </solver>
<?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">
...
</solver>
使用 XSD 可能需要对配置的一些 XML 元素重新排序。在 IDE 中使用代码完成来迁移到有效的 XML。
move selector 配置中的 property subPillarEnabled 已被删除
次,公共 API
PillarSwapMoveSelector 和 PillarChangeMoveSelector 和 PillarChangeMoveSelector 中的 subPillarEnabled 属性已弃用,并替换为一个新的属性 subPillarType。subPillarEnabled 属性已被删除。
OptaPlanner 7 中的 *SolverConfig.xml 和 *BenchmarkConfig.xml 文件中的示例:
OptaPlanner 8 中的 *SolverConfig.xml 和 *BenchmarkConfig.xml 文件中的示例:
solver : getScoreDirectorFactory () removed
主,公共 API
getScoreDirectorFactory () 方法已弃用,现在已从 Solver 和 类中删除。
Solver Factory
您不再需要仅创建 Solver 实例来计算或解释 UI 中的分数。改为使用 ScoreManager API。
OptaPlanner 7 中的 *.java 文件示例:
SolverFactory<VehicleRoutingSolution> solverFactory = SolverFactory.createFromXmlResource(...); Solver<VehicleRoutingSolution> solver = solverFactory.buildSolver(); uiScoreDirectorFactory = solver.getScoreDirectorFactory(); ...
SolverFactory<VehicleRoutingSolution> solverFactory = SolverFactory.createFromXmlResource(...);
Solver<VehicleRoutingSolution> solver = solverFactory.buildSolver();
uiScoreDirectorFactory = solver.getScoreDirectorFactory();
...
OptaPlanner 8 中的 *.java 文件示例:
SolverFactory<VehicleRoutingSolution> solverFactory = SolverFactory.createFromXmlResource(...); ScoreManager<VehicleRoutingSolution> scoreManager = ScoreManager.create(solverFactory); ...
SolverFactory<VehicleRoutingSolution> solverFactory = SolverFactory.createFromXmlResource(...);
ScoreManager<VehicleRoutingSolution> scoreManager = ScoreManager.create(solverFactory);
...
不应再使用 ScoreDirectorFactory,因为它一直位于公共 API 之外,其所有功能都在公共 API 的各个部分中公开。
solver.explainBestScore () 已被删除
主,公共 API
Solver 接口上的 explainBestScore () 方法已在 7.x 中弃用,现已被删除。您可以通过新的 ScoreManager API 获取相同的信息。
红帽建议您不要以任何方式解析此方法调用的结果。
OptaPlanner 7 中的 *.java 文件示例:
solver = ...; scoreExplanation = solver.explainBestScore();
solver = ...;
scoreExplanation = solver.explainBestScore();
OptaPlanner 8 中的 *.java 文件示例:
MySolution solution = ...; ScoreManager<MySolution> scoreManager = ...; scoreExplanation = scoreManager.explainScore(solution);
MySolution solution = ...;
ScoreManager<MySolution> scoreManager = ...;
scoreExplanation = scoreManager.explainScore(solution);
Solver 接口方法 getBestSolution (), getBestScore (), 和 getTimeMillisSpent () 已被删除
次,公共 API
Solver 接口中的多个方法在 7.x 中已弃用,并已被删除。您可以通过 Solver.add 注册 EventListener 来获取相同的信息。
EventListener (…)
OptaPlanner 7 中的 *.java 文件示例:
solver = ...; solution = solver.getBestSolution(); score = solver.getBestScore(); timeMillisSpent = solver.getTimeMillisSpent();
solver = ...;
solution = solver.getBestSolution();
score = solver.getBestScore();
timeMillisSpent = solver.getTimeMillisSpent();
OptaPlanner 8 中的 *.java 文件示例:
注解扫描已被删除
主,公共 API
solver 配置中的 & lt;scanAnnotatedClasses /> 指令在 7.x 中弃用,现已被删除。
OptaPlanner 7 中的 *.xml 文件示例:
<solver>
...
<scanAnnotatedClasses/>
...
</solver>
<solver>
...
<scanAnnotatedClasses/>
...
</solver>
OptaPlanner 8 中的 *.xml 文件示例:
@PlanningFactProperty 和 @PlanningFactCollectionProperty的新软件包
主,公共 API
@PlanningFactProperty 和 @PlanningFactCollectionProperty 注释现在与其他类似注释(如 @PlanningSolution )共享相同的软件包。旧注解在 7.x 中弃用并被删除。
OptaPlanner 7 中的 *.java 文件示例:
import org.optaplanner.core.api.domain.solution.drools.ProblemFactCollectionProperty; import org.optaplanner.core.api.domain.solution.drools.ProblemFactProperty;
import org.optaplanner.core.api.domain.solution.drools.ProblemFactCollectionProperty;
import org.optaplanner.core.api.domain.solution.drools.ProblemFactProperty;
OptaPlanner 8 中的 *.java 文件示例:
import org.optaplanner.core.api.domain.solution.ProblemFactCollectionProperty; import org.optaplanner.core.api.domain.solution.ProblemFactProperty;
import org.optaplanner.core.api.domain.solution.ProblemFactCollectionProperty;
import org.optaplanner.core.api.domain.solution.ProblemFactProperty;
filterClassList 替换为单个过滤器类
次,公共 API
EntitySelector、ValueSelector 和 MoveSelector 的配置现在在配置 API 和 solver 配置 XML 中都有一个过滤器类。
在实践中,您不需要多个选择过滤器类,您可以将它们替换为实施所有它们逻辑的单一选择过滤器类。现在,传递一个选择类需要较少的样板代码。
OptaPlanner 7 中的 *.java 文件示例:
ValueSelectorConfig valueSelectorConfig = new ValueSelectorConfig(); valueSelectorConfig.setFilterClassList(Collections.singletonList(MySelectionFilterClass.class));
ValueSelectorConfig valueSelectorConfig = new ValueSelectorConfig();
valueSelectorConfig.setFilterClassList(Collections.singletonList(MySelectionFilterClass.class));
OptaPlanner 8 中的 *.java 文件示例:
ValueSelectorConfig valueSelectorConfig = new ValueSelectorConfig(); valueSelectorConfig.setFilterClass(MySelectionFilterClass.class);
ValueSelectorConfig valueSelectorConfig = new ValueSelectorConfig();
valueSelectorConfig.setFilterClass(MySelectionFilterClass.class);
使用单个选择过滤器类替换多个选择过滤器类
OptaPlanner 7 中的 *.xml 文件示例:
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.xml 文件示例:
<swapMoveSelector>
<entitySelector>
<filterClass>com.example.SingleEntityFilter</filterClass>
</entitySelector>
</swapMoveSelector>
<swapMoveSelector>
<entitySelector>
<filterClass>com.example.SingleEntityFilter</filterClass>
</entitySelector>
</swapMoveSelector>
OptaPlanner 8 中的 *.java 文件示例:
AcceptorConfig 被重命名为 LocalSearchAcceptorConfig
次
这只会影响配置 API。解决器配置 XML 文件保持不变。
实现与其他特定于本地搜索的配置类的命名一致性。
OptaPlanner 7 中的 *.java 文件示例:
LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig()
.withAcceptorConfig(new AcceptorConfig().withEntityTabuSize(5));
LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig()
.withAcceptorConfig(new AcceptorConfig().withEntityTabuSize(5));
OptaPlanner 8 中的 *.java 文件示例:
LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig()
.withAcceptorConfig(new LocalSearchAcceptorConfig().withEntityTabuSize(5));
LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig()
.withAcceptorConfig(new LocalSearchAcceptorConfig().withEntityTabuSize(5));
自定义属性 XML 配置格式更改
次,公共 API
此问题仅影响解析器配置 XML,特别是 < scoreDirectorFactory/> , < moveIteratorFactory/> , < moveListFactory/> , & lt ;partitionedSearch/> 和 & lt;customPhase/>。
这一更改是为了在构建时强制实施配置 XML 的结构。
OptaPlanner 7 中的 *.xml 文件示例:
OptaPlanner 8 中的 *.xml 文件示例:
<variableNameInclude/& gt; 元素现在被 < variableNameIncludes/> 元素包装
次,公共 API
这个版本只影响 solver 配置 XML,特别是 < swapMoveSelector/> 和 & lt ;pillarSwapMoveSelector/> 元素。
这一更改是为了在构建时强制实施配置 XML 的结构。
OptaPlanner 7 中的 *.xml 文件示例:
<swapMoveSelector> <variableNameInclude>variableA</variableNameInclude> <variableNameInclude>variableB</variableNameInclude> </swapMoveSelector>
<swapMoveSelector>
<variableNameInclude>variableA</variableNameInclude>
<variableNameInclude>variableB</variableNameInclude>
</swapMoveSelector>
OptaPlanner 8 中的 *.xml 文件示例:
删除了 解决方案 接口
次,公共 API
Solution 接口已弃用并删除。AbstractSolution 接口(仅被 Business Central 使用)也已被删除。
删除 Solution 接口,将 getScore () 方法标上 @PlanningScore,并将 getProblemFacts () 方法替换为每个问题事实 getter (或字段)上的 @ProblemFactCollectionProperty 注释。
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
对于没有包括在集合中的单个问题事实,请使用 @ProblemFactProperty 注释,如下例所示,同时存在字段注释:
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
不要对具有 @PlanningEntityCollectionProperty 注释的 getter (或字段)添加 @ProblemFactCollectionProperty 注释。
BestSolutionChangedEvent:isNewBestSolutionInitialized () 已删除
次,公共 API
BestSolutionChangedEvent.isNewBestSolutionInitialized () 方法已弃用,并替换为 BestSolutionChangedEvent.getNewBestSolution ().getScore ().isSolutionInitialized () 方法。BestSolutionChangedEvent.isNewBestSolutionInitialized () 方法已被删除。
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
如果您检查 isFeasible (),它将检查是否初始化了解决方案。
OptaPlanner 8 中的 *.java 文件示例:
<valueSelector > : variableName 现在是一个属性
次,公共 API
当电源调整移动选择器(如 < changeMoveSelector> )时,在带有多个规划变量的用例中,< ;variableName& gt; XML 元素已被一个 variableName="…" XML 属性替代。这一更改可减少解决者配置详细程度。在整个 7.x 系列中被弃用后,旧方法现已被删除。
OptaPlanner 7 中的 *SolverConfig.xml 和 *BenchmarkConfig.xml 文件中的示例:
<valueSelector>
<variableName>room</variableName>
</valueSelector>
<valueSelector>
<variableName>room</variableName>
</valueSelector>
OptaPlanner 8 中的 *SolverConfig.xml 和 *BenchmarkConfig.xml 文件中的示例:
<valueSelector variableName="room"/>
<valueSelector variableName="room"/>
分区的搜索:已删除 threadFactoryClass
次,公共 API
因为 <solver& gt; 有一些时间支持 <threadFactoryClass > 元素,所以 & lt; gt; 元素已被删除。
partitionedSearch> 下的 <threadFactoryClass &
OptaPlanner 7 中的 *SolverConfig.xml 和 *BenchmarkConfig.xml 文件中的示例:
OptaPlanner 8 中的 *SolverConfig.xml 和 *BenchmarkConfig.xml 文件中的示例:
SimpleDoubleScore 和 HardSoftDoubleScore removed
次,公共 API
不建议使用基于双分的分数类型,因为它们可能导致分数损坏。它们已被删除。
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
Score.toInitializedScore() removed
次,公共 API
Score.toInitializedScore () 方法已弃用,并使用 7.x 中的 Score.withInitScore (int) 方法替代,现已被删除。
OptaPlanner 7 中的 *.java 文件示例:
score = score.toInitializedScore();
score = score.toInitializedScore();
OptaPlanner 8 中的 *.java 文件示例:
score = score.withInitScore(0);
score = score.withInitScore(0);
已删除各种原因
次,公共 API
以下 Comparator 实现在 7.x 中已弃用并删除:
-
org.optaplanner.core.api.score.comparator.NaturalScoreComparator -
org.optaplanner.core.api.score.constraint.ConstraintMatchScoreComparator -
org.optaplanner.core.api.score.constraint.ConstraintMatchTotalScoreComparator -
org.optaplanner.core.api.score.constraint.IndictmentScoreComparator
OptaPlanner 7 中的 *.java 文件示例:
NaturalScoreComparator comparator = new NaturalScoreComparator(); ConstraintMatchScoreComparator comparator2 = new ConstraintMatchScoreComparator();
NaturalScoreComparator comparator = new NaturalScoreComparator();
ConstraintMatchScoreComparator comparator2 = new ConstraintMatchScoreComparator();
OptaPlanner 8 中的 *.java 文件示例:
Comparator<Score> comparator = Comparable::compareTo; Comparator<ConstraintMatch> comparator2 = Comparator.comparing(ConstraintMatch::getScore);
Comparator<Score> comparator = Comparable::compareTo;
Comparator<ConstraintMatch> comparator2 = Comparator.comparing(ConstraintMatch::getScore);
删除 FeasibilityScore
次,公共 API
FeasibilityScore 接口在 7.x 中已弃用,它唯一方法为 isFeasible () 移到 Score supertype。接口现已被删除。
您应该通过其 ultimate 类型引用 Score,例如 HardSoftScore 而不是 Score。
@PlanningEntity.movableEntitySelectionFilter removed
次,公共 API
@PlanningEntity 注解上的 movableEntitySelectionFilter 字段已在 7.x 中弃用,一个新的字段 pinningFilter 已被引入了一个名称,它显示 @PlanningPin 注释的相关名称。此过滤器实施一个新的 PinningFilter 接口,如果实体被固定,则返回 true,如果可移动,则为 false。因此,与旧过滤器相比,这个新过滤器的逻辑颠倒。
您应该通过提供新过滤器而不是旧过滤器来更新 @PlanningEntity 注释。旧的过滤器现已被删除。
OptaPlanner 7 中的 *.java 文件示例:
@PlanningEntity(movableEntitySelectionFilter = MyMovableEntitySelectionFilter.class)
@PlanningEntity(movableEntitySelectionFilter = MyMovableEntitySelectionFilter.class)
OptaPlanner 8 中的 *.java 文件示例:
@PlanningEntity(pinningFilter = MyPinningFilter.class)
@PlanningEntity(pinningFilter = MyPinningFilter.class)
@PlanningVariable.reinitializeVariableEntityFilter removed
次,公共 API
@PlanningVariable 注解上的 reinitializeVariableEntityFilter 字段在 7.x 中弃用,现在已被删除。
*ScoreHolder 类转换为接口
次,公共 API
在 OptaPlanner 7 中,ScoreHolder 类专门用于 Drools 分数计算,公开了很多公共方法(如果使用),允许用户意外损坏或对分数造成负面影响。
在 OptaPlanner 8 中,这些方法已被删除,并将类转换为接口。大多数用户都不使用删除的方法,并可能会有害的方法。
但是,如果您确实使用这些方法,您将在分数说明和约束配置区域在公共 API 中找到合适的替换。
ValueRangeFactory 类现在最终
次
ValueRangeFactory 类是一个仅具有静态方法的工厂类。因此,您不需要扩展这个类,因此最终已成为 最终。
OptaPlanner 7 中的 *.java 文件示例:
class MyValueRangeFactory extends ValueRangeFactory {
...
}
class MyValueRangeFactory extends ValueRangeFactory {
...
}
OptaPlanner 8 中的 *.java 文件示例:
class MyValueRangeFactory {
...
}
class MyValueRangeFactory {
...
}
ConstraintMatchTotal 和 Indictment 现在是接口
次,公共 API
ConstraintMatchTotal 和 Indictment 类已转换为接口。因此,它们的实现被从公共 API 中移出,以及允许它们修改其状态的方法。这些方法从不用于公共 API,因此没有替换它们。
如果您选择实施 ConstraintMatchAwareIncrementalScoreCalculator,您可能仍然需要实例:
ConstraintMatchTotal maximumCapacityMatchTotal = new ConstraintMatchTotal(...);
ConstraintMatchTotal maximumCapacityMatchTotal = new ConstraintMatchTotal(...);
OptaPlanner 8 中的 *.java 文件示例:
ConstraintMatchTotal maximumCapacityMatchTotal = new DefaultConstraintMatchTotal(...);
ConstraintMatchTotal maximumCapacityMatchTotal = new DefaultConstraintMatchTotal(...);
ScoreManager: 添加了通用类型 Score
主,公共 API
ScoreManager 和 ScoreExplanation API 现在具有通用类型 分数,以避免在代码中停机,例如从 Score 到 HardSoftScore。
OptaPlanner 7 中的 *.java 文件示例:
@Inject // or @Autowired
ScoreManager<TimeTable> scoreManager;
@Inject // or @Autowired
ScoreManager<TimeTable> scoreManager;
OptaPlanner 8 中的 *.java 文件示例:
@Inject // or @Autowired
ScoreManager<TimeTable, HardSoftScore> scoreManager;
@Inject // or @Autowired
ScoreManager<TimeTable, HardSoftScore> scoreManager;
OptaPlanner 7 中的 *.java 文件示例:
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable);
HardSoftScore score = (HardSoftScore) explanation.getScore();
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable);
HardSoftScore score = (HardSoftScore) explanation.getScore();
OptaPlanner 8 中的 *.java 文件示例:
ScoreExplanation<TimeTable, HardSoftScore> explanation = scoreManager.explainScore(timeTable);
HardSoftScore score = explanation.getScore();
ScoreExplanation<TimeTable, HardSoftScore> explanation = scoreManager.explainScore(timeTable);
HardSoftScore score = explanation.getScore();
ConstraintMatchTotal,ConstraintMatch, 和 Indictment: generic type Score added
主
与 ScoreManager 和 ScoreExplanation 类似,ConstraintMatchTotal、ConstraintMatch 和 Indictment API 现在有一个通用类型 Score,以避免在代码中停机,例如从 Score 到 HardSoftScore。
OptaPlanner 7 中的 *.java 文件示例:
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable);
Map<String, ConstraintMatchTotal> constraintMatchTotalMap = scoreExplanation.getConstraintMatchTotalMap();
ConstraintMatchTotal constraintMatchTotal = constraintMatchTotalMap.get(contraintId);
HardSoftScore totalScore = (HardSoftScore) constraintMatchTotal.getScore();
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable);
Map<String, ConstraintMatchTotal> constraintMatchTotalMap = scoreExplanation.getConstraintMatchTotalMap();
ConstraintMatchTotal constraintMatchTotal = constraintMatchTotalMap.get(contraintId);
HardSoftScore totalScore = (HardSoftScore) constraintMatchTotal.getScore();
OptaPlanner 8 中的 *.java 文件示例:
ScoreExplanation<TimeTable, HardSoftScore> explanation = scoreManager.explainScore(timeTable);
Map<String, ConstraintMatchTotal<HardSoftScore>> constraintMatchTotalMap = scoreExplanation.getConstraintMatchTotalMap();
ConstraintMatchTotal<HardSoftScore> constraintMatchTotal = constraintMatchTotalMap.get(contraintId);
HardSoftScore totalScore = constraintMatchTotal.getScore();
ScoreExplanation<TimeTable, HardSoftScore> explanation = scoreManager.explainScore(timeTable);
Map<String, ConstraintMatchTotal<HardSoftScore>> constraintMatchTotalMap = scoreExplanation.getConstraintMatchTotalMap();
ConstraintMatchTotal<HardSoftScore> constraintMatchTotal = constraintMatchTotalMap.get(contraintId);
HardSoftScore totalScore = constraintMatchTotal.getScore();
OptaPlanner 7 中的 *.java 文件示例:
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable);
Map<Object, Indictment> indictmentMap = scoreExplanation.getIndictmentMap();
Indictment indictment = indictmentMap.get(lesson);
HardSoftScore totalScore = (HardSoftScore) indictment.getScore();
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable);
Map<Object, Indictment> indictmentMap = scoreExplanation.getIndictmentMap();
Indictment indictment = indictmentMap.get(lesson);
HardSoftScore totalScore = (HardSoftScore) indictment.getScore();
OptaPlanner 8 中的 *.java 文件示例:
ScoreExplanation<TimeTable, HardSoftScore> explanation = scoreManager.explainScore(timeTable);
Map<Object, Indictment<HardSoftScore>> indictmentMap = scoreExplanation.getIndictmentMap();
Indictment<HardSoftScore> indictment = indictmentMap.get(lesson);
HardSoftScore totalScore = indictment.getScore();
ScoreExplanation<TimeTable, HardSoftScore> explanation = scoreManager.explainScore(timeTable);
Map<Object, Indictment<HardSoftScore>> indictmentMap = scoreExplanation.getIndictmentMap();
Indictment<HardSoftScore> indictment = indictmentMap.get(lesson);
HardSoftScore totalScore = indictment.getScore();
ConstraintMatchAwareIncrementalScoreCalculator: 通用类型 Score 添加了
次
现在,接口 ConstraintMatchAwareIncrementalScoreCalculator 也是 Score 的通用类型参数,以避免原始类型使用 ConstraintMatchTotal 和 Indictment。
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
AbstractCustomPhaseCommand 已被删除
次,公共 API
删除了抽象类 AbstractCustomPhaseCommand。任何扩展它的类都应直接实施 CustomPhaseCommand 接口。
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
分数计算器被移到公共 API
主
接口 EasyScoreCalculator,IncrementalScoreCalculator, and ConstraintMatchAwareIncrementalScoreCalculator 已移到公共 API 中的新软件包。其已弃用的 counterparts 已被删除。弃用的类 org.optaplanner.core.impl.score.director.incremental.AbstractIncrementalScoreCalculator 也已被删除。将已删除接口和类的使用替换为公共 API 中的对应部分。
OptaPlanner 7 中的 EasyScoreCalculator.java 文件示例:
OptaPlanner 8 中的 EasyScoreCalculator.java 文件示例:
OptaPlanner 7 中的 IncrementalScoreCalculator.java 文件示例:
OptaPlanner 8 中的 IncrementalScoreCalculator.java 文件示例:
OptaPlanner 7 中的 ConstraintMatchAwareIncrementalScoreCalculator.java 文件示例:
OptaPlanner 8 中的 ConstraintMatchAwareIncrementalScoreCalculator.java 文件示例:
PlannerBenchmarkFactory:createFromSolverFactory () removed
主,公共 API
PlannerBenchmarkFactory.createFromSolverFactory () 方法已弃用,并替换为 PlannerBenchmarkFactory.createFromSolverConfigXmlResource (String) 方法。PlannerBenchmarkFactory.createFromSolverFactory () 方法已被删除。
OptaPlanner 7 中的 *.java 文件示例:
SolverFactory<CloudBalance> solverFactory = SolverFactory.createFromXmlResource(
".../cloudBalancingSolverConfig.xml");
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromSolverFactory(solverFactory);
SolverFactory<CloudBalance> solverFactory = SolverFactory.createFromXmlResource(
".../cloudBalancingSolverConfig.xml");
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromSolverFactory(solverFactory);
OptaPlanner 8 中的 *.java 文件示例:
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromSolverConfigXmlResource(
".../cloudBalancingSolverConfig.xml");
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromSolverConfigXmlResource(
".../cloudBalancingSolverConfig.xml");
如果您以编程方式调整了 solver 配置,您可以使用 PlannerBenchmarkConfig.createFromSolverConfig (SolverConfig),然后 PlannerBenchmarkFactory.create (PlannerBenchmarkConfig)。
PlannerBenchmarkFactory:getPlannerBenchmarkConfig () 已删除
次,公共 API
PlannerBenchmarkFactory.getPlannerBenchmarkConfig () 方法已弃用,并替换为 PlannerBenchmarkFactory.create (PlannerBenchmarkConfig) 方法。PlannerBenchmarkConfig 实例现在在 PlannerBenchmarkFactory 实例实例化前实例化。该顺序更为逻辑。PlannerBenchmarkFactory.getPlannerBenchmarkConfig () 已被删除。
OptaPlanner 7 中的 *.java 文件示例:
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
PlannerBenchmarkConfig benchmarkConfig = benchmarkFactory.getPlannerBenchmarkConfig();
...
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
PlannerBenchmarkConfig benchmarkConfig = benchmarkFactory.getPlannerBenchmarkConfig();
...
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
OptaPlanner 8 中的 *.java 文件示例:
PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.create(benchmarkConfig);
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.create(benchmarkConfig);
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
XML <plannerBenchmark/> root 元素现在属于 http://www.optaplanner.org/xsd/benchmark 命名空间
次,公共 API
OptaPlanner 现在为基准配置提供 XML 架构定义(XSD)。虽然 OptaPlanner 与早期版本的现有 XML 配置保持兼容,但强烈建议迁移到 XSD,因为 OptaPlanner 可能以后只支持有效的配置 XML。
OptaPlanner 7 中的 *BenchmarkConfig.xml 文件示例:
<?xml version="1.0" encoding="UTF-8"?> <plannerBenchmark> ... </plannerBenchmark>
<?xml version="1.0" encoding="UTF-8"?>
<plannerBenchmark>
...
</plannerBenchmark>
OptaPlanner 8 中的 *BenchmarkConfig.xml 文件示例:
<?xml version="1.0" encoding="UTF-8"?> <plannerBenchmark xmlns="https://www.optaplanner.org/xsd/benchmark" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.optaplanner.org/xsd/benchmark https://www.optaplanner.org/xsd/benchmark/benchmark.xsd"> ... </plannerBenchmark>
<?xml version="1.0" encoding="UTF-8"?>
<plannerBenchmark xmlns="https://www.optaplanner.org/xsd/benchmark" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.optaplanner.org/xsd/benchmark https://www.optaplanner.org/xsd/benchmark/benchmark.xsd">
...
</plannerBenchmark>
使用 XSD 可能需要对配置的一些 XML 元素重新排序。在 IDE 中使用代码完成来迁移到有效的 XML。
ProblemBenchmarksConfig:xStreamAnnotatedClass removed
主,公共 API
{mAnnotatedClas} 已从 < problemBenchmarks/> 配置以及对应的 getXStreamAnnotatedClassList () 和 setXStreamAnnotatedClassList () 方法中删除。
OptaPlanner 7 中的 *.java 文件示例:
ProblemBenchmarksConfig problemBenchmarksConfig = new ProblemBenchmarksConfig(); problemBenchmarksConfig.setXStreamAnnotatedClassList(MySolution.class);
ProblemBenchmarksConfig problemBenchmarksConfig = new ProblemBenchmarksConfig();
problemBenchmarksConfig.setXStreamAnnotatedClassList(MySolution.class);
OptaPlanner 8 中的 *.java 文件示例:
OptaPlanner 7 中的 *BenchmarkConfig.xml 文件示例:
OptaPlanner 8 中的 *BenchmarkConfig.xml 文件示例:
BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkFactory) 已删除
次
BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkFactory) 方法已弃用,并替换为 BenchmarkAggregatorFrame.createAndDisplayFromXmlResource (String) 方法。BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkFactory) 方法已被删除。
OptaPlanner 7 中的 *.java 文件示例:
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
BenchmarkAggregatorFrame.createAndDisplay(benchmarkFactory);
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
BenchmarkAggregatorFrame.createAndDisplay(benchmarkFactory);
OptaPlanner 8 中的 *.java 文件示例:
BenchmarkAggregatorFrame.createAndDisplayFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
BenchmarkAggregatorFrame.createAndDisplayFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
如果您以编程方式调整基准配置,您可以使用 BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkConfig)。
删除了配置中的 JavaScript 表达式支持
次
solver 配置和基准配置的各种元素不再支持嵌套 JavaScript 表达式。您必须将它们替换为自动配置,或替换为整数常量。
OptaPlanner 7 中的 solverConfig.xml 文件中的示例:
<solver>
...
<moveThreadCount>availableProcessorCount - 1</moveThreadCount>
...
</solver>
<solver>
...
<moveThreadCount>availableProcessorCount - 1</moveThreadCount>
...
</solver>
OptaPlanner 8 中的 'solverConfig.xml'file 的示例:
<solver>
...
<moveThreadCount>1</moveThreadCount> <!-- Alternatively, use "AUTO" or omit entirely. -->
...
</solver>
<solver>
...
<moveThreadCount>1</moveThreadCount> <!-- Alternatively, use "AUTO" or omit entirely. -->
...
</solver>
OptaPlanner 7 中的 benchmarkConfig.xml 文件示例:
<plannerBenchmark>
...
<parallelBenchmarkCount>availableProcessorCount - 1</parallelBenchmarkCount>
...
</plannerBenchmark>
<plannerBenchmark>
...
<parallelBenchmarkCount>availableProcessorCount - 1</parallelBenchmarkCount>
...
</plannerBenchmark>
OptaPlanner 8 中的 benchmarkConfig.xml 文件示例:
<plannerBenchmark>
...
<parallelBenchmarkCount>1</parallelBenchmarkCount> <!-- Alternatively, use "AUTO" or omit entirely. -->
...
</plannerBenchmark>
<plannerBenchmark>
...
<parallelBenchmarkCount>1</parallelBenchmarkCount> <!-- Alternatively, use "AUTO" or omit entirely. -->
...
</plannerBenchmark>
删除了已弃用的变量监听程序
主,公共 API
软件包 org.optaplanner.core.impl.domain.variable.listener 中的已弃用的接口 VariableListener 已被删除,以及已弃用的接口 StatefulVariableListener 以及同一软件包中已弃用的类 VariableListenerAdapter。使用 org.optaplanner.core.api.domain.variable 软件包中的 VariableListener 接口。
OptaPlanner 7 中的 VariableListener.java 文件示例:
OptaPlanner 8 中的 VariableListener.java 文件示例:
OptaPlanner 7 中的 StatefulVariableListener.java 文件示例:
OptaPlanner 8 中的 StatefulVariableListener.java 文件示例: