Как ограничить предмет округленным целым числом с помощью Python Pulp - PullRequest
1 голос
/ 13 июня 2019

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

Я видел ответ на этот вопрос, но я не знаю, как определить целочисленную переменную I в этом случае. Использовать мод-функцию в ограничении с использованием Python Pulp

Спасибо !!!

1 Ответ

2 голосов
/ 13 июня 2019

Рассмотрим простую ILP, которая состоит из целевой функции и ограничений на переменные:

min x1 + x2
s.t.
x1 + x2 >= 50
x1 >= 0 
x2 >= 0

Для обеспечения вашего условия вы можете добавить 2 переменные y и z и 2 ограничения:

  1. y >= x1 + x2
  2. y == 100 * j для некоторых j >= 1

и измените вашу целевую функцию на min y.

Inкод:

Оригинальная формулировка

x1 = pulp.LpVariable('x1',lowBound=0,cat=pulp.LpContinuous)
x2 = pulp.LpVariable('x2',lowBound=0,cat=pulp.LpContinuous)

prob1 = pulp.LpProblem('example1',pulp.LpMinimize)
# obj
prob1+= 5*x1 + 10*x2
# constraints
prob1+= x1 + x2 >= 50

prob1.solve() 
print(pulp.value(prob1.objective)) #250

Конвертированная

y = pulp.LpVariable('y',lowBound=0, cat=pulp.LpContinuous)
z = pulp.LpVariable('z',lowBound=1, cat=pulp.LpInteger)

prob2 = pulp.LpProblem('example2',pulp.LpMinimize)
# obj
prob2+= y
# constraints
prob2+= y >= 5*x1 + 10*x2
prob2+= y == 100 * z
prob2+= x1 + x2 >= 50

prob2.solve()
print(pulp.value(prob2.objective)) #300
...