Проблемы с использованием границ переменных и целевой функции в C ++ CPLEX

Я пишу модель линейного программирования на C ++ без использования технологии Concert от cplex.

Я объявляю переменные и целевую функцию моей модели следующим образом:

IloModel genInst (env);

IloNumVarArray Sizes(env,N,0.25+EPS,1.0-EPS);

IloObjective Weight = IloAdd(genInst, IloMaximize(env,IloSum(Sizes));  

EPS - это небольшая константа, потому что я хочу, чтобы переменные были строго больше 0,25 и строго меньше 1,0.

Целевая функция должна просто максимизировать сумму всех переменных, но всякий раз, когда я пытаюсь это сделать, переменные в решении будут иметь значения за пределами моего ограничения (например, меньше 0,25 или слишком большие), и я не вижу никаких возможностей сохранить переменную. значения в их диапазоне.

Кто-нибудь может мне помочь? Я, наверное, ошибся, потому что это не должно быть так сложно. Спасибо вам!


person user2145167    schedule 07.03.2013    source источник
comment
Хороший способ устранения неполадок CPLEX - использовать exportModel. Проверьте границы в вашем файле .LP и посмотрите, соответствуют ли они вашим ожиданиям. Попробуйте решить проблему с помощью другого решателя, например Gurobi, и посмотрите, какие значения вы получите. Кроме того, когда вы говорите, что значения выходят за рамки вашего ограничения после решения, какие значения вы получите? Какова именно стоимость EPS?   -  person user327301    schedule 07.03.2013
comment
Спасибо, exportModel помог мне найти причину, мои ограничения всегда содержали отрицательную переменную, которая должна была быть положительной.   -  person user2145167    schedule 08.03.2013


Ответы (1)


Вот ограничивающая функция:

template<class T>
T bound_number(T n, T min, T max) {
    return std::max(std::min(n, max), min);
}
person user123    schedule 07.03.2013
comment
А еще лучше использовать std::min и std::max и не загромождать пространство идентификаторов одноразовыми макросами. - person Ben Voigt; 07.03.2013
comment
Спасибо, но я не уверен, сработает ли это, потому что это, похоже, проблема, связанная с комплексом. Границы выполнены, но всякий раз, когда я устанавливаю функцию objectiv, переменная начинает лежать за пределами границ. - person user2145167; 07.03.2013