私はoptaplannerで解決しようとしている最適化の問題があります。解法は一連のルールを使用します。エンジンは、各ルールの重みを取得するオブジェクトを使用します。ルールの最終スコアは、ルールの中間スコアにウェイトを乗じたものです。スコアはすべてのルールの右側に設定されます。各ルールの左辺は、その重みがゼロでない場合にのみ評価され、次に右辺を実行します。ルールの重みをゼロに設定することは、ルールを無効にするメカニズムです。私はいくつかの小切手を実行し、それは動作します。オプティプランナーのルールを無効にする
このメカニズムの代わりに、optaplannerソルバー設定ファイルからルールを完全に削除することで、ルールを完全に無効にすることができます。
私は重量をゼロにしてルールを削除すると同じ結果が得られると予想しますが、それは当てはまりません。設定ファイルからルールを削除すると、ウェイトをゼロにするよりも良い解決策が得られます。
なぜそうですか? 実行時にルールを非アクティブにするにはどうすればよいですか?
以下は、ルールmyrule.drlの例である:
rule "myrule"
when
MyWeights($weight: myRuleWeight != 0)
then
scoreHolder.addHardConstraintMatch(context, $weight)
end
、ここでソルバーの設定:
<solver>
<scoreDirectorFactory>
<scoreDrl>myrule.drl</scoreDrl>
</scoreDirectorFactory>
</solver>
ソルバーの設定からmyrule.drlをコメントアウト重みを設定よりも優れたソリューションを提供しますゼロにする。
ANSWER設定XMLでsecondsSpentLimitが足りませんでした
ように0に設定された重みを持つ最適化はせずにのみ111ローカル検索(LS)与えられた時間内にステップおよび最適化を行っていたことルールは301のLSステップを完了しました。秒を増やすとSpentLimitが問題を解決しました
ステップの得点が同じではありませんが、私は自分の質問を更新して答えを出しました。両方の最適化は10分間実行され、ゼロウェイトのウェイトは120k LSステップを実行し、ウェイトは120k LSステップを実行しません。両方の最適化が時間制約のために中断し、最良の解決策が見つかったためではないので、意味があると思います – JCvanDamme
ステップにステップ119kで同じスコアがありますか? –
はい、ステップ119kでスコアが同じでした – JCvanDamme