第 1 章 与 OptaPlanner 7.x 或更早版本不兼容的更改


本节中列出的更改与 OptaPlanner 7.x 或更早版本的 OptaPlanner 7.x 不兼容。

需要 Java 11 或更高版本

公共 API

如果您使用 JRE 或 JDK 8,请升级到 JDK 11 或更高版本。

  • 在 Linux 上,从 Linux 软件存储库获取 OpenJDK。在 Fedora 和 Red Hat Enterprise Linux 中输入以下命令:

    sudo dnf install java-11-openjdk-devel
    Copy to Clipboard Toggle word wrap
  • 在 Windows 和 macOS 上,从 AdoptOpenJDK 网站下载 OpenJDK。

SolverFactoryPlannerBenchmarkFactory 不再支持 KIE 容器

公共 API

因为 OptaPlanner 现在与 Kogito 保持一致,所以 KIE 容器概念不再适用。因此,SolverFactory 不再允许您从 KIE 容器创建 Solver 实例。这也适用于 PlannerBenchmarkFactory 和基准。

已删除 OSGi 元数据

公共 API

由于 OSGi 的有限使用情况及其维护负担,OptaPlanner 8.x 系列中的 OptaPlanner JAR 文件不再将 OSGi 元数据包含在 META-INF/MANIFEST.MF 文件中。

禁止使用 Java 序列化

,公共 API

在 OptaPlanner 8 中,大多数使用 Serializable 标记接口已从公共 API 中删除。考虑使用 JSON 或另一个格式进行序列化。

SolverFactory.getScoreDirectorFactory () 替换为 ScoreManager

公共 API

在 OptaPlanner 版本 7 中,需要使用 ScoreDirectorFactory 来解释分数。在 OptaPlanner 版本 8 中,新功能被添加到 ScoreManager 中,因此不再有理由创建 ScoreDirector 的新实例。

OptaPlanner 7 中的 *.java 文件示例:

ScoreDirectorFactory<CloudBalance> scoreDirectorFactory = solverFactory.getScoreDirectorFactory();
try (ScoreDirector<CloudBalance> scoreDirector = scoreDirectorFactory.buildScoreDirector()) {
    scoreDirector.setWorkingSolution(solution);
    Score score = scoreDirector.calculateScore();
}
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

ScoreManager<CloudBalance> scoreManager = ScoreManager.create(solverFactory);
Score score = scoreManager.updateScore(solution);
Copy to Clipboard Toggle word wrap

允许您检索 ScoreDirectorScoreDirectorFactory 实例的方法已从公共 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();
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
Copy to Clipboard Toggle word wrap

如果您还传递 ClassLoader,请将其传递给 SolverConfig.createFromXmlResource ()SolverFactory.create ()

SolverConfig:buildSolver () 删除

,公共 API

SolverConfig.buildSolver () 方法是一个不属于公共 API 中的内部方法。使用 SolverFactory.buildSolver () 方法替代。

OptaPlanner 7 中的 *.java 文件示例:

SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
Solver<MySolution> solver = solverConfig.buildSolver();
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

SolverConfig solverConfig = SolverConfig.createFromXmlResource(".../mySolverConfig.xml");
...
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
Copy to Clipboard Toggle word wrap

PlannerBenchmarkConfig:buildPlannerBenchmark () 已删除

,公共 API

PlannerBenchmarkConfig.buildPlannerBenchmark () 方法是一个不属于公共 API 中的方法。使用 PlannerBenchmarkFactory.buildPlannerBenchmark () 方法替代。

OptaPlanner 7 中的 *.java 文件示例:

PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
        ".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
        ".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.create(benchmarkConfig);
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
Copy to Clipboard Toggle word wrap

SolverFactory:cloneSolverFactory () removed

,公共 API

SolverFactory.cloneSolverFactory () 方法已弃用,并替换为新的 SolverConfig (SolverConfig) 复制构造器,并且 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();
    ...
}
Copy to Clipboard Toggle word wrap

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();
    ...
}
Copy to Clipboard Toggle word wrap

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();
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

SolverConfig solverConfig = new SolverConfig();
...
SolverFactory<MySolution> solverFactory = SolverFactory.create(solverConfig);
Solver<MySolution> solver = solverFactory.buildSolver();
Copy to Clipboard Toggle word wrap

