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
Здесь bad_value может быть установлен в 0, даже если решение CPLEX имеет эффективное значение 1. Это потому, что CPLEX может иметь значение 0.999999, которое будет усечен 0. Второе задание будет надежно хранить решение.
В последней версии CPLEX вы можете установить значение EpInt равным 0, которое сделает CPLEX учитывающим только 0.0 и 1.0 как двоичные. Если вам действительно нужны точные значения 0 или 1, то вам следует помнить о доменах CPLEX, предназначенных для работы. Если вы пытаетесь использовать его для решения cryptology problems, например, вы можете не получить хорошие результаты, даже с небольшими экземплярами.
Зачем вам нужно преобразовать значение boolean в double? Вы пытались сравнить логическое значение с 'IloTrue' или' IloFalse'? – vcp
Это эксперимент, потому что моя целевая функция умножает IloNumVarArray с IloBoolVarArray, и я получаю некоторые проблемы с точностью. Я хочу найти проблему – jonango