我在打印变量x的正确值时遇到问题。
我正在尝试使用cplex来解决模型问题。我正在使用c / c ++。
我得到了变量的值,如我所描述的:Problems with function getValue(s) cplex c++
当我写下面的行时:
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (w[i][j] != 0) {
for (int k = 0; k < n; k++) {
for (int m = 0; m < n; m++) {
if ( (k != m && k != j && m != i) or (k == m) ) {
mono.cplex.getValue(mono.x[i][j][k][m],mono._x[i][j][k][m]);
cout << "x["<<i+1<<"]["<<j+1<<"]["<<k+1<<"]["<<m+1<<"] = " << mono._x[i][j][k][m] << endl;
}
}
}
}
}
}
所有变量x都显示为零。
由于我有以下约束,所以不可能。
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (w[i][j] != 0) {
IloExpr r_1a(env);
for (int k = 0; k < n; k++) {
for (int m = 0; m < n; m++) {
if (k != m && k != j && m != i) {
r_1a += mono.x[i][j][k][m];
}
if (k == m) {
r_1a += mono.x[i][j][k][m];
}
}
}
IloRange ctr;
ctr = (1 <= r_1a <= 1);
mono.constraints.add(ctr);
r_1a.end();
}
}
}
当我将模型导出到lp文件时,我可以调用cplex来直接解析模型(使用命令读取文件并优化文件)。然后,我可以要求x值,我看到,正如预期的那样,一些x变量等于1.
为什么会这样?
答案 0 :(得分:0)
您似乎对如何使用getValue
方法感到困惑(请参阅文档here)。它返回一个IloNum
,您实际上是通过以下语句将其丢弃:
mono.cplex.getValue(mono.x[i][j][k][m],mono._x[i][j][k][m]);
第二个参数应该是一个解决方案池索引(它是可选的)。
您可能想做的事情如下:
mono._x[i][j][k][m] = mono.cplex.getValue(mono.x[i][j][k][m]);
或者,您可以使用getValues方法查询批量解决方案值。也许这就是你打算做的,但忘了键入“s”(即你输入getValue
代替getValues
)?
最后,请查看integer values, integrality tolerance, and round-off上的文档。