XML <solver/> root 元素现在属于 http://www.optaplanner.org/xsd/solver 命名空间

公共 API

OptaPlanner 现在为 solver 配置提供了一个 XML 模式定义。虽然 OptaPlanner 保留与现有 XML 配置的早期版本的兼容性,强烈建议迁移到 XSD,因为 OptaPlanner 可能以后只支持有效的配置 XML。

OptaPlanner 7 中的 *SolverConfig.xml 文件中的示例:

<?xml version="1.0" encoding="UTF-8"?>
<solver>
  ...
</solver>
Copy to Clipboard Toggle word wrap

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>
Copy to Clipboard Toggle word wrap

使用 XSD 可能需要对配置的一些 XML 元素重新排序。在 IDE 中使用代码完成来迁移到有效的 XML。

move selector 配置中的 property subPillarEnabled 已被删除

,公共 API

PillarSwapMoveSelector 和 PillarChangeMoveSelector 和 PillarChangeMoveSelector 中的 subPillarEnabled 属性已弃用,并替换为一个新的属性 subPillarTypesubPillarEnabled 属性已被删除。

OptaPlanner 7 中的 *SolverConfig.xml*BenchmarkConfig.xml 文件中的示例:

      <pillar...MoveSelector>
        ...
        <pillarSelector>
          <subPillarEnabled>false</subPillarEnabled>
          ...
        </pillarSelector>
        ...
      </pillar...MoveSelector>
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *SolverConfig.xml*BenchmarkConfig.xml 文件中的示例:

      <pillar...MoveSelector>
        <subPillarType>NONE</subPillarType>
        <pillarSelector>
          ...
        </pillarSelector>
        ...
      </pillar...MoveSelector>
Copy to Clipboard Toggle word wrap

solver : getScoreDirectorFactory () removed

公共 API

getScoreDirectorFactory () 方法已弃用,现在已从 Solver 和 Solver Factory 类中删除。

您不再需要仅创建 Solver 实例来计算或解释 UI 中的分数。改为使用 ScoreManager API。

OptaPlanner 7 中的 *.java 文件示例:

SolverFactory<VehicleRoutingSolution> solverFactory = SolverFactory.createFromXmlResource(...);
Solver<VehicleRoutingSolution> solver = solverFactory.buildSolver();
uiScoreDirectorFactory = solver.getScoreDirectorFactory();
...
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

SolverFactory<VehicleRoutingSolution> solverFactory = SolverFactory.createFromXmlResource(...);
ScoreManager<VehicleRoutingSolution> scoreManager = ScoreManager.create(solverFactory);
...
Copy to Clipboard Toggle word wrap

不应再使用 ScoreDirectorFactory,因为它一直位于公共 API 之外,其所有功能都在公共 API 的各个部分中公开。

solver.explainBestScore () 已被删除

公共 API

Solver 接口上的 explainBestScore () 方法已在 7.x 中弃用,现已被删除。您可以通过新的 ScoreManager API 获取相同的信息。

红帽建议您不要以任何方式解析此方法调用的结果。

OptaPlanner 7 中的 *.java 文件示例:

solver = ...;
scoreExplanation = solver.explainBestScore();
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

MySolution solution = ...;
ScoreManager<MySolution> scoreManager = ...;
scoreExplanation = scoreManager.explainScore(solution);
Copy to Clipboard Toggle word wrap

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();
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

solver = ...;
solver.addEventListener(event -> {
    solution = event.getNewBestSolution();
    score = event.getNewBestScore();
    timeMillisSpent = event.getTimeMillisSpent();
});
Copy to Clipboard Toggle word wrap

注解扫描已被删除

公共 API

solver 配置中的 & lt;scanAnnotatedClasses /> 指令在 7.x 中弃用,现已被删除。

OptaPlanner 7 中的 *.xml 文件示例:

<solver>
    ...
    <scanAnnotatedClasses/>
    ...
</solver>
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.xml 文件示例:

<solver>
    ...
    <solutionClass>...</solutionClass>
    <entityClass>...</entityClass>
    ...
