搜索

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

download PDF

本节中列出的更改与 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。

SolverFactoryPlannerBenchmarkFactory 不再支持 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);

允许您检索 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();

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

PillarSwapMoveSelectorPillarChangeMoveSelector 中的 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 的配置ValueSelectorMoveSelector 现在在配置 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 选择器(如 &lt ;changeMoveSelector& gt;)时,带有多个规划变量的用例中,&lt ;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; partitionedSearch> 下的 <threadFactoryClass & gt; 元素已被删除。

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>

SimpleDoubleScoreHardSoftDoubleScore 已删除

公共 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 Variable 注解上的 reinitializeVariableFilter 字段已在 7.x 中被弃用,现已被删除。

* 被设置为接口(ScoreHolder 类)

公共 API

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

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

但是,如果您使用这些方法,您可以在分数解释和约束配置方面在公共 API 中找到合适的替换。

ValueRangeFactory 类现在最后

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

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

class MyValueRangeFactory extends ValueRangeFactory {
    ...
}

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

class MyValueRangeFactory {
    ...
}

现在,ConstraintMatchTotalIndictment 是接口

公共 API

ConstraintMatchTotalIndictment 类已转换为接口。因此,他们的实施过程从公共 API 中移出,并附带允许它们修改其状态的方法。这些方法绝不能用于公共 API,因此没有替换它们。

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

ConstraintMatchTotal maximumCapacityMatchTotal = new ConstraintMatchTotal(...);

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

ConstraintMatchTotal maximumCapacityMatchTotal = new DefaultConstraintMatchTotal(...);

分数管理器 :添加了通用类型 Score

主要,Public API

ScoreManagerScoreExplanation API 现在具有通用类型 Score,以避免在您的代码中进行停机,例如:从 ScoreHardSoftScore

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();

ConstraintMatchTotalConstraintMatchIndictment: 通用类型 Score 添加

主要

ScoreManagerScoreExplanation 类似,ConstraintMatchTotal ConstraintMatch, 和 Indictment 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();

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 以避免 ConstraintMatchTotalIndictment 的原始类型使用。

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,IncrementalScoreCalculatorConstraintMatchAwareIncrementalScoreCalculator 已移至公共 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/&gt; 配置以及对应的 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() {
      ...
    }

    ...
  }
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.