第 1 章 与 OptaPlanner 7.x 或更早版本不兼容的更改
部分中列出的更改与 OptaPlanner 7.x 或更早版本的 OptaPlanner 不兼容。
需要 Java 11 或更高版本
主、公共 API
如果您使用 JRE 或 JDK 8,请升级到 JDK 11 或更高版本。
在 Linux 上,从您的 Linux 软件存储库获取 OpenJDK。在 Fedora 和 Red Hat Enterprise Linux 中输入以下命令:
sudo dnf install java-11-openjdk-devel- 在 Windows 和 macOS 上,从 AdoptOpenJDK 网站下载 OpenJDK。
SolverFactory 和 PlannerBenchmarkFactory 不再支持 KIE 容器
主、公共 API
因为 OptaPlanner 现在与 Kogito 一致,所以 KIE 容器概念不再适用。因此,Solver Factory 不再允许您从 KIE 容器创建 Solver 实例。这也适用于 PlannerBenchmarkFactory 和基准测试。
已删除 平均元数据
主、公共 API
由于 OptaPlanner 8.x 系列中的 OptaPlanner JAR 文件使用有限,META-INF/MANIFEST.MF 文件中的 OptaPlanner JAR 文件不再包含在其 META-INF/MANIFEST.MF 文件中。
禁止使用 Java 序列化
次、公共 API
在 OptaPlanner 8 中,大多数使用 Serializable 标记接口已从公共 API 中删除。考虑使用 JSON 或者其他格式进行序列化。
SolverFactory.getScoreDirectorFactory () 替换为 ScoreManager
主、公共 API
在 OptaPlanner 版本 7 中,需要使用 ScoreDirectorFactory 才能解释分数。在 OptaPlanner 版本 8 中,新功能被添加到 ScoreManager 中,因此不再造成创建新 ScoreDirector 实例的原因。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
ScoreDirectorFactory<CloudBalance> scoreDirectorFactory = solverFactory.getScoreDirectorFactory();
try (ScoreDirector<CloudBalance> scoreDirector = scoreDirectorFactory.buildScoreDirector()) {
scoreDirector.setWorkingSolution(solution);
Score score = scoreDirector.calculateScore();
}
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
ScoreManager<CloudBalance> scoreManager = ScoreManager.create(solverFactory);
Score score = scoreManager.updateScore(solution);
允许您检索 ScoreDirector 和 ScoreDirectorFactory 实例的方法已从公共 API 中删除,而无需替换。ScoreDirector 接口的减少版本被提升到公共 API,将 ProblemFactChange 接口提升到公共 API。
SolverFactory:getSolverConfig () removed
次、公共 API
SolverFactory.getSolverConfig () 方法已弃用,并替换为 SolverFactory.create (SolverConfig) 方法。SolverConfig 实例现在在 SolverFactory 实例实例化前实例化,这更为自然。上一个顺序已被删除。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
SolverFactory<MySolution> solverFactory = SolverFactory.createFromXmlResource(".../mySolverConfig.xml");
SolverConfig solverConfig = solverFactory.getSolverConfig();
...
Solver<MySolution> solver = solverFactory.buildSolver();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
如果您也通过 ClassLoader,请将其传递到 SolverConfig.createFromXmlResource () 和 SolverFactory.create ()。
SolverConfig:buildSolver () removed
次、公共 API
SolverConfig.buildSolver () 方法是一个不在公共 API 中的内部方法。改为使用 SolverFactory.buildSolver () 方法。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
Solver<MySolution> solver = solverConfig.buildSolver();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
PlannerBenchmarkConfig:buildPlannerBenchmark () removed
次、公共 API
PlannerBenchmarkConfig.buildPlannerBenchmark () 方法是一个不在公共 API 中的内部方法。使用 PlannerBenchmarkFactory.buildPlannerBenchmark () 方法替代。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.create(benchmarkConfig);
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
SolverFactory:cloneSolverFactory () 已删除
次、公共 API
SolverFactory.cloneSolverFactory () 方法已弃用,并替换为新的 SolverConfig (SolverConfig) 复制构造器和 SolverFactory.cloneSolverFactory () 方法已被删除。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
private SolverFactory<MySolution> base;
public void userRequest(..., long userInput) {
SolverFactory<MySolution> solverFactory = base.cloneSolverFactory();
solverFactory.getSolverConfig()
.getTerminationConfig()
.setMinutesSpentLimit(userInput);
Solver<MySolution> solver = solverFactory.buildSolver();
...
}
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
private SolverConfig base;
public void userRequest(..., long userInput) {
SolverConfig solverConfig = new SolverConfig(base); // Copy it
solverConfig.getTerminationConfig()
.setMinutesSpentLimit(userInput);
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
...
}
SolverFactory:createEmpty () removed
次、公共 API
SolverFactory.createEmpty () 方法已弃用,并 替换为新的 SolverConfig () 方法。SolverFactory.createEmpty () 方法已被删除。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
SolverFactory<MySolution> solverFactory = SolverFactory.createEmpty();
SolverConfig solverConfig = solverFactory.getSolverConfig()
...
Solver<MySolution> solver = solverFactory.buildSolver();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
SolverConfig solverConfig = new SolverConfig();
...
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
XML <solver/> root 元素现在属于 https://www.optaplanner.org/xsd/solver 命名空间
主、公共 API
OptaPlanner 现在为 resolver 配置提供了一个 XML 模式定义。虽然 OptaPlanner 保留与现有 XML 配置之前的版本的兼容性,但强烈建议迁移到 XSD,因为 OptaPlanner 可能在以后只支持有效的配置 XML。
在 OptaPlanner 7 中,在 OptaPlanner 7 中,一个来自 192.168.1.0/24 SolverConfig.xml 文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<solver>
...
</solver>
OptaPlanner 8 中的 192.168.1.0/24SolverConfig.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>
使用 XSD 可能需要重新排序配置的一些 XML 元素。使用 IDE 中的代码完成迁移到有效的 XML。
移动选择器配置中的属性 subPillarEnabled 已被删除
次、公共 API
PillarSwapMoveSelector 和 PillarChangeMoveSelector 上的 subPillarEnabled 属性已弃用,并替换为新属性 subPillarType。subPillarEnabled 属性已被删除。
在 OptaPlanner 7 中,在 OptaPlanner 7 中,一个来自 OptaPlannerConfig.xml 文件的示例:
<pillar...MoveSelector>
...
<pillarSelector>
<subPillarEnabled>false</subPillarEnabled>
...
</pillarSelector>
...
</pillar...MoveSelector>
在 OptaPlanner 8 中,在 OptaPlanner 8 中,一个来自 OptaPlannerConfig.xml 文件的示例:
<pillar...MoveSelector>
<subPillarType>NONE</subPillarType>
<pillarSelector>
...
</pillarSelector>
...
</pillar...MoveSelector>
solver:getScoreDirectorFactory () removed
主、公共 API
getScoreDirectorFactory () 方法已弃用,现在已从 Solver 和 类中删除。
Solver Factory
您不再需要创建 Solver 实例 来计算或解释 UI 中的分数。改为使用 ScoreManager API。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
SolverFactory<VehicleRoutingSolution> solverFactory = SolverFactory.createFromXmlResource(...);
Solver<VehicleRoutingSolution> solver = solverFactory.buildSolver();
uiScoreDirectorFactory = solver.getScoreDirectorFactory();
...
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
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 中的 OptaPlanner 7 中的一个示例:
solver = ...;
scoreExplanation = solver.explainBestScore();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
MySolution solution = ...;
ScoreManager<MySolution> scoreManager = ...;
scoreExplanation = scoreManager.explainScore(solution);
Solver 接口方法 getBestSolution ()、getBestScore () 和 getTimeMillisSpent () 已被删除
次、公共 API
Solver 接口上的几种方法 已在 7.x 中弃用,并已被删除。您可以通过 Solver.add 注册 EventListener 来获取相同的信息。
EventListener (…)
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
solver = ...;
solution = solver.getBestSolution();
score = solver.getBestScore();
timeMillisSpent = solver.getTimeMillisSpent();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
solver = ...;
solver.addEventListener(event -> {
solution = event.getNewBestSolution();
score = event.getNewBestScore();
timeMillisSpent = event.getTimeMillisSpent();
});
注解扫描已被删除
主、公共 API
resolver 配置中的 < scanAnnotatedClasses /> 指令已在 7.x 中弃用,现已被删除。
OptaPlanner 7 中的 OptaPlanner 7 文件中的一个示例:
<solver>
...
<scanAnnotatedClasses/>
...
</solver>
OptaPlanner 8 中的 OptaPlanner 8 文件中的一个示例:
<solver>
...
<solutionClass>...</solutionClass>
<entityClass>...</entityClass>
...
</solver>
@PlanningFactProperty 和 @PlanningFactCollectionProperty的新软件包
主、公共 API
@PlanningFactProperty 和 @PlanningFactCollectionProperty 注释现在与其他类似注解(如 @PlanningSolution )共享相同的软件包。旧注解在 7.x 中已弃用并删除。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
import org.optaplanner.core.api.domain.solution.drools.ProblemFactCollectionProperty;
import org.optaplanner.core.api.domain.solution.drools.ProblemFactProperty;
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
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 中的 OptaPlanner 7 中的一个示例:
ValueSelectorConfig valueSelectorConfig = new ValueSelectorConfig();
valueSelectorConfig.setFilterClassList(Collections.singletonList(MySelectionFilterClass.class));
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
ValueSelectorConfig valueSelectorConfig = new ValueSelectorConfig();
valueSelectorConfig.setFilterClass(MySelectionFilterClass.class);
使用单个选择过滤器类替换多个选择过滤器类
OptaPlanner 7 中的 OptaPlanner 7 文件中的一个示例:
<swapMoveSelector>
<entitySelector>
<filterClass>com.example.FilterA</filterClass>
<filterClass>com.example.FilterB</filterClass>
</entitySelector>
</swapMoveSelector>
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
package com.example;
...
public class FilterA implements SelectionFilter<MySolution, MyPlanningEntity> {
@Override
public boolean accept(ScoreDirector<MySolution> scoreDirector, MyPlanningEntity selection) {
return selection.getValue() < 500;
}
}
package com.example;
...
public class FilterB implements SelectionFilter<MySolution, MyPlanningEntity> {
@Override
public boolean accept(ScoreDirector<MySolution> scoreDirector, MyPlanningEntity selection) {
return selection.getOrder() == Order.ASC;
}
}
OptaPlanner 8 中的 OptaPlanner 8 文件中的一个示例:
<swapMoveSelector>
<entitySelector>
<filterClass>com.example.SingleEntityFilter</filterClass>
</entitySelector>
</swapMoveSelector>
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
package com.example;
...
public class SingleEntityFilter implements SelectionFilter<MySolution, MyPlanningEntity> {
@Override
public boolean accept(ScoreDirector<MySolution> scoreDirector, MyPlanningEntity selection) {
return selection.getValue() < 500 && selection.getOrder() == Order.ASC;
}
}
AcceptorConfig 重命名为 LocalSearchAcceptorConfig
次
这仅会影响配置 API。resolver 配置 XML 文件保持不变。
实现与其他本地搜索配置类的命名一致性。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig()
.withAcceptorConfig(new AcceptorConfig().withEntityTabuSize(5));
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig()
.withAcceptorConfig(new LocalSearchAcceptorConfig().withEntityTabuSize(5));
自定义属性 XML 配置格式更改
次、公共 API
此问题只影响 solver 配置 XML,特别是 < scoreDirectorFactory/>、< moveIteratorFactory/>、< moveListFactory/>、& lt ;partitionedSearch/> 和 & lt;customPhase/>。
这一更改的目的是在构建时强制执行配置 XML 的结构。
OptaPlanner 7 中的 OptaPlanner 7 文件中的一个示例:
<partitionedSearch>
<solutionPartitionerClass>com.example.MySolutionPartitioner</solutionPartitionerClass>
<solutionPartitionerCustomProperties>
<partCount>4</partCount> <!-- a custom property -->
<minimumProcessListSize>300</minimumProcessListSize> <!-- a custom property -->
</solutionPartitionerCustomProperties>
</partitionedSearch>
OptaPlanner 8 中的 OptaPlanner 8 文件中的一个示例:
<partitionedSearch>
<solutionPartitionerClass>com.example.MySolutionPartitioner</solutionPartitionerClass>
<solutionPartitionerCustomProperties>
<property name="partCount" value="4"/> <!-- a custom property -->
<property name="minimumProcessListSize" value="300"/> <!-- a custom property -->
</solutionPartitionerCustomProperties>
</partitionedSearch>
<variableNameInclude/& gt; 元素现在由 < variableNameIncludes/> 元素嵌套
次、公共 API
这个版本只影响 solver 配置 XML,特别是 < swapMoveSelector/> 和 & lt ;pillarSwapMoveSelector/>。
这一更改的目的是在构建时强制执行配置 XML 的结构。
OptaPlanner 7 中的 OptaPlanner 7 文件中的一个示例:
<swapMoveSelector>
<variableNameInclude>variableA</variableNameInclude>
<variableNameInclude>variableB</variableNameInclude>
</swapMoveSelector>
OptaPlanner 8 中的 OptaPlanner 8 文件中的一个示例:
<swapMoveSelector>
<variableNameIncludes>
<variableNameInclude>variableA</variableNameInclude>
<variableNameInclude>variableB</variableNameInclude>
</variableNameIncludes>
</swapMoveSelector>
已删除 解决方案 接口
次、公共 API
解决方案 接口已弃用并删除。仅由 Business Central 使用的 AbstractSolution 接口也已被删除。
删除 Solution 接口,将 getScore () 方法注解为 @PlanningScore,并将 getProblemFacts () 方法替换为每个问题事实(或字段)上的 @ProblemFactCollectionProperty 注解。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
@PlanningSolution
public class CloudBalance implements Solution<HardSoftScore> {
private List<CloudComputer> computerList;
...
private HardSoftScore score;
@ValueRangeProvider(id = "computerRange")
public List<CloudComputer> getComputerList() {...}
public HardSoftScore getScore() {...}
public void setScore(HardSoftScore score) {...}
public Collection<? extends Object> getProblemFacts() {
List<Object> facts = new ArrayList<Object>();
facts.addAll(computerList);
...
return facts;
}
}
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
@PlanningSolution
public class CloudBalance {
private List<CloudComputer> computerList;
...
private HardSoftScore score;
@ValueRangeProvider(id = "computerRange")
@ProblemFactCollectionProperty
public List<CloudComputer> getComputerList() {...}
@PlanningScore
public HardSoftScore getScore() {...}
public void setScore(HardSoftScore score) {...}
}
对于未嵌套在集合中的单个问题事实,请使用 @ProblemFactProperty 注解,如下例所示,同时带有字段注解:
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
@PlanningSolution
public class CloudBalance implements Solution<HardSoftScore> {
private CloudParametrization parametrization;
private List<CloudBuilding> buildingList;
@ValueRangeProvider(id = "computerRange")
private List<CloudComputer> computerList;
...
public Collection<? extends Object> getProblemFacts() {
List<Object> facts = new ArrayList<Object>();
facts.add(parametrization); // not a Collection
facts.addAll(buildingList);
facts.addAll(computerList);
...
return facts;
}
}
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
@PlanningSolution
public class CloudBalance {
@ProblemFactProperty
private CloudParametrization parametrization;
@ProblemFactCollectionProperty
private List<CloudBuilding> buildingList;
@ValueRangeProvider(id = "computerRange")
@ProblemFactCollectionProperty
private List<CloudComputer> computerList;
...
}
不要在带有 @PlanningEntityCollectionProperty 注解的 getters (或字段)上添加 @ProblemFactCollectionProperty 注释。
BestSolutionChangedEvent: isNewBestSolutionInitialized() removed
次、公共 API
best SolutionChangedEvent.isNewBestSolutionInitialized () 方法已弃用,并替换为 best SolutionChangedEvent.getNewBestSolution ().getScore ().isSolutionInitialized () 方法。best SolutionChangedEvent.isNewBestSolutionInitialized () 方法已被删除。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
public void bestSolutionChanged(BestSolutionChangedEvent<CloudBalance> event) {
if (event.isEveryProblemFactChangeProcessed()
&& event.isNewBestSolutionInitialized()) {
...
}
}
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
public void bestSolutionChanged(BestSolutionChangedEvent<CloudBalance> event) {
if (event.isEveryProblemFactChangeProcessed()
&& event.getNewBestSolution().getScore().isSolutionInitialized()) {
...
}
}
如果您检查了 YesFeasible (),它会检查解决方案是否已初始化。
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
public void bestSolutionChanged(BestSolutionChangedEvent<CloudBalance> event) {
if (event.isEveryProblemFactChangeProcessed()
// isFeasible() checks isSolutionInitialized() too
&& event.getNewBestSolution().getScore().isFeasible()) {
...
}
}
<valueSelector > : variableName 现在是一个属性
次、公共 API
当 power-tweaking move 选择器(如 & lt;changeMoveSelector >)带有多个规划变量的用例时,< ;variableName& gt; XML 元素已被一个 variableName="…" XML 属性替代。这个更改减少了解析器配置详细程度。在为整个 7.x 系列弃用后,旧的方法现已被删除。
在 OptaPlanner 7 中,在 OptaPlanner 7 中,一个来自 OptaPlannerConfig.xml 文件的示例:
<valueSelector>
<variableName>room</variableName>
</valueSelector>
在 OptaPlanner 8 中,在 OptaPlanner 8 中,一个来自 OptaPlannerConfig.xml 文件的示例:
<valueSelector variableName="room"/>
分区搜索:删除了 threadFactoryClass
次、公共 API
因为 <solver > 在某些情况下支持 <threadFactoryClass > 元素,所以 < ; gt; 元素已被删除。
partitionedSearch> 下的 <threadFactoryClass &
在 OptaPlanner 7 中,在 OptaPlanner 7 中,一个来自 OptaPlannerConfig.xml 文件的示例:
<solver>
...
<partitionedSearch>
<threadFactoryClass>...MyAppServerThreadFactory</threadFactoryClass>
...
</partitionedSearch>
</solver>
在 OptaPlanner 8 中,在 OptaPlanner 8 中,一个来自 OptaPlannerConfig.xml 文件的示例:
<solver>
<threadFactoryClass>...MyAppServerThreadFactory</threadFactoryClass>
...
<partitionedSearch>
...
</partitionedSearch>
</solver>
SimpleDoubleScore 和 HardSoftDoubleScore 已删除
次、公共 API
不建议使用双分类型,因为它们可能会导致分数损坏。它们已被删除。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
@PlanningSolution
public class MyPlanningSolution {
private SimpleDoubleScore score;
...
}
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
@PlanningSolution
public class MyPlanningSolution {
private SimpleLongScore score;
...
}
Score.toInitializedScore() removed
次、公共 API
Score.toInitializedScore () 方法已弃用,并替换为 7.x 中的 Score.withInitScore (int) 方法,现已被删除。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
score = score.toInitializedScore();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
score = score.withInitScore(0);
删除了各种简化的 Comparators
次、公共 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 中的 OptaPlanner 7 中的一个示例:
NaturalScoreComparator comparator = new NaturalScoreComparator();
ConstraintMatchScoreComparator comparator2 = new ConstraintMatchScoreComparator();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
Comparator<Score> comparator = Comparable::compareTo;
Comparator<ConstraintMatch> comparator2 = Comparator.comparing(ConstraintMatch::getScore);
FeasibilityScore 已删除
次、公共 API
FeasibilityScore 接口在 7.x 中已弃用,它 的唯一方法是Feasible () 移到 Score supertype。现在,该接口已被删除。
您应该通过其 ultimate 类型来引用 Scores,如 HardSoftScore 而不是 Score。
@PlanningEntity.movableEntitySelectionFilter removed
次、公共 API
@PlanningEntity 注释上的 movableEntitySelectionFilter 字段已在 7.x 中弃用,一个新的字段 pinFilter 带有一个名称,它显示 @PlanningPin 注解的关系。此过滤器实现了一个新的 PinningFilter 接口,如果实体固定,则返回 true,如果可移动,则为 false。因此,与旧过滤器相比,这个新过滤器的逻辑会被反转。
您应该通过提供新过滤器而不是旧过滤器来更新 @PlanningEntity 注解。现在,旧的过滤器已被删除。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
@PlanningEntity(movableEntitySelectionFilter = MyMovableEntitySelectionFilter.class)
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
@PlanningEntity(pinningFilter = MyPinningFilter.class)
@PlanningVariable.reinitializeVariableEntityFilter removed
次、公共 API
@Planning 字段已在 7.x 中弃用,现在被删除。
Variable 注释上的重新初始化VariableEntityFilter
slirpScoreHolder 类被转换为接口
次、公共 API
在 OptaPlanner 7 中,ScoreHolder 类专门用于 dros 分数计算,公开多种公共方法(如果使用)允许用户意外损坏或对分数造成负面影响。
在 OptaPlanner 8 中,这些方法已被删除,类已转换为接口。大多数用户都不使用已删除的方法,并可能会造成破坏的方法。
但是,如果您使用这些方法,您将在分数解释和约束配置区域的公共 API 中找到合适的替换。
ValueRangeFactory 类现在最终
次
ValueRangeFactory 类是一个仅具有静态方法的工厂类。不需要扩展此类,因此已 最终 进行。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
class MyValueRangeFactory extends ValueRangeFactory {
...
}
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
class MyValueRangeFactory {
...
}
ConstraintMatchTotal 和 Indictment 现在是接口
次、公共 API
ConstraintMatchTotal 和 Indictment 类已转换为接口。因此,它们的实现从公共 API 中移出,以及它们可以修改其状态的方法。这些方法从不用于公共 API,因此没有替换它们。
如果您选择实现 ConstraintMatchAwareIncrementalScoreCalculator,您可能仍需要实例本身:
ConstraintMatchTotal maximumCapacityMatchTotal = new ConstraintMatchTotal(...);
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
ConstraintMatchTotal maximumCapacityMatchTotal = new DefaultConstraintMatchTotal(...);
ScoreManager :添加的通用类型 Score
主、公共 API
ScoreManager 和 ScoreExplanation API 现在具有通用类型 Score,以避免您的代码中出现问题,例如从 Score 到 HardSoftScore。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
@Inject // or @Autowired
ScoreManager<TimeTable> scoreManager;
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
@Inject // or @Autowired
ScoreManager<TimeTable, HardSoftScore> scoreManager;
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable);
HardSoftScore score = (HardSoftScore) explanation.getScore();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
ScoreExplanation<TimeTable, HardSoftScore> explanation = scoreManager.explainScore(timeTable);
HardSoftScore score = explanation.getScore();
ConstraintMatchTotal、ConstraintMatch 和 Indictment: generic type Score added
主
与 ScoreManager 和 ScoreExplanation 类似, 、ConstraintMatch 和 ConstraintMatch TotalIndictment API 现在有一个通用类型 Score,以避免代码中的多播,例如从 Score 到 HardSoftScore。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable);
Map<String, ConstraintMatchTotal> constraintMatchTotalMap = scoreExplanation.getConstraintMatchTotalMap();
ConstraintMatchTotal constraintMatchTotal = constraintMatchTotalMap.get(contraintId);
HardSoftScore totalScore = (HardSoftScore) constraintMatchTotal.getScore();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
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 中的 OptaPlanner 7 中的一个示例:
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable);
Map<Object, Indictment> indictmentMap = scoreExplanation.getIndictmentMap();
Indictment indictment = indictmentMap.get(lesson);
HardSoftScore totalScore = (HardSoftScore) indictment.getScore();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
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: generic type Score
次
接口 ConstraintMatchAwareIncrementalScoreCalculator 现在也有一个通用类型参数用于 Score,以避免 ConstraintMatchTotal 和 Indictment 的原始类型使用量。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
public class MachineReassignmentIncrementalScoreCalculator
implements ConstraintMatchAwareIncrementalScoreCalculator<MachineReassignment> {
@Override
public Collection<ConstraintMatchTotal> getConstraintMatchTotals() {
...
}
@Override
public Map<Object, Indictment> getIndictmentMap() {
...
}
}
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
public class MachineReassignmentIncrementalScoreCalculator
implements ConstraintMatchAwareIncrementalScoreCalculator<MachineReassignment, HardSoftLongScore> {
@Override
public Collection<ConstraintMatchTotal<HardSoftLongScore>> getConstraintMatchTotals() {
...
}
@Override
public Map<Object, Indictment<HardSoftLongScore>> getIndictmentMap() {
...
}
}
AbstractCustomPhaseCommand 已被删除
次、公共 API
抽象类 AbstractCustomPhaseCommand 已被删除。扩展它的任何类都应直接实现 CustomPhaseCommand 接口。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
public class DinnerPartySolutionInitializer extends AbstractCustomPhaseCommand<DinnerParty> {
@Override
public void changeWorkingSolution(ScoreDirector<DinnerParty> scoreDirector) {
...
}
}
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
public class DinnerPartySolutionInitializer implements CustomPhaseCommand<DinnerParty> {
@Override
public void changeWorkingSolution(ScoreDirector<DinnerParty> scoreDirector) {
...
}
}
移到公共 API 的分数计算器
主
接口 EasyScoreCalculator,IncrementalScoreCalculator, 和 ConstraintMatchAwareIncrementalScoreCalculator 已移到公共 API 中的新软件包。它们弃用的对应部分已被删除。弃用的类 org.optaplanner.core.impl.score.director.incremental.AbstractIncrementalScoreCalculator 也已被删除。将删除的接口和类替换为公共 API 中的对应部分。
OptaPlanner 7 中的 EasyScoreCalculator.java 文件示例:
...
import org.optaplanner.core.impl.score.director.easy.EasyScoreCalculator;
...
public class CloudBalancingEasyScoreCalculator implements EasyScoreCalculator<CloudBalance> {
...
}
OptaPlanner 8 中的 EasyScoreCalculator.java 文件示例:
...
import org.optaplanner.core.api.score.calculator.EasyScoreCalculator;
...
public class CloudBalancingEasyScoreCalculator implements EasyScoreCalculator<CloudBalance, HardSoftScore> {
...
}
OptaPlanner 7 中的 IncrementalScoreCalculator.java 文件示例:
...
import org.optaplanner.core.impl.score.director.incremental.AbstractIncrementalScoreCalculator;
...
public class CloudBalancingIncrementalScoreCalculator extends AbstractIncrementalScoreCalculator<CloudBalance> {
...
}
OptaPlanner 8 中的 IncrementalScoreCalculator.java 文件示例:
...
import org.optaplanner.core.api.score.calculator.IncrementalScoreCalculator;
...
public class CloudBalancingIncrementalScoreCalculator implements IncrementalScoreCalculator<CloudBalance, HardSoftScore> {
...
}
OptaPlanner 7 中的 ConstraintMatchAwareIncrementalScoreCalculator.java 文件示例:
...
import org.optaplanner.core.impl.score.director.incremental.AbstractIncrementalScoreCalculator;
import org.optaplanner.core.impl.score.director.incremental.ConstraintMatchAwareIncrementalScoreCalculator;
...
public class CheapTimeConstraintMatchAwareIncrementalScoreCalculator
extends AbstractIncrementalScoreCalculator<CheapTimeSolution>
implements ConstraintMatchAwareIncrementalScoreCalculator<CheapTimeSolution> {
...
}
OptaPlanner 8 中的 ConstraintMatchAwareIncrementalScoreCalculator.java 文件示例:
...
import org.optaplanner.core.api.score.calculator.ConstraintMatchAwareIncrementalScoreCalculator;
...
public class CheapTimeConstraintMatchAwareIncrementalScoreCalculator
implements ConstraintMatchAwareIncrementalScoreCalculator<CheapTimeSolution, HardMediumSoftLongScore> {
...
}
PlannerBenchmarkFactory:createFromSolverFactory () removed
主、公共 API
PlannerBenchmarkFactory.createFromSolverFactory () 方法已弃用,并替换为 PlannerBenchmarkFactory.createFromSolverConfigXmlResource (String) 方法。PlannerBenchmarkFactory.createFromSolverFactory () 方法已被删除。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
SolverFactory<CloudBalance> solverFactory = SolverFactory.createFromXmlResource(
".../cloudBalancingSolverConfig.xml");
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromSolverFactory(solverFactory);
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromSolverConfigXmlResource(
".../cloudBalancingSolverConfig.xml");
如果您以编程方式调整 solver 配置,您可以使用 PlannerBenchmarkConfig.createFromSolverConfig (SolverConfig),然后是 PlannerBenchmarkFactory.create (PlannerBenchmarkConfig)。
PlannerBenchmarkFactory:getPlannerBenchmarkConfig () removed
次、公共 API
PlannerBenchmarkFactory.getPlannerBenchmarkConfig () 方法已弃用,并替换为 PlannerBenchmarkFactory.create (PlannerBenchmarkConfig) 方法。现在,在 PlannerBenchmarkFactory 实例实例化前,PlannerBenchmarkConfig 实例会被实例化。这个顺序更为逻辑。PlannerBenchmarkFactory.getPlannerBenchmarkConfig () 已被删除。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
PlannerBenchmarkConfig benchmarkConfig = benchmarkFactory.getPlannerBenchmarkConfig();
...
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.create(benchmarkConfig);
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
XML <plannerBenchmark/> root 元素现在属于 https://www.optaplanner.org/xsd/benchmark 命名空间
次、公共 API
OptaPlanner 现在为基准配置提供了一个 XML 架构定义(XSD)。虽然 OptaPlanner 保持与现有 XML 配置的早期版本兼容,但强烈建议迁移到 XSD,因为 OptaPlanner 可能在以后只支持有效的配置 XML。
OptaPlanner 7 中的 OptaPlanner Config.xml 文件中的示例:
<?xml version="1.0" encoding="UTF-8"?>
<plannerBenchmark>
...
</plannerBenchmark>
OptaPlanner 8 中的 OptaPlanner Config.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>
使用 XSD 可能需要重新排序配置的一些 XML 元素。使用 IDE 中的代码完成迁移到有效的 XML。
ProblemBenchmarksConfig:xStreamAnnotatedClass removed
主、公共 API
{mAnnotatedClas} 已从 < problemBenchmarks/> 配置中删除,以及 ProblemBenchmarksConfig 类中的对应 getXStreamAnnotatedClassList () 和 setXStreamAnnotatedClassList () 方法。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
ProblemBenchmarksConfig problemBenchmarksConfig = new ProblemBenchmarksConfig();
problemBenchmarksConfig.setXStreamAnnotatedClassList(MySolution.class);
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
package com.example;
...
public class MySolutionFileIO extends XStreamSolutionFileIO<MySolution> {
public MySolutionFileIO() {
super(MySolution.class);
}
}
...
ProblemBenchmarksConfig problemBenchmarksConfig = new ProblemBenchmarksConfig();
problemBenchmarksConfig.setSolutionFileIOClass(MySolutionFileIO.class);
OptaPlanner 7 中的 OptaPlanner Config.xml 文件中的示例:
<plannerBenchmark>
...
<solverBenchmark>
<problemBenchmarks>
<xStreamAnnotatedClass>com.example.MySolution</xStreamAnnotatedClass>
...
</problemBenchmarks>
...
</solverBenchmark>
...
</plannerBenchmark>
OptaPlanner 8 中的 OptaPlanner Config.xml 文件中的示例:
<plannerBenchmark>
...
<solverBenchmark>
<problemBenchmarks>
<!-- See the "After in *.java" section to create the MySolutionFileIO. -->
<solutionFileIOClass>com.example.MySolutionFileIO</solutionFileIOClass>
...
</problemBenchmarks>
...
</solverBenchmark>
...
</plannerBenchmark>
BenchmarkAggregatorFrame:createAndDisplay (PlannerBenchmarkFactory) 已删除
次
BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkFactory) 方法已弃用,并使用 BenchmarkAggregatorFrame.createAndDisplayFromXmlResource (String) 方法替代。BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkFactory) 方法已被删除。
OptaPlanner 7 中的 OptaPlanner 7 中的一个示例:
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
BenchmarkAggregatorFrame.createAndDisplay(benchmarkFactory);
来自 OptaPlanner 8 中的 OptaPlanner 8 文件示例:
BenchmarkAggregatorFrame.createAndDisplayFromXmlResource(
".../cloudBalancingBenchmarkConfig.xml");
如果您以编程方式调整基准配置,您可以使用 BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkConfig)。
删除配置中的 JavaScript 表达式支持
次
solver 配置和基准配置的各种元素不再支持嵌套 JavaScript 表达式。您必须将它们替换为自动配置或使用整数常量替换。
来自 OptaPlanner 7 中的 resolverConfig.xml 文件示例:
<solver>
...
<moveThreadCount>availableProcessorCount - 1</moveThreadCount>
...
</solver>
来自 OptaPlanner 8 中的'solverConfig.xml' 文件的示例:
<solver>
...
<moveThreadCount>1</moveThreadCount> <!-- Alternatively, use "AUTO" or omit entirely. -->
...
</solver>
OptaPlanner 7 中的 benchmarkConfig.xml 文件示例:
<plannerBenchmark>
...
<parallelBenchmarkCount>availableProcessorCount - 1</parallelBenchmarkCount>
...
</plannerBenchmark>
OptaPlanner 8 中的 benchmarkConfig.xml 文件示例:
<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 文件示例:
...
import org.optaplanner.core.impl.domain.variable.listener.VariableListenerAdapter;
...
public class MyVariableListener extends VariableListenerAdapter<Object> {
...
@Override
void afterEntityRemoved(ScoreDirector scoreDirector, Object entity);
...
}
...
}
OptaPlanner 8 中的 VariableListener.java 文件示例:
...
import org.optaplanner.core.api.domain.variable.VariableListener;
...
public class MyVariableListener extends VariableListener<MySolution, Object> {
...
@Override
void afterEntityRemoved(ScoreDirector<MySolution> scoreDirector, Object entity);
...
}
...
}
OptaPlanner 7 中的 StatefulVariableListener.java 文件示例:
...
import org.optaplanner.core.impl.domain.variable.listener.StatefulVariableListener;
...
public class MyStatefulVariableListener implements StatefulVariableListener<Object> {
...
@Override
public void clearWorkingSolution(ScoreDirector scoreDirector) {
...
}
...
}
OptaPlanner 8 中的 StatefulVariableListener.java 文件示例:
...
import org.optaplanner.core.api.domain.variable.VariableListener;
...
public class MyStatefulVariableListener implements VariableListener<MySolution, Object> {
...
@Override
public void close() {
...
}
...
}