</solver>
Copy to Clipboard Toggle word wrap

@PlanningFactProperty@PlanningFactCollectionProperty的新软件包

公共 API

@PlanningFactProperty@PlanningFactCollectionProperty 注释现在与其他类似注释(如 @PlanningSolution )共享相同的软件包。旧注解在 7.x 中弃用并被删除。

OptaPlanner 7 中的 *.java 文件示例:

import org.optaplanner.core.api.domain.solution.drools.ProblemFactCollectionProperty;
import org.optaplanner.core.api.domain.solution.drools.ProblemFactProperty;
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

import org.optaplanner.core.api.domain.solution.ProblemFactCollectionProperty;
import org.optaplanner.core.api.domain.solution.ProblemFactProperty;
Copy to Clipboard Toggle word wrap

filterClassList 替换为单个过滤器类

,公共 API

EntitySelectorValueSelectorMoveSelector 的配置现在在配置 API 和 solver 配置 XML 中都有一个过滤器类。

在实践中,您不需要多个选择过滤器类,您可以将它们替换为实施所有它们逻辑的单一选择过滤器类。现在,传递一个选择类需要较少的样板代码。

OptaPlanner 7 中的 *.java 文件示例:

ValueSelectorConfig valueSelectorConfig = new ValueSelectorConfig();
valueSelectorConfig.setFilterClassList(Collections.singletonList(MySelectionFilterClass.class));
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

ValueSelectorConfig valueSelectorConfig = new ValueSelectorConfig();
valueSelectorConfig.setFilterClass(MySelectionFilterClass.class);
Copy to Clipboard Toggle word wrap

使用单个选择过滤器类替换多个选择过滤器类

OptaPlanner 7 中的 *.xml 文件示例:

<swapMoveSelector>
  <entitySelector>
    <filterClass>com.example.FilterA</filterClass>
    <filterClass>com.example.FilterB</filterClass>
  </entitySelector>
</swapMoveSelector>
Copy to Clipboard Toggle word wrap

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;
    }
}
Copy to Clipboard Toggle word wrap
package com.example;
...
public class FilterB implements SelectionFilter<MySolution, MyPlanningEntity> {

    @Override
    public boolean accept(ScoreDirector<MySolution> scoreDirector, MyPlanningEntity selection) {
        return selection.getOrder() == Order.ASC;
    }
}
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.xml 文件示例:

<swapMoveSelector>
  <entitySelector>
    <filterClass>com.example.SingleEntityFilter</filterClass>
  </entitySelector>
</swapMoveSelector>
Copy to Clipboard Toggle word wrap

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;
    }
}
Copy to Clipboard Toggle word wrap

AcceptorConfig 被重命名为 LocalSearchAcceptorConfig

这只会影响配置 API。解决器配置 XML 文件保持不变。

实现与其他特定于本地搜索的配置类的命名一致性。

OptaPlanner 7 中的 *.java 文件示例:

LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig()
        .withAcceptorConfig(new AcceptorConfig().withEntityTabuSize(5));
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig()
        .withAcceptorConfig(new LocalSearchAcceptorConfig().withEntityTabuSize(5));
Copy to Clipboard Toggle word wrap

自定义属性 XML 配置格式更改

,公共 API

此问题仅影响解析器配置 XML,特别是 < scoreDirectorFactory/> , < moveIteratorFactory/> , &lt; 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>
Copy to Clipboard Toggle word wrap

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>
Copy to Clipboard Toggle word wrap

<variableNameInclude/& gt; 元素现在被 < variableNameIncludes/> 元素包装

,公共 API

这个版本只影响 solver 配置 XML,特别是 < swapMoveSelector/> 和 & lt ;pillarSwapMoveSelector/> 元素。

这一更改是为了在构建时强制实施配置 XML 的结构。

OptaPlanner 7 中的 *.xml 文件示例:

<swapMoveSelector>
  <variableNameInclude>variableA</variableNameInclude>
  <variableNameInclude>variableB</variableNameInclude>
</swapMoveSelector>
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.xml 文件示例:

<swapMoveSelector>
  <variableNameIncludes>
    <variableNameInclude>variableA</variableNameInclude>
    <variableNameInclude>variableB</variableNameInclude>
  </variableNameIncludes>
