第 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
- 在 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(); }
OptaPlanner 8 中的 *.java
文件示例:
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();
OptaPlanner 8 中的 *.java
文件示例:
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();
OptaPlanner 8 中的 *.java
文件示例:
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();
OptaPlanner 8 中的 *.java
文件示例:
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
文件示例:
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 中的 *.java
文件示例:
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()
删除
小、公共 API
SolverFactory.createEmpty()
方法已弃用,并被 新的 SolverConfig()
方法替代。SolverFactory.createEmpty()
方法已被删除。
OptaPlanner 7 中的 *.java
文件示例:
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();
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>
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>
使用 XSD 可能需要重新排序配置的一些 XML 元素。在 IDE 中使用代码完成迁移到有效的 XML。
移动选择器配置中的属性 subPillarEnabled
已被删除
小、公共 API
PillarSwapMoveSelector
和 PillarChangeMoveSelector
中的 subPillarEnabled
属性已弃用,并被一个新的属性 subPillarType
替代。subPillarEnabled
属性已被删除。
OptaPlanner 7 中的 *SolverConfig.xml
和 *BenchmarkConfig.xml
文件中的示例:
<pillar...MoveSelector> ... <pillarSelector> <subPillarEnabled>false</subPillarEnabled> ... </pillarSelector> ... </pillar...MoveSelector>
OptaPlanner 8 中的 *SolverConfig.xml
和 *BenchmarkConfig.xml
文件中的示例:
<pillar...MoveSelector> <subPillarType>NONE</subPillarType> <pillarSelector> ... </pillarSelector> ... </pillar...MoveSelector>
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(); ...
OptaPlanner 8 中的 *.java
文件示例:
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();
OptaPlanner 8 中的 *.java
文件示例:
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();
OptaPlanner 8 中的 *.java
文件示例:
solver = ...; solver.addEventListener(event -> { solution = event.getNewBestSolution(); score = event.getNewBestScore(); timeMillisSpent = event.getTimeMillisSpent(); });
已删除注解扫描
主要,Public API
solver 配置中的 <scanAnnotatedClasses
/> 指令已在 7.x 中弃用,现已被删除。
OptaPlanner 7 中的 *.xml
文件示例:
<solver> ... <scanAnnotatedClasses/> ... </solver>
OptaPlanner 8 中的 *.xml
文件示例:
<solver> ... <solutionClass>...</solutionClass> <entityClass>...</entityClass> ... </solver>
用于 @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;
OptaPlanner 8 中的 *.java
文件示例:
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));
OptaPlanner 8 中的 *.java
文件示例:
ValueSelectorConfig valueSelectorConfig = new ValueSelectorConfig(); valueSelectorConfig.setFilterClass(MySelectionFilterClass.class);
使用单个选择过滤器类替换多个选择过滤器类
OptaPlanner 7 中的 *.xml
文件示例:
<swapMoveSelector> <entitySelector> <filterClass>com.example.FilterA</filterClass> <filterClass>com.example.FilterB</filterClass> </entitySelector> </swapMoveSelector>
OptaPlanner 7 中的 *.java
文件示例:
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 中的 *.xml
文件示例:
<swapMoveSelector> <entitySelector> <filterClass>com.example.SingleEntityFilter</filterClass> </entitySelector> </swapMoveSelector>
OptaPlanner 8 中的 *.java
文件示例:
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。解决器配置 XML 文件保持不变。
实施了与其他本地搜索特定配置类的命名一致性。
OptaPlanner 7 中的 *.java
文件示例:
LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig() .withAcceptorConfig(new AcceptorConfig().withEntityTabuSize(5));
OptaPlanner 8 中的 *.java
文件示例:
LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig() .withAcceptorConfig(new LocalSearchAcceptorConfig().withEntityTabuSize(5));
自定义属性 XML 配置格式更改
小、公共 API
此问题只影响解决器配置 XML,特别是 < scoreDirectorFactory/>, <
moveIteratoronnectionFactoryy/>, <
moveListFactory/> , &
lt; partitionedSearch/> 和 &
lt ;customPhase/>
。
这个更改的目的是在构建时强制配置 XML 的结构。
OptaPlanner 7 中的 *.xml
文件示例:
<partitionedSearch> <solutionPartitionerClass>com.example.MySolutionPartitioner</solutionPartitionerClass> <solutionPartitionerCustomProperties> <partCount>4</partCount> <!-- a custom property --> <minimumProcessListSize>300</minimumProcessListSize> <!-- a custom property --> </solutionPartitionerCustomProperties> </partitionedSearch>
OptaPlanner 8 中的 *.xml
文件示例:
<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
这个版本只影响解决器配置 XML,特别是 < swapMoveSelector/> 和 &
lt ;pillarSwapMoveSelector/>
元素。
这个更改的目的是在构建时强制配置 XML 的结构。
OptaPlanner 7 中的 *.xml
文件示例:
<swapMoveSelector> <variableNameInclude>variableA</variableNameInclude> <variableNameInclude>variableB</variableNameInclude> </swapMoveSelector>
OptaPlanner 8 中的 *.xml
文件示例:
<swapMoveSelector> <variableNameIncludes> <variableNameInclude>variableA</variableNameInclude> <variableNameInclude>variableB</variableNameInclude> </variableNameIncludes> </swapMoveSelector>
删除 解决方案
接口
小、公共 API
Solution
接口已弃用并删除。同时还删除了 AbstractSolution
接口(仅适用于 Business Central)。
删除 Solution
接口,将 getScore()
方法标上 @PlanningScore
,并将 getProblemFacts()
方法替换为 @ProblemFactCollectionProperty
注释(或字段)。
OptaPlanner 7 中的 *.java
文件示例:
@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 中的 *.java
文件示例:
@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) {...} }
对于没有嵌套在 Collection
中的单个问题事实,请使用 @ProblemFactProperty
注释,如下例所示,其中字段注解如下:
OptaPlanner 7 中的 *.java
文件示例:
@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 中的 *.java
文件示例:
@PlanningSolution public class CloudBalance { @ProblemFactProperty private CloudParametrization parametrization; @ProblemFactCollectionProperty private List<CloudBuilding> buildingList; @ValueRangeProvider(id = "computerRange") @ProblemFactCollectionProperty private List<CloudComputer> computerList; ... }
不要在 getters(或字段)上添加 @ProblemFactCollectionProperty
注释,该注释具有 @PlanningEntityCollectionProperty
注释。
BestSolutionChangedEvent
:isNewBestSolutionInitialized()
已删除
小、公共 API
best SolutionChangedEvent.isNewBestSolutionInitialized()
方法已弃用,并替换为 BestSolutionChangedEvent.getNewBestSolution().getScore().isSolutionInitialized()
方法。best SolutionChangedEvent.isNewBestSolutionInitialized()
方法已被删除。
OptaPlanner 7 中的 *.java
文件示例:
public void bestSolutionChanged(BestSolutionChangedEvent<CloudBalance> event) { if (event.isEveryProblemFactChangeProcessed() && event.isNewBestSolutionInitialized()) { ... } }
OptaPlanner 8 中的 *.java
文件示例:
public void bestSolutionChanged(BestSolutionChangedEvent<CloudBalance> event) { if (event.isEveryProblemFactChangeProcessed() && event.getNewBestSolution().getScore().isSolutionInitialized()) { ... } }
如果您检查 是否可行()
,它会检查是否初始化解决方案。
OptaPlanner 8 中的 *.java
文件示例:
public void bestSolutionChanged(BestSolutionChangedEvent<CloudBalance> event) { if (event.isEveryProblemFactChangeProcessed() // isFeasible() checks isSolutionInitialized() too && event.getNewBestSolution().getScore().isFeasible()) { ... } }
<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>
OptaPlanner 8 中的 *SolverConfig.xml
和 *BenchmarkConfig.xml
文件中的示例:
<valueSelector variableName="room"/>
分区搜索: 已删除 threadFactoryClass
小、公共 API
因为 <solver&
gt; 已在某些情况下支持 <threadFactoryClass
> 元素,所以 & lt;
gt; 元素已被删除。
partitionedSearch> 下的 <threadFactoryClass
&
OptaPlanner 7 中的 *SolverConfig.xml
和 *BenchmarkConfig.xml
文件中的示例:
<solver> ... <partitionedSearch> <threadFactoryClass>...MyAppServerThreadFactory</threadFactoryClass> ... </partitionedSearch> </solver>
OptaPlanner 8 中的 *SolverConfig.xml
和 *BenchmarkConfig.xml
文件中的示例:
<solver> <threadFactoryClass>...MyAppServerThreadFactory</threadFactoryClass> ... <partitionedSearch> ... </partitionedSearch> </solver>
SimpleDoubleScore
和 HardSoftDoubleScore
已删除
小、公共 API
不建议使用基于双倍的分数类型,因为它们可能会造成损坏。它们已被删除。
OptaPlanner 7 中的 *.java
文件示例:
@PlanningSolution public class MyPlanningSolution { private SimpleDoubleScore score; ... }
OptaPlanner 8 中的 *.java
文件示例:
@PlanningSolution public class MyPlanningSolution { private SimpleLongScore score; ... }
Score.toInitializedScore()
removed
小、公共 API
Score.toInitializedScore()
方法已弃用,并替换为 7.x 中的 Score.withInitScore(int)
方法,现已被删除。
OptaPlanner 7 中的 *.java
文件示例:
score = score.toInitializedScore();
OptaPlanner 8 中的 *.java
文件示例:
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();
OptaPlanner 8 中的 *.java
文件示例:
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)
OptaPlanner 8 中的 *.java
文件示例:
@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 { ... }
OptaPlanner 8 中的 *.java
文件示例:
class MyValueRangeFactory { ... }
现在,ConstraintMatchTotal
和 Indictment
是接口
小、公共 API
ConstraintMatchTotal
和 Indictment
类已转换为接口。因此,他们的实施过程从公共 API 中移出,并附带允许它们修改其状态的方法。这些方法绝不能用于公共 API,因此没有替换它们。
如果您选择实施 ConstraintMatchAwareIncrementalScoreCalculator
,您可能仍需要实例本身:
ConstraintMatchTotal maximumCapacityMatchTotal = new ConstraintMatchTotal(...);
OptaPlanner 8 中的 *.java
文件示例:
ConstraintMatchTotal maximumCapacityMatchTotal = new DefaultConstraintMatchTotal(...);
分数管理器
:添加了通用类型 Score
主要,Public API
ScoreManager
和 ScoreExplanation
API 现在具有通用类型 Score
,以避免在您的代码中进行停机,例如:从 Score
到 HardSoftScore
。
OptaPlanner 7 中的 *.java
文件示例:
@Inject // or @Autowired ScoreManager<TimeTable> scoreManager;
OptaPlanner 8 中的 *.java
文件示例:
@Inject // or @Autowired ScoreManager<TimeTable, HardSoftScore> scoreManager;
OptaPlanner 7 中的 *.java
文件示例:
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();
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();
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();
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();
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();
ConstraintMatchAwareIncrementalScoreCalculator
: generic type Score
added
次
接口 ConstraintMatchAwareIncrementalScoreCalculator
还有一个通用类型参数,用于 Score
以避免 ConstraintMatchTotal
和 Indictment
的原始类型使用。
OptaPlanner 7 中的 *.java
文件示例:
public class MachineReassignmentIncrementalScoreCalculator implements ConstraintMatchAwareIncrementalScoreCalculator<MachineReassignment> { @Override public Collection<ConstraintMatchTotal> getConstraintMatchTotals() { ... } @Override public Map<Object, Indictment> getIndictmentMap() { ... } }
OptaPlanner 8 中的 *.java
文件示例:
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 中的 *.java
文件示例:
public class DinnerPartySolutionInitializer extends AbstractCustomPhaseCommand<DinnerParty> { @Override public void changeWorkingSolution(ScoreDirector<DinnerParty> scoreDirector) { ... } }
OptaPlanner 8 中的 *.java
文件示例:
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()
已删除
主要,Public API
PlannerBenchmarkFactory.createFromSolverFactory()
方法已弃用,并被 PlannerBenchmarkFactory.createFromSolverConfigXmlResource(String)
方法替代。PlannerBenchmarkFactory.createFromSolverFactory()
方法已被删除。
OptaPlanner 7 中的 *.java
文件示例:
SolverFactory<CloudBalance> solverFactory = SolverFactory.createFromXmlResource( ".../cloudBalancingSolverConfig.xml"); PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromSolverFactory(solverFactory);
OptaPlanner 8 中的 *.java
文件示例:
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();
OptaPlanner 8 中的 *.java
文件示例:
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>
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>
使用 XSD 可能需要重新排序配置的一些 XML 元素。在 IDE 中使用代码完成迁移到有效的 XML。
ProblemBenchmarksConfig
:xStreamAnnotatedClass
删除
主要,Public API
{mAnnotatedClas}
已从 < problemBenchmarks/>
; 配置以及对应的 getXStreamAnnotatedClassList()
和 setXStreamAnnotatedClassList()
方法中删除。
OptaPlanner 7 中的 *.java
文件示例:
ProblemBenchmarksConfig problemBenchmarksConfig = new ProblemBenchmarksConfig(); problemBenchmarksConfig.setXStreamAnnotatedClassList(MySolution.class);
OptaPlanner 8 中的 *.java
文件示例:
package com.example; ... public class MySolutionFileIO extends XStreamSolutionFileIO<MySolution> { public MySolutionFileIO() { super(MySolution.class); } } ... ProblemBenchmarksConfig problemBenchmarksConfig = new ProblemBenchmarksConfig(); problemBenchmarksConfig.setSolutionFileIOClass(MySolutionFileIO.class);
OptaPlanner 7 中的 *BenchmarkConfig.xml
文件中的示例:
<plannerBenchmark> ... <solverBenchmark> <problemBenchmarks> <xStreamAnnotatedClass>com.example.MySolution</xStreamAnnotatedClass> ... </problemBenchmarks> ... </solverBenchmark> ... </plannerBenchmark>
OptaPlanner 8 中的 *BenchmarkConfig.xml
文件中的示例:
<plannerBenchmark> ... <solverBenchmark> <problemBenchmarks> <!-- See the "After in *.java" section to create the MySolutionFileIO. --> <solutionFileIOClass>com.example.MySolutionFileIO</solutionFileIOClass> ... </problemBenchmarks> ... </solverBenchmark> ... </plannerBenchmark>
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);
OptaPlanner 8 中的 *.java
文件示例:
BenchmarkAggregatorFrame.createAndDisplayFromXmlResource( ".../cloudBalancingBenchmarkConfig.xml");
如果您以编程方式调整基准配置,可以使用 BenchmarkAggregatorFrame.createAndDisplay(PlannerBenchmarkConfig)
。
删除了配置中的 JavaScript 表达式支持
次
解决程序配置和基准配置的不同元素不再支持嵌套的 JavaScript 表达式。您必须使用自动配置或整数常量替换它们。
OptaPlanner 7 中的 solverConfig.xml
文件中的示例:
<solver> ... <moveThreadCount>availableProcessorCount - 1</moveThreadCount> ... </solver>
OptaPlanner 8 中的 'solverConfig.xml'file 示例:
<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>
删除已弃用的变量监听程序
主要,Public API
来自软件包 org.optaplanner.core.impl.domain.variable.listener
已弃用的接口 VariableListener
已被删除,以及已弃用的 interface 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() { ... } ... }