Когда вы запускаете prob += lpSum([x1, x3]) < 2
, вы получаете следующую ошибку:
Traceback (последний вызов был последним): файл "xyz.py", строка 13, в prob + = lpSum ([x1, x3]) <2 TypeError: '<' не поддерживается между экземплярами 'LpAffineExpression' и 'int' </p>
Это пакет целлюлозы, сообщающий, что вы не можете добавлять строгие неравенства, что являетсяСтандартное требование в решателях оптимизации.Поскольку все ваши переменные имеют двоичное значение, <2
совпадает с <=1
, и внесение этого изменения порадует решателя:
prob += lpSum([x1, x3]) <= 1
prob.solve()
print(x1.value(), x2.value(), x3.value(), x4.value())
# 0.0 1.0 1.0 0.0
Так что теперь вы получаете другое решение с тем же целевым значениемиз 3 (x2 = 1 и x3 = 1).
Если вы хотите вывести все возможные решения, вы можете использовать цикл, чтобы продолжать добавлять ограничения, запрещающие оптимальное решение, пока не изменится оптимальное целевое значение:
from pulp import *
x1 = pulp.LpVariable('x1', cat=LpBinary)
x2 = pulp.LpVariable('x2', cat=LpBinary)
x3 = pulp.LpVariable('x3', cat=LpBinary)
x4 = pulp.LpVariable('x4', cat=LpBinary)
prob = pulp.LpProblem('x1+x2+2*x3+x4', pulp.LpMaximize)
prob += lpSum([x1, x2, 2*x3, x4])
prob += lpSum([x1, x2, x3, x4]) == 2
prob.solve()
print(x1.value(), x2.value(), x3.value(), x4.value())
opt = prob.objective.value()
while True:
prob += lpSum([x.value() * x for x in [x1, x2, x3, x4]]) <= 1 + 1e-6
prob.solve()
if prob.objective.value() >= opt - 1e-6:
print(x1.value(), x2.value(), x3.value(), x4.value())
else:
break # No more optimal solutions
Это дает ожидаемый результат:
# 1.0 0.0 1.0 0.0
# 0.0 1.0 1.0 0.0
# 0.0 0.0 1.0 1.0