我正在使用 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。
我正在使用 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。
然后,您可以使用 ArrayList(“all”)将所有 IntegerVariables 收集到一个列表中,然后将约束添加到“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));
// ...