我发现Choco solver作为使用Java的约束编程软件。我想更多地了解它。我做了一些基本的例子。但现在我想尝试更复杂的东西(Pritsker项目调度算法),我需要你的帮助。为了进步,我必须了解如何将约束放在矩阵变量的行上。确切地说,我需要保持行的总和等于1(任务仅启动一次)。我尝试过但不成功。你能帮忙吗?我确实使用Choco 2.1.5我的矩阵如下:
int n = 10; // projects
int m = 12; // time horizon in months
IntegerVariable[][] x = new IntegerVariable[n][m];
int i, j;
for (i = 0; i < n; i++){
for (j = 0; j < m; j++){
x[i][j] = Choco.makeIntVar("x_" + i +"_" + j, 0, 1, Options.V_ENUM);
model.addVariable(x[i][j]);
}
}
答案 0 :(得分:1)
您应首先将变量定义为rows
和columns
。
然后,您可以使用this文档继续。这样的事情可能会有所帮助:
IntegerVariable[][] rows;
int n; //number of rows
for(int i=0; i<n; i++)
model.addConstraint(eq(sum(rows[i], 1));
答案 1 :(得分:0)
要在行上添加约束,应转置矩阵并将约束应用于行:
transposed = ArrayUtils.transpose(x);
for(int i=0; i<n; ++i){
model.sum(transposed[i], "=", 1);
}