【问题标题】:cplex boolVarArray giving double valuescplex boolVarArray 给出双精度值
【发布时间】:2013-07-07 16:00:29
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    IloCplex.GetIntValue()
    

    你会得到 0 或 1。

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

    【讨论】:

    • 感谢您的回复。我正在使用 Java。正如您在输出中看到的那样,布尔变量的值非常接近 0 或 1。我的两个变量是线性的,其中四个是布尔变量。我想我应该忽略你所说的双精度值,因为它们非常接近 0 或 1。
    • 是的!正如 David Nehme 在他的回答中所说,只要它们在整数的 EpInt 范围内,一切都很好。我也赞同他的意见,即你不应该乱用 EpInt 或其他公差参数。
    • 我决定不搞乱那个参数。即使我将它设置为 0,它对我来说也不太适用。我的约束:t1 + d
    • 我真的建议用更小的东西替换那个 Integer.MaxValue。我不会在评论中详细介绍,但是你可以做得越小(虽然作为上限仍然有意义),问题就越容易解决。另外,您能否将其中一个答案标记为已接受?
    【解决方案2】:

    IloBoolVar 只是一个限制为 0 或 1 的 IloNumVar。默认情况下,0 或 1 的 0.00001 内的任何值都被视为整数。您可以通过设置参数EpInt 来更改它。该参数可以设置为零,但您正在引发性能问题。对值进行四舍五入是最佳做法。事实上,任何时候处理浮点数时,都需要注意这样的舍入问题。

    【讨论】:

    • 谢谢。这是一个很大的帮助。
    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 2020-06-02
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多