第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);
ScoreDirector
や ScoreDirectorFactory
のインスタンスを取得できるようにするメソッドは、後継を導入せず、パブリック 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
PillarSwapMoveSelector
と PillarChangeMoveSelector
にある subPillarEnabled
プロパティーが非推奨となり、新しいプロパティー subPillarType
が後継となりました。subPillarEnabled
プロパティーが削除されました。
OptaPlanner 7 の *SolverConfig.xml
および *BenchmarkConfig.xml
ファイルからの例:
<pillar...MoveSelector> ... <pillarSelector> <subPillarEnabled>false</subPillarEnabled> ... </pillarSelector> ... </pillar...MoveSelector>
OptaPlanner 8 の *SolverConfig.xml
および *BenchmarkConfig.xml
ファイルからの例:
<pillar...MoveSelector> <subPillarType>NONE</subPillarType> <pillarSelector> ... </pillarSelector> ... </pillar...MoveSelector>
Solver
: getScoreDirectorFactory()
の削除
メジャー、パブリック API
getScoreDirectorFactory()
メソッドが非推奨となり、Solver
と SolverFactory
クラスの両方から削除されました。
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
EntitySelector
、ValueSelector
および 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 { ... }
ConstraintMatchTotal
と Indictment
がインターフェイスに
マイナー、パブリック API
ConstraintMatchTotal
クラスと Indictment
クラスがインターフェイスに変換されました。そのため、状態を変化できるようにするメソッドと合わせて、それらの実装がパブリック API から移行されました。このようなメソッドはパブリック API 用として作成されていないので、後継のメソッドはありません。
ConstraintMatchAwareIncrementalScoreCalculator
を実装する場合は、インスタンス自体が必要になる場合があります。
ConstraintMatchTotal maximumCapacityMatchTotal = new ConstraintMatchTotal(...);
OptaPlanner 8 の *.java
ファイルからの例:
ConstraintMatchTotal maximumCapacityMatchTotal = new DefaultConstraintMatchTotal(...);
scoreManager
: 汎用型 Score
の追加
メジャー、パブリック API
コード内でダウンキャストされないように、ScoreManager
と ScoreExplanation
API に汎用型 Score
が含まれるようになりました (例: Score
から HardSoftScore
)。
OptaPlanner 7 の *.java
ファイルからの例:
@Inject // or @Autowired ScoreManager<TimeTable> scoreManager;
OptaPlanner 8 の *.java
ファイルからの例:
@Inject // or @Autowired ScoreManager<TimeTable, HardSoftScore> scoreManager;
OptaPlanner 7 の *.java
ファイルからの例:
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable); HardSoftScore score = (HardSoftScore) explanation.getScore();
OptaPlanner 8 の *.java
ファイルからの例:
ScoreExplanation<TimeTable, HardSoftScore> explanation = scoreManager.explainScore(timeTable); HardSoftScore score = explanation.getScore();
ConstraintMatchTotal
, ConstraintMatch
and Indictment
: 汎用型 Score
の追加
メジャー
ScoreManager
と ScoreExplanation
と同様に、コード内でダウンキャストされないように、ConstraintMatchTotal
、ConstraintMatch
および Indictment
API には汎用型 Score
が含まれるようになりました (例: Score
から HardSoftScore
)。
OptaPlanner 7 の *.java
ファイルからの例:
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable); Map<String, ConstraintMatchTotal> constraintMatchTotalMap = scoreExplanation.getConstraintMatchTotalMap(); ConstraintMatchTotal constraintMatchTotal = constraintMatchTotalMap.get(contraintId); HardSoftScore totalScore = (HardSoftScore) constraintMatchTotal.getScore();
OptaPlanner 8 の *.java
ファイルからの例:
ScoreExplanation<TimeTable, HardSoftScore> explanation = scoreManager.explainScore(timeTable); Map<String, ConstraintMatchTotal<HardSoftScore>> constraintMatchTotalMap = scoreExplanation.getConstraintMatchTotalMap(); ConstraintMatchTotal<HardSoftScore> constraintMatchTotal = constraintMatchTotalMap.get(contraintId); HardSoftScore totalScore = constraintMatchTotal.getScore();
OptaPlanner 7 の *.java
ファイルからの例:
ScoreExplanation<TimeTable> explanation = scoreManager.explainScore(timeTable); Map<Object, Indictment> indictmentMap = scoreExplanation.getIndictmentMap(); Indictment indictment = indictmentMap.get(lesson); HardSoftScore totalScore = (HardSoftScore) indictment.getScore();
OptaPlanner 8 の *.java
ファイルからの例:
ScoreExplanation<TimeTable, HardSoftScore> explanation = scoreManager.explainScore(timeTable); Map<Object, Indictment<HardSoftScore>> indictmentMap = scoreExplanation.getIndictmentMap(); Indictment<HardSoftScore> indictment = indictmentMap.get(lesson); HardSoftScore totalScore = indictment.getScore();
ConstraintMatchAwareIncrementalScoreCalculator
: 汎用型 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 に移動
メジャー
インターフェイス EasyScoreCalculator
、IncrementalScoreCalculator
および ConstraintMatchAwareIncrementalScoreCalculator
がパブリック API の新規パッケージに移動されました。非推奨になったインターフェイスが削除されました。非推奨の org.optaplanner.core.impl.score.director.incremental.AbstractIncrementalScoreCalculator
クラスも削除されました。パブリック API で、削除されたインターフェイスおよびクラスに対応するものに置き換えます。
OptaPlanner 7 の EasyScoreCalculator.java
ファイルからの例:
... import org.optaplanner.core.impl.score.director.easy.EasyScoreCalculator; ... public class CloudBalancingEasyScoreCalculator implements EasyScoreCalculator<CloudBalance> { ... }
OptaPlanner 8 の EasyScoreCalculator.java
ファイルからの例:
... import org.optaplanner.core.api.score.calculator.EasyScoreCalculator; ... public class CloudBalancingEasyScoreCalculator implements EasyScoreCalculator<CloudBalance, HardSoftScore> { ... }
OptaPlanner 7 の IncrementalScoreCalculator.java
ファイルからの例:
... import org.optaplanner.core.impl.score.director.incremental.AbstractIncrementalScoreCalculator; ... public class CloudBalancingIncrementalScoreCalculator extends AbstractIncrementalScoreCalculator<CloudBalance> { ... }
OptaPlanner 8 の IncrementalScoreCalculator.java
ファイルからの例:
... import org.optaplanner.core.api.score.calculator.IncrementalScoreCalculator; ... public class CloudBalancingIncrementalScoreCalculator implements IncrementalScoreCalculator<CloudBalance, HardSoftScore> { ... }
OptaPlanner 7 の ConstraintMatchAwareIncrementalScoreCalculator.java
ファイルからの例:
... import org.optaplanner.core.impl.score.director.incremental.AbstractIncrementalScoreCalculator; import org.optaplanner.core.impl.score.director.incremental.ConstraintMatchAwareIncrementalScoreCalculator; ... public class CheapTimeConstraintMatchAwareIncrementalScoreCalculator extends AbstractIncrementalScoreCalculator<CheapTimeSolution> implements ConstraintMatchAwareIncrementalScoreCalculator<CheapTimeSolution> { ... }
OptaPlanner 8 の ConstraintMatchAwareIncrementalScoreCalculator.java
ファイルからの例:
... import org.optaplanner.core.api.score.calculator.ConstraintMatchAwareIncrementalScoreCalculator; ... public class CheapTimeConstraintMatchAwareIncrementalScoreCalculator implements ConstraintMatchAwareIncrementalScoreCalculator<CheapTimeSolution, HardMediumSoftLongScore> { ... }
PlannerBenchmarkFactory
: createFromSolverFactory()
の削除
メジャー、パブリック 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() { ... } ... }