</swapMoveSelector>
Copy to Clipboard Toggle word wrap

删除了 解决方案 接口

,公共 API

Solution 接口已弃用并删除。AbstractSolution 接口(仅被 Business Central 使用)也已被删除。

删除 Solution 接口,将 getScore () 方法标上 @PlanningScore,并将 getProblemFacts () 方法替换为每个问题事实 getter (或字段)上的 @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;
    }

}
Copy to Clipboard Toggle word wrap

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) {...}

}
Copy to Clipboard Toggle word wrap

对于没有包括在集合中的单个问题事实,请使用 @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;
    }

}
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

@PlanningSolution
public class CloudBalance {

    @ProblemFactProperty
    private CloudParametrization parametrization;
    @ProblemFactCollectionProperty
    private List<CloudBuilding> buildingList;
    @ValueRangeProvider(id = "computerRange")
    @ProblemFactCollectionProperty
    private List<CloudComputer> computerList;
    ...

}
Copy to Clipboard Toggle word wrap

不要对具有 @PlanningEntityCollectionProperty 注释的 getter (或字段)添加 @ProblemFactCollectionProperty 注释。

BestSolutionChangedEvent:isNewBestSolutionInitialized () 已删除

,公共 API

BestSolutionChangedEvent.isNewBestSolutionInitialized () 方法已弃用,并替换为 BestSolutionChangedEvent.getNewBestSolution ().getScore ().isSolutionInitialized () 方法。BestSolutionChangedEvent.isNewBestSolutionInitialized () 方法已被删除。

OptaPlanner 7 中的 *.java 文件示例:

    public void bestSolutionChanged(BestSolutionChangedEvent<CloudBalance> event) {
        if (event.isEveryProblemFactChangeProcessed()
                && event.isNewBestSolutionInitialized()) {
            ...
        }
    }
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

    public void bestSolutionChanged(BestSolutionChangedEvent<CloudBalance> event) {
        if (event.isEveryProblemFactChangeProcessed()
                && event.getNewBestSolution().getScore().isSolutionInitialized()) {
            ...
        }
    }
Copy to Clipboard Toggle word wrap

如果您检查 isFeasible (),它将检查是否初始化了解决方案。

OptaPlanner 8 中的 *.java 文件示例:

    public void bestSolutionChanged(BestSolutionChangedEvent<CloudBalance> event) {
        if (event.isEveryProblemFactChangeProcessed()
                // isFeasible() checks isSolutionInitialized() too
                && event.getNewBestSolution().getScore().isFeasible()) {
            ...
        }
    }
Copy to Clipboard Toggle word wrap

<valueSelector > : variableName 现在是一个属性

,公共 API

当电源调整移动选择器(如 < changeMoveSelector> )时,在带有多个规划变量的用例中,&lt ;variableName& gt; XML 元素已被一个 variableName="…​" XML 属性替代。这一更改可减少解决者配置详细程度。在整个 7.x 系列中被弃用后,旧方法现已被删除。

OptaPlanner 7 中的 *SolverConfig.xml*BenchmarkConfig.xml 文件中的示例:

  <valueSelector>
    <variableName>room</variableName>
  </valueSelector>
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *SolverConfig.xml*BenchmarkConfig.xml 文件中的示例:

  <valueSelector variableName="room"/>
Copy to Clipboard Toggle word wrap

分区的搜索:已删除 threadFactoryClass

,公共 API

因为 <solver& gt; 有一些时间支持 <threadFactoryClass > 元素,所以 & lt; partitionedSearch> 下的 <threadFactoryClass & gt; 元素已被删除。

OptaPlanner 7 中的 *SolverConfig.xml*BenchmarkConfig.xml 文件中的示例:

  <solver>
    ...
    <partitionedSearch>
      <threadFactoryClass>...MyAppServerThreadFactory</threadFactoryClass>
      ...
    </partitionedSearch>
  </solver>
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *SolverConfig.xml*BenchmarkConfig.xml 文件中的示例:

  <solver>
    <threadFactoryClass>...MyAppServerThreadFactory</threadFactoryClass>
    ...
    <partitionedSearch>
      ...
    </partitionedSearch>
  </solver>
