Как добавить логические ограничения в PuLP

Я пытаюсь решить FLP с помощью PuLP. Я хочу добавить логическое ограничение для значения переменной.

У меня есть LpVariable f, а C - это список LpVariables. Я хочу добавить f к ограничению проблемы, которое зависит от значений c[i].

Ниже фрагмент кода >

prob = LpProblem("The MILP problem", LpMinimize)

Добавлено первое ограничение:

prob += lpSum(c[i] for i in range (len(c))) == 2

Теперь я хочу добавить следующее ограничение:

  if`lpSum(c[i] for i in range (len(c))) > 1:
`     prob += f == 1  
  else:
      prob += f == 0


prob += lpSum(c[i] for i in range (len(c)) + f )

Теперь проблема в том, что LpVariables c[i] инициализируются с None и, следовательно, выдает ошибку при вычислении lpSum().

Я надеюсь, что я ясно. Дайте мне знать, если вам нужна помощь в понимании этого запроса, но я думаю, что данного фрагмента кода достаточно.


person Pratik Gujarathi    schedule 27.10.2015    source источник


Ответы (1)


Три пункта:

(1) Ваше первое ограничение заставляет lpsum быть равным 2, поэтому в вашем примере f всегда будет 1 - вы уверены, что ваша формулировка верна?

(2) Если операторы нельзя использовать в сочетании с lpSum, вы должны сформулировать это как фактическое ограничение.

Например, вы можете определить f как двоичную переменную и добавить это ограничение:

prob += lpSum(c[i] for i in range (len(c))) - 1 <= M*f 

где M — достаточно большое число. Затем, если f==0, у нас есть "lpsum() ‹= 1", а если f==1 у нас есть, что lpsum может быть чем угодно. Поэкспериментируйте с этим типом ограничений, чтобы заставить f вести себя так, как вы хотите.

(3) Ограничение «prob += lpSum(c[i] for i in range (len(c)) + f )» ничего не делает, если только оно не должно быть целью вашего MILP? Если это так, вы должны добавить его сразу после prob = LpProblem("Проблема MILP", LpMinimize)

Удачи

person Koen Peters    schedule 27.10.2015