|
|
|
А кто-нибудь пользовался ILOG CPLEX
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Интересует как получить множители Лагранжа для целочисленной (MILP) проблемы... Использую 11-ый CPLEX. Пытаюсь получить дуальные переменные так как описано в мануале, но иногда часть из них равна 0 (хотя они должны отличаться). Отключение пресолвера и депенденси чикера (DEPIND И PREIND) иногда помогает, но не всегда. Подскажите, если кто-то сталкиваться с подобными проблемами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2009, 14:56:18 |
|
||
|
А кто-нибудь пользовался ILOG CPLEX
|
|||
|---|---|---|---|
|
#18+
Уточню суть вопроса, в надежде получить пояснения специалистов... Итак, алгоритм получения решения таков (Использую библиотеку 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 - знаки в неравенствах Проблемы с нулевыми множителями Лагранжа возникают например на задачах с одинаковыми коэф-ми в целевой функции (но разными по знаку)...т.е две заявки с одинаковой ценой (одна на покупку, другая на продажу) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2009, 09:28:10 |
|
||
|
|

start [/forum/topic.php?fid=16&fpage=120&tid=1344377]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
13ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
18ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 272ms |

| 0 / 0 |
