第1章 OptaPlanner 7.x 以前との互換性がない変更

本項に記載する変更は、OptaPlanner 7.x 以前のバージョンの OptaPlanner と互換性がありません。

Java 11 以降が必要である

メジャーパブリック API

JRE または JDK 8 を使用している場合は、JDK 11 以上にアップグレードしてください。

  • Linux の場合は、Linux ソフトウェアリポジトリーから OpenJDK を取得します。Fedora および Red Hat Enterprise Linux の場合は、以下のコマンドを入力します。

    sudo dnf install java-11-openjdk-devel
  • Windows および macOS の場合は、AdoptOpenJDK の Web サイトから OpenJDK をダウンロードします。

SolverFactory および PlannerBenchmarkFactory では KIE コンテナーがサポートされなくなった

メジャーパブリック API

OptaPlanner は Kogito に準拠するため、KIE コンテナーの概念は適用されません。そのため、SolverFactory では、KIE コンテナーから ソルバー インスタンスを作成できなくなりました。これは、PlannerBenchmarkFactory およびベンチマークにも適用されます。

OSGi メタデータが削除された

メジャーパブリック API

OSGi の使用量が制限されており、メンテナーンスの負荷が高いため、OptaPlanner 8.x シリーズの OptaPlanner JAR ファイルでは、META-INF/MANIFEST.MF ファイルに OSGi メタデータが含まれなくなりました。

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

OptaPlanner 8 の *.java ファイルからの例:

ScoreManager<CloudBalance> scoreManager = ScoreManager.create(solverFactory);
Score score = scoreManager.updateScore(solution);

ScoreDirectorScoreDirectorFactory のインスタンスを取得できるようにするメソッドは、後継を導入せず、パブリック API から削除されました。Score Director インターフェイスの縮小バージョンがパブリック API にプロモートし、パブリック API に ProblemFactChange インターフェイスをプロモートしました。

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

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

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) のコピーコンストラクターが後継となり、 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/> ルート要素が https://www.optaplanner.org/xsd/solver namespace に所属するように

メジャーパブリック API

OptaPlanner はソルバー設定に XML スキーマ定義を提供するようになりました。OptaPlanner は、既存の XML 設定との互換性を維持していますが、今後サポート対象となるのが有効な設定 XML のみになる可能性があるので、XSD への移行を強く推奨します。

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() の削除

メジャーパブリック API

getScoreDirectorFactory() メソッドが非推奨となり、SolverSolverFactory クラスの両方から削除されました。

UI でのスコアの計算または説明だけに Solver インスタンスを作成する必要がなくなりました。代わりに 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() has been removed

メジャーパブリック API

Solver インターフェイスの explainBestScore() メソッドは 7.x で非推奨になり、削除されました。新しい ScoreManager API から同じ情報を取得できます。

Red Hat は、このメソッド呼び出しの結果をいかなる方法でも解析しないことを推奨します。

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.addEventListener (…​)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();
});

アノテーションスキャンの削除

メジャーパブリック API

ソルバー設定の <scanAnnotatedClasses/> ディレクティブが 7.x で非推奨となり、削除されました。

OptaPlanner 7 の *.xml ファイルからの例:

<solver>
    ...
    <scanAnnotatedClasses/>
    ...
</solver>

OptaPlanner 8 の *.xml ファイルからの例:

<solver>
    ...
    <solutionClass>...</solutionClass>
    <entityClass>...</entityClass>
    ...
</solver>

@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;

OptaPlanner 8 の *.java ファイルからの例:

import org.optaplanner.core.api.domain.solution.ProblemFactCollectionProperty;
import org.optaplanner.core.api.domain.solution.ProblemFactProperty;

単一の filterClass が filterClassList の後継に

マイナーパブリック API

EntitySelectorValueSelector および MoveSelector の設定は、設定 API とソルバー設定 XML の両方に単一のフィルタークラスが含まれるようになりました。

実際には、複数の選択フィルタークラスが必要ないため、全ロジックを実装する単一の選択フィルタークラスに置き換えることができます。1 つの選択クラスを渡す場合に必要になるボイラープレートコードが少なくなります。

OptaPlanner 7 の *.java ファイルからの例:

ValueSelectorConfig valueSelectorConfig = new ValueSelectorConfig();
valueSelectorConfig.setFilterClassList(Collections.singletonList(MySelectionFilterClass.class));