Copy to Clipboard Toggle word wrap

SimpleDoubleScoreHardSoftDoubleScore removed

,公共 API

不建议使用基于双分的分数类型,因为它们可能导致分数损坏。它们已被删除。

OptaPlanner 7 中的 *.java 文件示例:

@PlanningSolution
public class MyPlanningSolution {

    private SimpleDoubleScore score;

    ...

}
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

@PlanningSolution
public class MyPlanningSolution {

    private SimpleLongScore score;

    ...

}
Copy to Clipboard Toggle word wrap

Score.toInitializedScore() removed

,公共 API

Score.toInitializedScore () 方法已弃用,并使用 7.x 中的 Score.withInitScore (int) 方法替代,现已被删除。

OptaPlanner 7 中的 *.java 文件示例:

score = score.toInitializedScore();
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

score = score.withInitScore(0);
Copy to Clipboard Toggle word wrap

已删除各种原因

,公共 API

以下 Comparator 实现在 7.x 中已弃用并删除:

  • org.optaplanner.core.api.score.comparator.NaturalScoreComparator
  • org.optaplanner.core.api.score.constraint.ConstraintMatchScoreComparator
  • org.optaplanner.core.api.score.constraint.ConstraintMatchTotalScoreComparator
  • org.optaplanner.core.api.score.constraint.IndictmentScoreComparator

OptaPlanner 7 中的 *.java 文件示例:

NaturalScoreComparator comparator = new NaturalScoreComparator();
ConstraintMatchScoreComparator comparator2 = new ConstraintMatchScoreComparator();
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

Comparator<Score> comparator = Comparable::compareTo;
Comparator<ConstraintMatch> comparator2 = Comparator.comparing(ConstraintMatch::getScore);
Copy to Clipboard Toggle word wrap

删除 FeasibilityScore

,公共 API

FeasibilityScore 接口在 7.x 中已弃用,它唯一方法为 isFeasible () 移到 Score supertype。接口现已被删除。

您应该通过其 ultimate 类型引用 Score,例如 HardSoftScore 而不是 Score

@PlanningEntity.movableEntitySelectionFilter removed

,公共 API

@PlanningEntity 注解上的 movableEntitySelectionFilter 字段已在 7.x 中弃用,一个新的字段 pinningFilter 已被引入了一个名称,它显示 @PlanningPin 注释的相关名称。此过滤器实施一个新的 PinningFilter 接口,如果实体被固定,则返回 true,如果可移动,则为 false。因此,与旧过滤器相比,这个新过滤器的逻辑颠倒。

您应该通过提供新过滤器而不是旧过滤器来更新 @PlanningEntity 注释。旧的过滤器现已被删除。

OptaPlanner 7 中的 *.java 文件示例:

@PlanningEntity(movableEntitySelectionFilter = MyMovableEntitySelectionFilter.class)
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

@PlanningEntity(pinningFilter = MyPinningFilter.class)
Copy to Clipboard Toggle word wrap

@PlanningVariable.reinitializeVariableEntityFilter removed

,公共 API

@PlanningVariable 注解上的 reinitializeVariableEntityFilter 字段在 7.x 中弃用,现在已被删除。

*ScoreHolder 类转换为接口

,公共 API

在 OptaPlanner 7 中,ScoreHolder 类专门用于 Drools 分数计算,公开了很多公共方法(如果使用),允许用户意外损坏或对分数造成负面影响。

在 OptaPlanner 8 中,这些方法已被删除,并将类转换为接口。大多数用户都不使用删除的方法,并可能会有害的方法。

但是,如果您确实使用这些方法,您将在分数说明和约束配置区域在公共 API 中找到合适的替换。

ValueRangeFactory 类现在最终

ValueRangeFactory 类是一个仅具有静态方法的工厂类。因此,您不需要扩展这个类,因此最终已成为 最终

OptaPlanner 7 中的 *.java 文件示例:

class MyValueRangeFactory extends ValueRangeFactory {
    ...
}
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

class MyValueRangeFactory {
    ...
}
Copy to Clipboard Toggle word wrap

ConstraintMatchTotalIndictment 现在是接口

,公共 API

