Ограничение Pulp add, что хотя бы одно LpAffineExpression равно единице - PullRequest
0 голосов
/ 19 декабря 2018

Скажем, у меня есть модель PuLP, определенная следующим образом: model = pulp.LpProblem('',pulp.LpMaximize)

И я добавил целевую функцию (это не имеет значения)

Теперь у меня есть список LpAffineExpressionобъекты: lps = [l1, l2, l3, ...]

Я хочу добавить в модель ограничение, которое один из этих LpAffineExpression оценивает как 1. Как бы я это сделал?

По сути то, что я ищуэто синтаксически правильный способ сделать следующее:

model += (l1 == 1 OR l2 == 1 OR l3 == 1 OR ...)

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

Другими словами, я ищу способ сгруппировать набор LpAffineExpression в модель, чтобы был выполнен только один.

1 Ответ

0 голосов
/ 19 декабря 2018

В линейном или целочисленном программировании "ИЛИ" нет.Однако вы можете использовать двоичные переменные для имитации такой конструкции ИЛИ.(Или переменные SOS1, если большие M нежелательны; я не уверен, в какой степени Pulp поддерживает переменные SOS1).

Идея такова:

1 - M * (1-δ(i)) <= L(i) <= 1 + M * (1-δ(i)) 
sum(i, δ(i)) >= 1 
δ(i) ∈ {0,1}
  • Очевидно, L(i) your l1,l2,l3,...
  • δ(i) - двоичная переменная, указывающая, является ли L(i)=1.У нас есть δ(i)=1 ⇒ L(i)=1.
  • Константы M могут быть установлены для нижних и верхних границ L(i).
...