cplex boolVarArray给出双值

时间:2013-07-09 21:23:50

标签: mathematical-optimization linear-programming cplex integer-programming

我一直在尝试使用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

我不明白为什么我会得到双倍价值而不是布尔值。任何帮助,将不胜感激。感谢。

2 个答案:

答案 0 :(得分:1)

您没有说出您正在使用哪种语言。出于某种原因,Concert的C ++版本有

IloCplex.GetIntValue()

你会得到0或1。

Concert for Java和C#(我不知道其他语言)只有IloCplex.GetValue()。您需要将值四舍五入为0或1.我还要先检查值是否在零或一个小值内,只是为了确保您实际上是在解决MIP而不是LP。

答案 1 :(得分:1)

IloBoolVar只是一个IloNumVar,约束为0或1.默认情况下,0.00001中0或1之间的任何内容都被视为整数。您可以通过设置参数EpInt来更改此设置。该参数可以设置为零,但您正在邀请性能问题。绕过这些值是最好的做法。事实上,无论何时使用浮点数,您都需要注意这样的舍入问题。