ConstraintMatchTotalIndictment 类已转换为接口。因此,它们的实现被从公共 API 中移出,以及允许它们修改其状态的方法。这些方法从不用于公共 API,因此没有替换它们。

如果您选择实施 ConstraintMatchAwareIncrementalScoreCalculator,您可能仍然需要实例:

ConstraintMatchTotal maximumCapacityMatchTotal = new ConstraintMatchTotal(...);
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

ConstraintMatchTotal maximumCapacityMatchTotal = new DefaultConstraintMatchTotal(...);
Copy to Clipboard Toggle word wrap

ScoreManager: 添加了通用类型 Score

公共 API

ScoreManagerScoreExplanation API 现在具有通用类型 分数,以避免在代码中停机,例如从 ScoreHardSoftScore

OptaPlanner 7 中的 *.java 文件示例:

    @Inject // or @Autowired
    ScoreManager<TimeTable> scoreManager;
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

    @Inject // or @Autowired
    ScoreManager<TimeTable, HardSoftScore> scoreManager;
Copy to Clipboard Toggle word wrap

OptaPlanner 7 中的 *.java 文件示例:

    ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable);
    HardSoftScore score = (HardSoftScore) explanation.getScore();
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

    ScoreExplanation<TimeTable, HardSoftScore> explanation = scoreManager.explainScore(timeTable);
    HardSoftScore score = explanation.getScore();
Copy to Clipboard Toggle word wrap

ConstraintMatchTotal,ConstraintMatch, 和 Indictment: generic type Score added

ScoreManagerScoreExplanation 类似,ConstraintMatchTotalConstraintMatchIndictment API 现在有一个通用类型 Score,以避免在代码中停机,例如从 ScoreHardSoftScore

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();
Copy to Clipboard Toggle word wrap

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();
Copy to Clipboard Toggle word wrap

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();
Copy to Clipboard Toggle word wrap

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();
Copy to Clipboard Toggle word wrap

ConstraintMatchAwareIncrementalScoreCalculator: 通用类型 Score 添加了

现在,接口 ConstraintMatchAwareIncrementalScoreCalculator 也是 Score 的通用类型参数,以避免原始类型使用 ConstraintMatchTotalIndictment

OptaPlanner 7 中的 *.java 文件示例:

public class MachineReassignmentIncrementalScoreCalculator
        implements ConstraintMatchAwareIncrementalScoreCalculator<MachineReassignment> {

    @Override
    public Collection<ConstraintMatchTotal> getConstraintMatchTotals() {
        ...
    }


    @Override
    public Map<Object, Indictment> getIndictmentMap() {
        ...
    }

}
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

public class MachineReassignmentIncrementalScoreCalculator
        implements ConstraintMatchAwareIncrementalScoreCalculator<MachineReassignment, HardSoftLongScore> {

    @Override
    public Collection<ConstraintMatchTotal<HardSoftLongScore>> getConstraintMatchTotals() {
        ...
    }


    @Override
    public Map<Object, Indictment<HardSoftLongScore>> getIndictmentMap() {
        ...
    }

}
Copy to Clipboard Toggle word wrap

AbstractCustomPhaseCommand 已被删除

,公共 API

删除了抽象类 AbstractCustomPhaseCommand。任何扩展它的类都应直接实施 CustomPhaseCommand 接口。

OptaPlanner 7 中的 *.java 文件示例:

public class DinnerPartySolutionInitializer extends AbstractCustomPhaseCommand<DinnerParty> {

    @Override
    public void changeWorkingSolution(ScoreDirector<DinnerParty> scoreDirector) {
        ...
    }

}
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

public class DinnerPartySolutionInitializer implements CustomPhaseCommand<DinnerParty> {

    @Override
    public void changeWorkingSolution(ScoreDirector<DinnerParty> scoreDirector) {
        ...
    }

}
Copy to Clipboard Toggle word wrap

分数计算器被移到公共 API

接口 EasyScoreCalculator,IncrementalScoreCalculator, and ConstraintMatchAwareIncrementalScoreCalculator 已移到公共 API 中的新软件包。其已弃用的 counterparts 已被删除。弃用的类 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> {
    ...
  }
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 EasyScoreCalculator.java 文件示例:

  ...
  import org.optaplanner.core.api.score.calculator.EasyScoreCalculator;
  ...

  public class CloudBalancingEasyScoreCalculator implements EasyScoreCalculator<CloudBalance, HardSoftScore> {
    ...
  }
