Невозможное решение с избыточными ограничениями - PuLP и COIN-OR

Я работаю с моделью LP в Python, используя PuLP с CBC, Модель имеет множество ограничений, и, конечно, многие из них являются избыточными. Я покажу пример этого.

#import libraries
from pulp import LpVariable, LpProblem, LpMaximize, lpSum, LpConstraint, LpStatus, value

prob = LpProblem("test_model", LpMaximize)
set_pt=[i for i in range(100)] #set of var
var = LpVariable.dicts("var",set_pt,lowBound=0,cat='Continuous')

# The objective function is added to 'prob' first
prob += lpSum([var[i] for i in set_pt]), "f(v)"

#constraits
for i in set_pt:
     prob += LpConstraint(var[i] <= 300000), "max margin "+str(i) 
     prob += LpConstraint(var[i] <= 30000000000), "ma2 margin "+str(i) 

#solve
prob.writeLP("price_mod2.lp")
print 'solver begin'
prob.solve()

# The status of the solution is printed to the screen
print "Status:", LpStatus[prob.status]

результат этого:

solver begin
Status: Infeasible

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

я не знаю, если проблема с решателем (CBC), так что я могу использовать, может быть, CPLEX вместо этого и решить проблему избыточных ограничений, или проблема PuLP и мне нужно использовать другую библиотеку. Или, может быть, мне нужно смоделировать проблему, чтобы сделать ее доказательством избыточности.

какое-либо руководство? Спасибо!

Изменить: я пытался с открытым решателем (в Excel), используя CBC и это сработало, так что я думаю, что это должно быть проблемой с реализацией в PuLP, или, может быть, я делаю что-то не так, или, возможно, нет способа добавить избыточное ограничение в PuLP

1 ответ

Решение

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

Ваш подход (провал):

for i in set_pt:
    prob += LpConstraint(var[i] <= 300000), "max margin "+str(i) 
    prob += LpConstraint(var[i] <= 30000000000), "ma2 margin "+str(i) 

Рабочая альтернатива А (с использованием перегруженных операторов)

for i in set_pt:
    prob += var[i] <= 300000, "max margin "+str(i)
    prob += var[i] <= 30000000000, "ma2 margin "+str(i)

Рабочая альтернатива B (явное использование LpConstraint; нуждается в импорте)

for i in set_pt:
    prob += LpConstraint(var[i], LpConstraintLE, 300000), "max margin "+str(i)
    prob += LpConstraint(var[i], LpConstraintLE, 30000000000), "ma2 margin "+str(i)

Последнее больше похоже на ваш первоначальный подход. Но ваше использование не похоже на то, что ожидает функция (см. Документацию)

Другие вопросы по тегам