在 CPLEX 中从 IloBoolVarArray 解析到 Bool 的问题

Problems to parse from IloBoolVarArray to Bool in CPLEX

本文关键字:Bool 问题 CPLEX 中从 IloBoolVarArray      更新时间:2023-10-16

我在MIP问题中有一个IloBoolVarArray。求解器完成后,我将此变量解析为double但有时我得到的值非常小,如 1.3E-008 而不是 0。我的问题是:为什么?这只是解析问题吗?求解器在内部使用了这个值,所以结果不可信吗?

多谢。

CPLEX 在内部处理双精度浮点数据。 它有一个公差参数 EpInt。 如果变量x具有值

0 <= x <= EpInt, or
1-EpInt <= x <= 1

然后,CPLEX 将该值视为二进制值。 EpInt 的缺省值为 10^-6,因此您看到的解值 10^-8 与 CPLEX 的缺省行为一致。 除非确实需要精确的整数值,否则在从 CPLEX 拉取解时应考虑到这一点。 在C++你可以做的一件特别糟糕的事情是

IloBoolVar x(env);
// ...
cplex.solve();
int bad_value = cplex.getValue(x); // BAD
int ok_value = cplex.getValue(x) + 0.5; // OK

在这里,即使 CPLEX 解决方案的有效值为 1,bad_value也可以设置为 0。 这是因为 CPLEX 的值可能为 0.999999,该值将被截断为 0。 第二个分配将可靠地存储解决方案。

在最新版本的 CPLEX 中,您可以将 EpInt 设置为 0,这将使 CPLEX 仅将 0.0 和 1.0 视为二进制。 如果确实需要 0 或 1 的精确值,则应记住 CPLEX 设计为工作的属性域。 例如,如果您尝试使用它来解决密码学问题,则可能无法获得良好的结果,即使使用小型实例也是如此。