OptaPlanner 8 の *.java ファイルからの例:

ValueSelectorConfig valueSelectorConfig = new ValueSelectorConfig();
valueSelectorConfig.setFilterClass(MySelectionFilterClass.class);

複数の選択フィルタークラスが 1 つの選択フィルタークラスに代わりました。

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 にのみ影響します。Solver 設定 XML ファイルには影響はありません。

他の local-search 固有の設定クラスとの命名の一貫性が実装されました。

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

この問題は、特に <scoreDirectorFactory/><moveIteratorFactory/><moveListFactory/><partitionedSearch/> および <customPhase/> XML などの ソルバー設定 XML にだけ影響を与えます。

この変更により、ビルド時に設定 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/> 要素が <variableNameIncludes/> 要素 でラップされるように

マイナーパブリック API

この更新は、特に <swapMoveSelector/> および <pillarSwapMoveSelector/> のソルバー設定 XML にだけ影響があります。

この変更により、ビルド時に設定 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 インターフェイスは非推奨となり、削除されました。Business Central でだけ使用される AbstractSolution インターフェイスも削除されました。

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

}

問題ファクト が 1 つで コレクション でラップされていない場合は、以下の例のように @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;
    ...

}

@ProblemFactCollectionProperty アノテーションがつけられたゲッター (またはフィールド) に @PlanningEntityCollectionProperty アノテーションを追加しないでください。

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

OptaPlanner 8 の *.java ファイルからの例:

    public void bestSolutionChanged(BestSolutionChangedEvent<CloudBalance> event) {
        if (event.isEveryProblemFactChangeProcessed()
                && event.getNewBestSolution().getScore().isSolutionInitialized()) {
            ...
        }
    }

isFeasible() をチェックする場合には、ソリューションが初期化されたかどうかが確認されます。

OptaPlanner 8 の *.java ファイルからの例:

    public void bestSolutionChanged(BestSolutionChangedEvent<CloudBalance> event) {
        if (event.isEveryProblemFactChangeProcessed()
                // isFeasible() checks isSolutionInitialized() too
                && event.getNewBestSolution().getScore().isFeasible()) {
            ...
        }
    }

<valueSelector>: variableName が属性に

マイナーパブリック API

<changeMoveSelector> など、複数のプランニング変数と使用する場合の電源調整の移動セレクター <variableName> 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><threadFactoryClass> 要素をサポートするようになってから時間が経っているので、<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() の削除

マイナーパブリック API

Score.toInitializedScore() メソッドは非推奨となり、7.x で Score.withInitScore (int) メソッドが後継となり、このメソッドは削除されました。

OptaPlanner 7 の *.java ファイルからの例:

score = score.toInitializedScore();

OptaPlanner 8 の *.java ファイルからの例:

score = score.withInitScore(0);

さまざまなな正当化 Comparators の削除

マイナーパブリック 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();

OptaPlanner 8 の *.java ファイルからの例:

Comparator<Score> comparator = Comparable::compareTo;
Comparator<ConstraintMatch> comparator2 = Comparator.comparing(ConstraintMatch::getScore);

FeasibilityScore が の削除

マイナーパブリック API

FeasibilityScore インターフェイスは 7.x で非推奨となり、 唯一の isFeasible() メソッドが Score supertype に移行されました。そのため、このインターフェイスが削除されました。

Score ではなく HardSoftScore などの、ultimate type で Score を参照するする必要があります。

@PlanningEntity.movableEntitySelectionFilter の削除

マイナーパブリック API

@PlanningEntity アノテーションの movableEntitySelectionFilter フィールドが 7.x で非推奨となり、新しいフィールド pinningFilter が導入されました。名前で、 @PlanningPin アノテーションとの明確な関係が分かります。このフィルターは新しい PinningFilter インターフェイスを実装し、エンティティーが固定されている場合は true を、移動可能の場合は false を返します。そのため、この新しいフィルターのロジックは以前のフィルターと比較して反転されます。

ユーザーは @PlanningEntity アノテーションを更新し、以前のフィルターではなく新しいフィルターを指定する必要があります。以前のフィールドは削除されました。

OptaPlanner 7 の *.java ファイルからの例:

@PlanningEntity(movableEntitySelectionFilter = MyMovableEntitySelectionFilter.class)

OptaPlanner 8 の *.java ファイルからの例:

@PlanningEntity(pinningFilter = MyPinningFilter.class)

