我一直在尝试使用 CPLEX Java 实现 ILP,并且长期以来一直被一个问题困扰。以下是 ILP 的几个变量:
IloIntVar above = new IloIntVar[numRect][];
IloIntVar below = new IloIntVar[numRect][];
IloIntVar left = new IloIntVar[numRect][];
IloIntVar right = new IloIntVar[numRect][];
for (int i = 0; i < numRect; i++) {
above[i] = cplex.boolVarArray(numRect);
below[i] = cplex.boolVarArray(numRect);
left[i] = cplex.boolVarArray(numRect);
right[i] = cplex.boolVarArray(numRect);
}
numRect 的值为 1。在程序结束时我输出这些值:
for (int i = 0; i < numRect; i++) {
for (int j = i + 1; j < numRect; j++) {
System.out.println(cplex.getValue(left[i][j]));
System.out.println(cplex.getValue(right[i][j]));
System.out.println(cplex.getValue(above[i][j]));
System.out.println(cplex.getValue(below[i][j]));
System.out.println(cplex.getValue(left[i][j]) +
cplex.getValue(right[i][j]) +
cplex.getValue(above[i][j]) +
cplex.getValue(below[i][j]));
}
}
这是我得到的输出:
0.0
0.0
9.313225750491594E-10
0.9999999990686774
1.0
我不明白为什么我得到的是双值而不是布尔值。任何帮助,将不胜感激。谢谢。
IloBoolVar 只是一个限制为 0 或 1 的 IloNumVar。默认情况下,0 或 1 的 0.00001 以内的任何值都被视为整数。您可以通过设置参数来更改它EpInt http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r2/index.jsp?topic=/ilog.odms.cplex.help/Content/Optimization/Documentation/CPLEX/_pubskel/CPLEX974.html。该参数可以设置为零,但会引发性能问题。对值进行四舍五入是最佳实践。事实上,任何时候使用浮点数,都需要注意此类舍入问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)