Минимизировать более одной переменной

Моя модель начинается так:

Minimize
 +T

\* Constraints *\
Subject To
 +T -Ta >= 0 //T >= Ta
 +T -Tb >= 0 //T >= Tb
 +T -Tc >= 0 //and so on
 +T -Td >= 0
 +T -Te >= 0

Переменные Tx имеют только нижнюю границу, без верхней границы. Что происходит, так это то, что CPLEX правильно определяет критическую переменную, но все остальные оказываются «растянутыми» - например, когда Ta >= 1000 и Tb >= 10, Tb также будут 1000.

Я хочу сказать решателю: «Свернуть T, а также минимизировать все Tx переменные, но только если это не повлияет на T отрицательно». Как бы я это сделал?


person Maciej Stachowski    schedule 24.11.2013    source источник


Ответы (1)


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

Один из способов сделать это - включить другие переменные (ваши переменные Tx) также в целевую функцию.

Например, вы можете сделать свой Obj следующим образом:

Minimize T + Ta + Tb + Tc + Td + Te

Это не повлияет отрицательно на значение вашей основной переменной T.

Чаще всего принято делать что-то вроде:

Minimize
     T + epsilon(Ta + Tb + Tc + Td + Te)

где эпсилон - небольшое неотрицательное число (скажем, 1e-5). Поскольку CPLEX (или любой решатель) не хочет «платить цену», он сделает каждую Tx переменную (и, следовательно, T) настолько большой, насколько это необходимо. Tb будет 10, а не 1000, как в исходном решении.

Сообщая об оптимальном решении, обязательно указывайте значение переменной T, а не значение Objective function.

person Ram Narasimhan    schedule 25.11.2013