@PlanningVariable.reinitializeVariableEntityFilter の削除

マイナーパブリック API

@PlanningVariable アノテーションの reinitializeVariableEntityFilter フィールドは、7.x で非推奨になり、削除されました。

*scoreHolder クラスがインターフェイスに

マイナーパブリック API

OptaPlanner 7 では ScoreHolder クラスは、Drools スコア計算専用に使用されており、このクラスを使用する場合には、パブリックメソッドが複数公開されるので、ユーザーが意図的に破損させることも、スコアに悪影響を与えることも可能でした。

OptaPlanner 8 では、これらのメソッドが削除され、クラスがインターフェイスにバインドされています。多くのユーザーは、削除済みの手法や、危害を与える可能性のある手法を使用しません。

ただし、このような手法を使用していない場合には、スコアの説明と制約設定のエリアでパブリック API で代わりに適したものが検索できます。

ValueRangeFactory クラスが final に

マイナー

ValueRangeFactory クラスは、静的メソッドのみが含まれるファクトリークラスです。ユーザーがこのクラスを拡張する必要はないので、final となりました。

OptaPlanner 7 の *.java ファイルからの例:

class MyValueRangeFactory extends ValueRangeFactory {
    ...
}

OptaPlanner 8 の *.java ファイルからの例:

class MyValueRangeFactory {
    ...
}

ConstraintMatchTotalIndictment がインターフェイスに

マイナーパブリック API

ConstraintMatchTotal クラスと Indictment クラスがインターフェイスに変換されました。そのため、状態を変化できるようにするメソッドと合わせて、それらの実装がパブリック API から移行されました。このようなメソッドはパブリック API 用として作成されていないので、後継のメソッドはありません。

ConstraintMatchAwareIncrementalScoreCalculator を実装する場合は、インスタンス自体が必要になる場合があります。

ConstraintMatchTotal maximumCapacityMatchTotal = new ConstraintMatchTotal(...);

OptaPlanner 8 の *.java ファイルからの例:

ConstraintMatchTotal maximumCapacityMatchTotal = new DefaultConstraintMatchTotal(...);

scoreManager: 汎用型 Score の追加

メジャーパブリック API

コード内でダウンキャストされないように、ScoreManagerScoreExplanation 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 and Indictment: 汎用型 Score の追加

メジャー

ScoreManagerScoreExplanation と同様に、コード内でダウンキャストされないように、ConstraintMatchTotalConstraintMatch および 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: 汎用型 Score の追加

マイナー

ConstraintMatchTotal and Indictment のロータイプを使用しないように、ConstraintMatchAwareIncrementalScoreCalculator インターフェイスに Score の汎用型パラメーターも含まれるようになりました。

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 に移動

メジャー

インターフェイス EasyScoreCalculatorIncrementalScoreCalculator および 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() の削除

メジャーパブリック 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 インスタンスが PlannerBenchmarkFactory インスタンスよりも先にインスタンス化されるようになりました。この順序はより論理的です。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 要素が https://www.optaplanner.org/xsd/benchmark namespace に属するように

マイナーパブリック API

OptaPlanner は、ベンチマーク設定の XML スキーマ定義 (XSD) を提供するようになりました。OptaPlanner は、既存の XML 設定との互換性を維持していますが、今後サポート対象となるのが有効な設定 XML のみになる可能性があるので、XSD への移行を強く推奨します。

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 の削除

メジャーパブリック API

<xStreamAnnotatedClass/> は、 ProblemBenchmarksConfig クラス内の、対応する getXStreamAnnotatedClassList()setXStreamAnnotatedClassList() メソッドとともに、<problemBenchmarks/> 設定から削除されました。

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 (PlannerBenchmarkFactory) の削除

マイナー

BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkFactory) メソッドは非推奨となり、BenchmarkAggregatorFrame.createAndDisplayFromXmlResource (String) メソッドが後継となりました。BenchmarkAggregatorFrame.createAndDisplay (PlannerBenchmarkFactory) メソッドが削除されました。

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 ファイルからの例:

    <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>

非推奨の変数リスナーの削除

メジャーパブリック API

org.optaplanner.core.impl.domain.variable.listener パッケージから、非推奨の StatefulVariableListener インターフェイスと VariableListenerAdapter クラスと合わせて、の非推奨の VariableListener が削除されました。代わりに、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() {
      ...
    }

    ...
  }