私は変数の配列とそれらの間の線形制約のリストを持っています。各変数について、有効な値の開始リストを含むセットがあります。 Minizincを使用して、これらの開始値のセットを制約を満たすことができるものだけに減らすにはどうすればよいですか?各変数が取ることができるすべての値を特定します
私が達成しようとしているものを実証するための簡単な例:
array[1..2] of var int: xy;
array[1..2] of set of int: xyvalid = [ {1, 5, 7}, 0..9 ];
constraint forall(i in 1..2)(xy[i] in xyvalid[i]);
constraint xy[1] + xy[2] = 7;
私はxy
のためのすべてのソリューションsolve satisfy
アイテムやプリントでこれを実行すると、私は(削除水平線で)取得する:
[1, 6]
[5, 2]
[4, 3]
[3, 4]
私はは何とかVARセットの配列を取得することですたい何、この場合には[ {1, 3, 4, 5}, {2, 3, 4, 6} ]
に等しくなることを、xypossible
それを呼び出します。 xypossible[1]
の可能なすべての値に対して、有効な解を生成する値がxypossible[2]
であり、その逆の場合、すべてのセットの合計カーディナリティを最大にするように解くという一連の制約を定義することができます。 xypossible
しかし、私の実際のデータは数百の変数のスケールで潜在的に数十の線形の制約があり、コードを書くのは面倒で実行するのが面倒です。
モデルとして使用する方法がない場合は、ソルバーが固有のジョブを実行する際に有効な値を特定した結果、情報を取得する方法がありますか?
var int:xyのセットの配列[1..2]でモデリングしようとしましたか?あなたはセットを見つけようとしています。 – Kobbe
私は最終的にそうするつもりだと思っていますが、適切な量のデータがあれば、アレイを効率的に作成するためのモデルの指定方法はわかりません。 – ConMan