gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:30:37 26 4
gpt4 key购买 nike

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

非常感谢。

最佳答案

CPLEX 在内部处理 double float 据。它有一个公差参数 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 旨在工作的域。如果你想用它来解决 cryptology problems例如,即使实例很小,您也可能得不到好的结果。

关于c++ - 在 CPLEX 中从 IloBoolVarArray 解析到 Bool 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35904947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com