Copy to Clipboard Toggle word wrap

OptaPlanner 7 中的 IncrementalScoreCalculator.java 文件示例:

  ...
  import org.optaplanner.core.impl.score.director.incremental.AbstractIncrementalScoreCalculator;
  ...

  public class CloudBalancingIncrementalScoreCalculator extends AbstractIncrementalScoreCalculator<CloudBalance> {
    ...
  }
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 IncrementalScoreCalculator.java 文件示例:

  ...
  import org.optaplanner.core.api.score.calculator.IncrementalScoreCalculator;
  ...

  public class CloudBalancingIncrementalScoreCalculator implements IncrementalScoreCalculator<CloudBalance, HardSoftScore> {
    ...
  }
Copy to Clipboard Toggle word wrap

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> {
    ...
  }
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 ConstraintMatchAwareIncrementalScoreCalculator.java 文件示例:

  ...
  import org.optaplanner.core.api.score.calculator.ConstraintMatchAwareIncrementalScoreCalculator;
  ...

  public class CheapTimeConstraintMatchAwareIncrementalScoreCalculator
        implements ConstraintMatchAwareIncrementalScoreCalculator<CheapTimeSolution, HardMediumSoftLongScore> {
    ...
  }
Copy to Clipboard Toggle word wrap

PlannerBenchmarkFactory:createFromSolverFactory () removed

公共 API

PlannerBenchmarkFactory.createFromSolverFactory () 方法已弃用,并替换为 PlannerBenchmarkFactory.createFromSolverConfigXmlResource (String) 方法。PlannerBenchmarkFactory.createFromSolverFactory () 方法已被删除。

OptaPlanner 7 中的 *.java 文件示例:

SolverFactory<CloudBalance> solverFactory = SolverFactory.createFromXmlResource(
        ".../cloudBalancingSolverConfig.xml");
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromSolverFactory(solverFactory);
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromSolverConfigXmlResource(
        ".../cloudBalancingSolverConfig.xml");
Copy to Clipboard Toggle word wrap

如果您以编程方式调整了 solver 配置,您可以使用 PlannerBenchmarkConfig.createFromSolverConfig (SolverConfig),然后 PlannerBenchmarkFactory.create (PlannerBenchmarkConfig)

PlannerBenchmarkFactory:getPlannerBenchmarkConfig () 已删除

,公共 API

PlannerBenchmarkFactory.getPlannerBenchmarkConfig () 方法已弃用,并替换为 PlannerBenchmarkFactory.create (PlannerBenchmarkConfig) 方法。PlannerBenchmarkConfig 实例现在在 PlannerBenchmarkFactory 实例实例化前实例化。该顺序更为逻辑。PlannerBenchmarkFactory.getPlannerBenchmarkConfig () 已被删除。

OptaPlanner 7 中的 *.java 文件示例:

PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource(
        ".../cloudBalancingBenchmarkConfig.xml");
PlannerBenchmarkConfig benchmarkConfig = benchmarkFactory.getPlannerBenchmarkConfig();
...
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

PlannerBenchmarkConfig benchmarkConfig = PlannerBenchmarkConfig.createFromXmlResource(
        ".../cloudBalancingBenchmarkConfig.xml");
...
PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.create(benchmarkConfig);
PlannerBenchmark benchmark = benchmarkFactory.buildPlannerBenchmark();
Copy to Clipboard Toggle word wrap

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>
Copy to Clipboard Toggle word wrap

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>
Copy to Clipboard Toggle word wrap

使用 XSD 可能需要对配置的一些 XML 元素重新排序。在 IDE 中使用代码完成来迁移到有效的 XML。

ProblemBenchmarksConfig:xStreamAnnotatedClass removed

公共 API

{mAnnotatedClas} 已从 < problemBenchmarks/&gt; 配置以及对应的 getXStreamAnnotatedClassList ()setXStreamAnnotatedClassList () 方法中删除。

