Использование Python Pulp с матрицами - PullRequest
13 голосов
/ 11 октября 2011

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

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

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

Я хочу увеличить:

sum( x_i P_i )

subjectс ограничениями

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])

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

Ответы [ 2 ]

4 голосов
/ 06 апреля 2012

Вы можете установить 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 - это индексный набор переменных решения, а не их нижнийграницы.

0 голосов
/ 15 марта 2018

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

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')
...