2017-04-19 8 views
0

私は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が問題を解決しました

答えて

1

両方とも同じステップ数を実行した場合、これは不可能です。org.optaplannerのログにDEBUGのログを記録すると、両方とも実行されたステップ数とスコアのスピードを確認できます。

いずれのステップでも、両方のランの正確なステップスコアと正確に同じベストスコアが必要です。そうでない場合は、バグがあります。を潜在的な原因として再現してください。

+0

ステップの得点が同じではありませんが、私は自分の質問を更新して答えを出しました。両方の最適化は10分間実行され、ゼロウェイトのウェイトは120k LSステップを実行し、ウェイトは120k LSステップを実行しません。両方の最適化が時間制約のために中断し、最良の解決策が見つかったためではないので、意味があると思います – JCvanDamme

+0

ステップにステップ119kで同じスコアがありますか? –

+1

はい、ステップ119kでスコアが同じでした – JCvanDamme

関連する問題