OptaPlanner 7 中的 *.java 文件示例:

ProblemBenchmarksConfig problemBenchmarksConfig = new ProblemBenchmarksConfig();
problemBenchmarksConfig.setXStreamAnnotatedClassList(MySolution.class);
Copy to Clipboard Toggle word wrap

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);
Copy to Clipboard Toggle word wrap

OptaPlanner 7 中的 *BenchmarkConfig.xml 文件示例:

<plannerBenchmark>
...
  <solverBenchmark>
    <problemBenchmarks>
      <xStreamAnnotatedClass>com.example.MySolution</xStreamAnnotatedClass>
      ...
    </problemBenchmarks>
    ...
  </solverBenchmark>
...
</plannerBenchmark>
Copy to Clipboard Toggle word wrap

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>
Copy to Clipboard Toggle word wrap

BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkFactory) 已删除

BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkFactory) 方法已弃用,并替换为 BenchmarkAggregatorFrame.createAndDisplayFromXmlResource (String) 方法。BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkFactory) 方法已被删除。

OptaPlanner 7 中的 *.java 文件示例:

PlannerBenchmarkFactory benchmarkFactory = PlannerBenchmarkFactory.createFromXmlResource(
        ".../cloudBalancingBenchmarkConfig.xml");
BenchmarkAggregatorFrame.createAndDisplay(benchmarkFactory);
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 *.java 文件示例:

BenchmarkAggregatorFrame.createAndDisplayFromXmlResource(
        ".../cloudBalancingBenchmarkConfig.xml");
Copy to Clipboard Toggle word wrap

如果您以编程方式调整基准配置,您可以使用 BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkConfig)

删除了配置中的 JavaScript 表达式支持

solver 配置和基准配置的各种元素不再支持嵌套 JavaScript 表达式。您必须将它们替换为自动配置,或替换为整数常量。

OptaPlanner 7 中的 solverConfig.xml 文件中的示例:

    <solver>
        ...
        <moveThreadCount>availableProcessorCount - 1</moveThreadCount>
        ...
    </solver>
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 'solverConfig.xml'file 的示例:

    <solver>
        ...
        <moveThreadCount>1</moveThreadCount> <!-- Alternatively, use "AUTO" or omit entirely. -->
        ...
    </solver>
Copy to Clipboard Toggle word wrap

OptaPlanner 7 中的 benchmarkConfig.xml 文件示例:

    <plannerBenchmark>
      ...
      <parallelBenchmarkCount>availableProcessorCount - 1</parallelBenchmarkCount>
      ...
    </plannerBenchmark>
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 benchmarkConfig.xml 文件示例:

    <plannerBenchmark>
      ...
      <parallelBenchmarkCount>1</parallelBenchmarkCount> <!-- Alternatively, use "AUTO" or omit entirely. -->
      ...
    </plannerBenchmark>
Copy to Clipboard Toggle word wrap

删除了已弃用的变量监听程序

公共 API

软件包 org.optaplanner.core.impl.domain.variable.listener 中的已弃用的接口 VariableListener 已被删除,以及已弃用的接口 StatefulVariableListener 以及同一软件包中已弃用的类 VariableListenerAdapter。使用 org.optaplanner.core.api.domain.variable 软件包中的 VariableListener 接口。

OptaPlanner 7 中的 VariableListener.java 文件示例:

  ...
  import org.optaplanner.core.impl.domain.variable.listener.VariableListenerAdapter;
  ...

  public class MyVariableListener extends VariableListenerAdapter<Object> {

    ...

    @Override
    void afterEntityRemoved(ScoreDirector scoreDirector, Object entity);
      ...
    }

    ...
  }
Copy to Clipboard Toggle word wrap

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);
      ...
    }

    ...
  }
Copy to Clipboard Toggle word wrap

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) {
      ...
    }

    ...
  }
Copy to Clipboard Toggle word wrap

OptaPlanner 8 中的 StatefulVariableListener.java 文件示例:

  ...
  import org.optaplanner.core.api.domain.variable.VariableListener;
  ...

  public class MyStatefulVariableListener implements VariableListener<MySolution, Object> {

    ...

    @Override
    public void close() {
      ...
    }

    ...
  }
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat