约束choco

时间:2014-12-28 11:22:52

标签: java constraint-programming choco

我正在使用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。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你想确保完整矩阵的总和等于1.

然后你可以使用ArrayList(&#34; all&#34;)将所有IntegerVariables收集到一个列表中,然后向&#34; all&#34;添加一个约束。您的示例不完整,例如列数,所以我假设有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));
// ...