0

私は一連の方程式を持っています。また、一連の値と方程式の結果もあります。何かのようなもの:

a + b + c = x

いくつかの割り当ては次のようになります。

1 + 1 + 1 = 3

2 + 3 + 4 = 9

ただし、実際の方程式ははるかに長く、対数などの関数が含まれている場合があります。

ここで、(1) 方程式が特定の値 xx に等しくなり、(2) パラメーターができるだけ変化しないように、特定のセットの結果を変更する必要があります。

方程式を次のように変更することで、これをCSPとして解決できると思いました

(a + ax) + (b + bx) + (c + cx) = xx

ここで、a、b、および c は古い値に対応し、ax、bx、および cx は、対応する古い値に適用する必要がある差です。そして xx は、方程式に求めたい結果です。a、b、c、xa、xb、cx などはすべて整数値であり、xx は常に x から一定の距離内にあることに注意してくださいxx - d < x < xx + d

CSP では、a、b、c、および xx は問題の事実として扱われ、ax、bx、cx は計画変数として扱われ、方程式(a + ax) + (b + bx) + (c + cx) = xxは厳密な制約になります。ax、ab、ac のすべてを最小化することは、ソフト制約になります。ここには計画エンティティは実際にはありません。

global HardSoftScoreHolder scoreHolder;


rule "changeIsBad"
    when
        DeltaVariable($delta : delta)
    then
        scoreHolder.addSoftConstraintMatch(kcontext, -Math.abs(delta));
end

rule "equationMustBeEqual"
    // No idea?
end

しかし、ここから先に進む方法がわかりません。Optaplanner はこの種の問題に適していますか? 私は整数値しか持っていませんが、すべてPlanningVariableの s はリストから取得し、インスタンスでなければならないようです。私のモデルは正しいですか?

4

1 に答える 1

1

次のように、各整数変数をエンティティ クラスにラップできます。

@PlanningEntity
public class MyEntity {

   private Integer myVariable;

   @PlanningVariable(...)
   public Integer getMyVariable() {...}
   ...
}

さらに、計画エンティティ範囲を使用して各変数の範囲を定義します (エンティティごとに異なるため)。公式ドキュメントのセクション「4.3.5.2.2.計画エンティティの ValueRangeProvider」を参照してください (SwapMove は使用せず、ChangeMove の I のみを使用します)。推測してみて)。

しかし、全体として、これが仕事に適したツールであるかどうかは 100% 確信が持てません。このユースケースでのあなたの経験がどのような結果をもたらすか知りたいです.

PS: 6.1.0.Beta1 (まだリリースされていませんが、ナイトリーは利用可能です) から、セクション「4.3.5.2.4. ValueRangeFactory」のナイトリー ドキュメントに記載されているように、IntValueRange があり、これらの種類のユース ケースでより効率的です。 .

于 2014-02-06T09:28:54.933 に答える