2013-03-07 2 views
0

Я пишу модель линейного программирования на C++, не соглашаясь с технологией концерта от cplex.Проблемы с использованием ограничений переменных и целевой функции в C++ 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 или слишком большие), и я не вижу никаких возможностей для сохранения значений переменных в их диапазоне.

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

+0

Хороший способ устранения CPLEX заключается в использовании exportModel. Проверьте границы в вашем .LP-файле и посмотрите, соответствуют ли они вашим ожиданиям. Попробуйте решить проблему с помощью другого решателя, такого как Gurobi, и посмотрите, какие значения вы получите. Кроме того, когда вы говорите, что значения вне вашего ограничения после того, как вы решите, какие значения вы получите? Что такое значение EPS? – raoulcousins

+0

Спасибо, exportModel помог мне найти причину, мои ограничения всегда содержали отрицательную переменную, которая должна была быть положительной. – user2145167

ответ

0

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

template<class T> 
T bound_number(T n, T min, T max) { 
    return std::max(std::min(n, max), min); 
} 
+1

Еще лучше, используйте 'std :: min' и' std :: max' и не загромождайте пространство идентификаторов одноразовыми макросами. –

+0

Я отредактирую свой ответ, чтобы добавить это. Спасибо, Бен. –

+0

Спасибо, но я не уверен, что это сработает, потому что это похоже на специфическую проблему cplex. Оценки выполняются, но всякий раз, когда я устанавливаю функцию objectiv, переменная начинается за пределами границ. – user2145167

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