第 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-devel
Copy 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
文件示例: