在 CPLEX 中从 IloBoolVarArray 解析到 Bool 的问题
Problems to parse from IloBoolVarArray to Bool in CPLEX
我在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 设计为工作的属性域。 例如,如果您尝试使用它来解决密码学问题,则可能无法获得良好的结果,即使使用小型实例也是如此。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- 写入向量<向量<bool>>
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 矢量<bool> arr 重置问题
- 在用户定义的类中,Bool 作为函数 c++ 出现问题
- 在 CPLEX 中从 IloBoolVarArray 解析到 Bool 的问题
- 在 C++ 头文件中使用 tuple<sf::Texture、bool> 时出现问题
- 使用"for(auto&e : cont)"安全吗?矢量有什么问题<bool>?
- cython 问题:"bool"不是类型标识符
- c++中的Bool数组问题
- GCC 问题 - 从 'void (*)(MyObject*, bool)' 到 'const void*' 的转换无效