1

У меня есть IloBoolVarArray в проблеме MIP. Когда решатель закончил, я анализирую эти переменные на double, но иногда я получаю значения очень малые, как 1.3E-008 вместо 0. Вопрос: почему? Это только проблема синтаксического анализа? Внутри решатель использовал это значение, так что результат не заслуживает доверия?Проблемы с анализом от IloBoolVarArray до Bool в CPLEX

Большое спасибо.

+0

Зачем вам нужно преобразовать значение boolean в double? Вы пытались сравнить логическое значение с 'IloTrue' или' IloFalse'? – vcp

+0

Это эксперимент, потому что моя целевая функция умножает IloNumVarArray с IloBoolVarArray, и я получаю некоторые проблемы с точностью. Я хочу найти проблему – jonango

ответ

1

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, например, вы можете не получить хорошие результаты, даже с небольшими экземплярами.

+0

Так что в некоторых случаях я бы имел операции как 236.212 * 10^-6? Я работаю со многими значениями (но не большими данными), но когда я проверял решение, есть ошибки точности около 1E-2, поэтому я предполагал, что точность точности накапливается вдоль операций. Огромное спасибо. – jonango

Смежные вопросы