0

問題を解決するためにchoco APIを使用しています。必要なのは、すべての変数の合計を 1 にする制約をコーディングすることです。このコードは、行の合計を 1 に保ちます。

IntegerVariable[][] rows;
int n; //number of rows
for(int i=0; i<n; i++)
model.addConstraint(eq(sum(rows[i], 1));

しかし、私が必要としているのは、各行の合計 = 1 ではなく、すべての要素の行列 (行の合計) の合計を 1 に保つコードをプログラミングすることです。

4

1 に答える 1

1

私があなたを正しく理解していれば、完全な行列の合計が 1 であることを確認してください。

次に、ArrayList ("all") を使用してすべての IntegerVariables を 1 つのリストに収集し、"all" に制約を追加できます。列の数など、あなたの例は完全ではありません。そのため、n 列があり、0/1 行列であると想定しています。次に例を示します。

// ...
ArrayList<IntegerVariable> all = new ArrayList<IntegerVariable>();
int n = 5; // number of rows and columns
IntegerVariable[][] rows = new IntegerVariable[n][n];
for(int i = 0; i < n; i++) {
  for(int j = 0; j < n; j++) {
    rows[i][j] = makeIntVar("rows["+i+","+j+"]", 0, 1);
    all.add(rows[i][j]);
  }
}
// convert ArrayList all to an array
model.addConstraint(eq(sum(all.toArray(new IntegerVariable[1])),1));
// ...
于 2014-12-29T06:40:33.337 に答える