第 1 章 与 OptaPlanner 7.x 或更早版本不兼容的更改
本节中列出的更改与 OptaPlanner 7.x 或早期版本的 OptaPlanner 不兼容。
需要 Java 11 或更高版本
主要,Public 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 容器
主要,Public API
因为 OptaPlanner 现在与 Kogito 一致,所以 KIE 容器概念不再适用。因此,SolverFactory 不再允许从 KIE 容器创建 Solver 实例。这也适用于 PlannerBenchmarkFactory 和 基准。
已删除 OSGi 元数据
主要,Public API
由于 OSGi 有限的使用及其带来的维护负担,OptaPlanner 8.x 系列中的 OptaPlanner JAR 文件不再包括在 META-INF/MANIFEST.MF 文件中。
使用 Java 序列化
小、公共 API
在 OptaPlanner 8 中,大多数使用 Serializable 标记接口已从公共 API 中删除。考虑使用 JSON 或其他格式序列化。
SolverFactory.getScoreDirectorFactory() 替换为 ScoreManager
主要,Public 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();
如果您还通过了类 Loader,请将其传递到 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() 已删除
小、公共 API
SolverFactory.cloneSolverFactory() 方法已弃用,并被新的 SolverConfig(SolverConfig) copyors 和 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 命名空间
主要,Public API
OptaPlanner 现在为解决器配置提供了一个 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。
移动选择器配置中的属性 subPillarEnabled 已被删除
小、公共 API
PillarSwapMoveSelector 和 PillarChangeMoveSelector 中的 subPillarEnabled 属性已弃用,并被一个新的属性 subPillarType 替代。subPillarEnabled 属性已被删除。
OptaPlanner 7 中的 *SolverConfig.xml 和 *BenchmarkConfig.xml 文件中的示例:
OptaPlanner 8 中的 *SolverConfig.xml 和 *BenchmarkConfig.xml 文件中的示例:
solver:getScoreDirectorFactory() 已删除
主要,Public 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() 已被删除
主要,Public 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 文件示例:
已删除注解扫描
主要,Public API
solver 配置中的 <scanAnnotatedClasses /> 指令已在 7.x 中弃用,现已被删除。
OptaPlanner 7 中的 *.xml 文件示例:
<solver>
...
<scanAnnotatedClasses/>
...
</solver>
<solver>
...
<scanAnnotatedClasses/>
...
</solver>
OptaPlanner 8 中的 *.xml 文件示例:
用于 @PlanningFactProperty 和 @PlanningFactCollection的新软件包
主要,Public 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 和 addressr 配置 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/>, < moveIteratoronnectionFactoryy/>, < moveListFactory/> , & lt; partitionedSearch/> 和 & lt ;customPhase/>。
这个更改的目的是在构建时强制配置 XML 的结构。
OptaPlanner 7 中的 *.xml 文件示例:
OptaPlanner 8 中的 *.xml 文件示例:
<variableNameInclude/& gt; 元素现在被 < variableNameIncludes/> 元素嵌套
小、公共 API
这个版本只影响解决器配置 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() 方法替换为 @ProblemFactCollectionProperty 注释(或字段)。
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
对于没有嵌套在 Collection 中的单个问题事实,请使用 @ProblemFactProperty 注释,如下例所示,其中字段注解如下:
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
不要在 getters(或字段)上添加 @ProblemFactCollectionProperty 注释,该注释具有 @PlanningEntityCollectionProperty 注释。
BestSolutionChangedEvent:isNewBestSolutionInitialized() 已删除
小、公共 API
best SolutionChangedEvent.isNewBestSolutionInitialized() 方法已弃用,并替换为 BestSolutionChangedEvent.getNewBestSolution().getScore().isSolutionInitialized() 方法。best SolutionChangedEvent.isNewBestSolutionInitialized() 方法已被删除。
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
如果您检查 是否可行(),它会检查是否初始化解决方案。
OptaPlanner 8 中的 *.java 文件示例:
<valueSelector > : variableName 现在是一个属性
小、公共 API
当 power-tweaking 选择器(如 < ;changeMoveSelector& gt;)时,带有多个规划变量的用例中,< ;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 已删除
小、公共 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
在 7.x 中弃用了以下 Comparator 实现:
-
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
在 7.x 中弃用了 FeasibilityScore 接口,它 的唯一方法是Feasible() 移到 Score 超级类型。接口现已被删除。
您应该按最终类型引用 分数,例如 HardSoftScore 而不是 分数。
@PlanningEntity.movableEntitySelectionFilter removed
小、公共 API
@PlanningEntity 注解上的 movableEntitySelectionFilter 字段已在 7.x 中弃用,一个新的字段 pinningFilter 已被引入,显示与 @PlanningPin 注解相关的名称。此过滤器实施新的 PinningFilter 接口,如果实体被固定,则返回 true;如果有禁止。因此,与旧过滤器相比,这个新过滤器的逻辑已被验证。
您应该通过提供新过滤器而不是旧的过滤器来更新 @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
@Planning 字段已在 7.x 中被弃用,现已被删除。
Variable 注解上的 reinitializeVariableFilter
* 被设置为接口(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(...);
分数管理器 :添加了通用类型 Score
主要,Public API
ScoreManager 和 ScoreExplanation API 现在具有通用类型 Score,以避免在您的代码中进行停机,例如:从 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: 通用类型 Score 添加
主要
与 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: generic type Score added
次
接口 ConstraintMatchAwareIncrementalScoreCalculator 还有一个通用类型参数,用于 Score 以避免 ConstraintMatchTotal 和 Indictment 的原始类型使用。
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
AbstractCustomPhaseCommand 被删除
小、公共 API
抽象类 AbstractCustomPhaseCommand 被删除。任何扩展该类都应直接实施 CustomPhaseCommand 接口。
OptaPlanner 7 中的 *.java 文件示例:
OptaPlanner 8 中的 *.java 文件示例:
分数计算器移到公共 API
主要
接口 EasyScoreCalculator,IncrementalScoreCalculator 和 ConstraintMatchAwareIncrementalScoreCalculator 已移至公共 API 中的新软件包。它们已弃用的对应项已被删除。弃用的类 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() 已删除
主要,Public 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");
如果您以编程方式调整了解决器配置,您可以使用 PlannerBenchmarkConfig.createFromSolverConfig(SolverConfig),然后运行 PlannerBenchmarkFactory.create(PlannerBenchmarkConfig)。
PlannerBenchmarkFactory:getPlannerBenchmarkConfig() 已删除
小、公共 API
PlannerBenchmarkFactory.getPlannerBenchmarkConfig() 方法已弃用,并被 PlannerBenchmarkFactory.create(PlannerBenchmarkConfig) 方法替代。现在,PlannerBenchmarkConfig 实例在 PlannerBenchmark factory 实例被实例化前。这个顺序更为逻辑。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 删除
主要,Public 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(PlannerBenchmark factory) removed
次
BenchmarkAggregatorFrame.createAndDisplay(PlannerBenchmarkFactory) 方法已弃用,并替换为 BenchmarkAggregatorFrame.createAndDisplayFromXmlResource(String) 方法。BenchmarkAggregatorFrame.createAndDisplay(PlannerBenchmark factory) 方法已被删除。
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 表达式支持
次
解决程序配置和基准配置的不同元素不再支持嵌套的 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>
删除已弃用的变量监听程序
主要,Public API
来自软件包 org.optaplanner.core.impl.domain.variable.listener 已弃用的接口 VariableListener 已被删除,以及已弃用的 interface 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 文件示例: