Невозможно получить двойные значения из LP с помощью CPLEX

Я пытаюсь закодировать алгоритм разложения Бендера с помощью CPLEX. Чтобы убедиться, что я кодирую его правильно, я следую числовому примеру из «Методы декомпозиции в математическом программировании» А.Дж. Конеджо и др., Стр. 247.

Однако мою проблему можно сформулировать без доступа к упомянутому материалу или без знания контекста. Мне нужно решить следующую LP и получить двойные значения для ограничения fixing_x.

import cplex
x_master_value = 100.

c_toy_slave = cplex.Cplex()
types = c_toy_slave.variables.type

y = c_toy_slave.variables.add(names=["y"+str(i) for i in range(3)], lb=[0]*3, types=[types.continuous]*3)
x = c_toy_slave.variables.add(names=["x"], lb=[0], types=[types.continuous])
w = c_toy_slave.variables.add(names=["w"], lb=[0], types=[types.continuous])

cst1 = c_toy_slave.linear_constraints.add([[["y0", "y1", "x", "w"], [-1, -3, 2, -1]]],
                                    names=["cst1"], rhs=[2], senses=['L'])

cst2 = c_toy_slave.linear_constraints.add([[["y0", "y1", "x", "w"], [1, 3, -1, -1]]],
                                    names=["cst2"], rhs=[3], senses=['L'])

cst3 = c_toy_slave.linear_constraints.add([[["y2", "x"], [1, -3]]],
                                    names=["cst3"], rhs=[7/2], senses=['L'])

cst4 = c_toy_slave.linear_constraints.add([[["x"], [1]]],
                                    names=["fixing_x"], rhs=[x_master_value], senses=['E'])

c_toy_slave.objective.set_linear([("y0", -1.5), ("y1", -2), ("y2", -2), ("w", 40)])
c_toy_slave.objective.set_sense(c_toy_slave.objective.sense.minimize)

c_toy_slave.solve()

print("lambda = ", c_toy_slave.solution.get_dual_values("fixing_x"))

Но CPLEX сообщает, что не может использовать метод get_dual_values, и выводит на экран следующее сообщение: Ошибка CPLEX 1017: недоступно для задач со смешанными целыми числами. Я не знаю, как решить эту проблему, поскольку я даю не MIP, а настоящий LP.


person boring_stack_user    schedule 18.06.2019    source источник
comment
Как вы заметили, CPLEX считает вашу модель MIP, и в этом случае двойные модели недоступны. Без дополнительного контекста это трудно отследить. Например, какой тип x_master_value?   -  person Marcus Ritt    schedule 19.06.2019
comment
Хороший способ отладки моделей - записать файл lp.   -  person Erwin Kalvelagen    schedule 19.06.2019
comment
Исходный пост был отредактирован, чтобы добавить больше контекста в код. Его можно будет легко запустить, если у вас установлен CPLEX. Также значение x_master_value не определяет, является ли проблема LP или MIP. Это уменьшает пространство поиска с R ^ 5 до плоскости в R ^ 5. Также я написал файл lp, который соответствует задаче, которую я хочу решить, как LP (без целочисленных переменных).   -  person boring_stack_user    schedule 19.06.2019


Ответы (1)


Оказалось, что удаление необязательного аргумента types=[type.continuous] решило мою проблему (т.е. проблема оптимизации затем правильно распознается как LP). Если мы посмотрим на документацию для Cplex.variables.add, в нем говорится:

Если указаны типы, тип проблемы будет MIP, даже если все переменные указаны как непрерывные.

Итак, это ожидаемое поведение.

person boring_stack_user    schedule 19.06.2019