powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / А кто-нибудь пользовался ILOG CPLEX
2 сообщений из 2, страница 1 из 1
А кто-нибудь пользовался ILOG CPLEX
    #36080035
frenky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Интересует как получить множители Лагранжа для целочисленной (MILP) проблемы...

Использую 11-ый CPLEX. Пытаюсь получить дуальные переменные так как описано в мануале, но иногда часть из них равна 0 (хотя они должны отличаться). Отключение пресолвера и депенденси чикера (DEPIND И PREIND) иногда помогает, но не всегда.

Подскажите, если кто-то сталкиваться с подобными проблемами
...
Рейтинг: 0 / 0
А кто-нибудь пользовался ILOG CPLEX
    #36081087
frenky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточню суть вопроса, в надежде получить пояснения специалистов...

Итак, алгоритм получения решения таков (Использую библиотеку cplex110.dll, вызываю её из Matlab-а).

1. Создаю задачу для CPLEX-а
[problemPtr, env, status] = calllib(cplexLibName, 'CPXcreateprob', EnvCPLEX, 0, 'testMilpProblem');

2. Передаю данные в проблему
status = calllib(cplexLibName, 'CPXcopylp', EnvCPLEX, problemPtr, size(A,2), size(A,1), ... fn_CPLEX_Consts('CPX_MIN'), full(f), full(b), sense, matbeg, matcnt, matind, matval, full(lb), full(ub), []);

3. Отключаю presolver и dependency checker
status = calllib(cplexLibName, 'CPXsetintparam', EnvCPLEX, fn_CPLEX_Consts('CPX_PARAM_PREIND'), 0);

status = calllib(cplexLibName, 'CPXsetintparam', EnvCPLEX, fn_CPLEX_Consts('CPX_PARAM_DEPIND'), 0);

4. Меняю тип задачи на MILP
status = calllib(cplexLibName, 'CPXchgprobtype', EnvCPLEX, problemPtr, fn_CPLEX_Consts('CPXPROB_MILP'));

5. Устанавливаю переменные типа integer (I)
variables = ones(length(lb), 1);
var_type(variables == 1) = 'I';

status = calllib(cplexLibName, 'CPXcopyctype', EnvCPLEX, problemPtr, var_type);

6. Оптимизирую mip-оптимизатором
status = calllib(cplexLibName, 'CPXmipopt', EnvCPLEX, problemPtr);

...далее проверяю статус вычислений и получаю значения переменных (X). До этого момента все отлично...

Далее для определения множителей Лагранжа
7. Фиксирую решение
status = calllib(cplexLibName, 'CPXchgprobtype', EnvCPLEX, problemPtr, fn_CPLEX_Consts('CPXPROB_FIXEDMILP'));

8. Делаю re-optimize lp-оптимизатором
status = calllib(cplexLibName, 'CPXlpopt', EnvCPLEX, problemPtr);

9. ...ну и получаю множители Лагранжа
[status, env, envProblem, dual] = calllib(cplexLibName, 'CPXgetpi', EnvCPLEX, problemPtr, pdual, 0, numrows - 1);

Вот тут и возникают проблемы, описанные выше...

Обозначения в задаче:
X - оптимизируемые переменные
f - целевая функция
lb - нижняя граница на оптимизируемые переменные
ub - верхняя граница на оптимизируемые переменные
A - левая часть ограничений
b - правая часть ограничений
sense - знаки в неравенствах

Проблемы с нулевыми множителями Лагранжа возникают например на задачах с одинаковыми коэф-ми в целевой функции (но разными по знаку)...т.е две заявки с одинаковой ценой (одна на покупку, другая на продажу)
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / А кто-нибудь пользовался ILOG CPLEX
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]