Python Pulp с использованием матриц

Я все еще очень новичок в Python, спустя годы и годы Matlab. Я пытаюсь использовать Pulp для создания целочисленной линейной программы.

Учитывая массив чисел:

{P[i]:i=1...N}

Я хочу максимизировать:

sum( x_i P_i )

с учетом ограничений

A x <= b
A_eq x = b_eq

и с ограничениями (на основе вектора)

LB <= x <= UB

Однако в пульпе я не вижу, как правильно выполнять векторные объявления. Я использовал:

RANGE = range(numpy.size(P))
x = pulp.LpVariable.dicts("x", LB_ind, UB_ind, "Integer")

где я могу вводить только отдельные границы (так что только 1 номер).

prob = pulp.LpProblem("Test", pulp.LpMaximize)
prob += pulp.lpSum([Prices[i]*Dispatch[i] for i in RANGE])

и для ограничений, действительно ли мне нужно делать эту строку в строке? Кажется, что я чего-то не хватает. Я был бы признателен за помощь. В документации рассматривается короткий пример. Число переменных в моем случае составляет несколько тысяч.

Ответ 1

Вы можете установить параметры lowBound и upBound на переменные после инициализации. Вы можете создать массив переменных с помощью

LB[i] <= x[i] <= UB[i]

со следующим кодом.

x = pulp.LpVariable.dicts("x", RANGE,  cat="Integer")
for i in x.viewkeys():
     x[i].lowBound = LB_ind[i]
     x[i].upBound = UB_ind[i]

Второй параметр для LpVariable.dict - это набор индексов переменных решения, а не их нижние границы.

Ответ 2

По первому вопросу вы можете сделать это следующим образом в другой задаче.

students = range(96)
group = range(24)

var = lp.LpVariable.dicts("if_i_in_group_j", ((i, j) for i in students for j in group),cat='binary')