Линейное программирование на PuLP с аргументами различного размера - PullRequest
1 голос
/ 13 апреля 2019

Мне нужно решить задачу линейного программирования на python и наткнулся на PuLP.Однако у меня есть некоторые сомнения относительно того, как я могу простым способом решить проблему с различным количеством входов.

У меня есть следующие массивы, все с одинаковыми размерами:
a = [a0, a1, ..., an] (неизвестные переменные)

u = [u0, u1, ..., un]
v = [v0, v1, ..., vn]
(эти значения известны)

и я хочу максимально: a0 * u0 + a1 *u1 + ... + an * un
в зависимости от:
a0 + a1 + ... + an = 1
a0 * v0 + a1 * v1 + ... + an * vn> = 0

Я могу сделать это с ограниченным числом переменных (например, 3):

prob = LpProblem("Decision",LpMaximize)

a = list()
a.append(pulp.LpVariable("a0", 0, 1))
a.append(pulp.LpVariable("a1", 0, 1))
a.append(pulp.LpVariable("a2", 0, 1))
u = np.array([1, 3, 2])
v = np.array([1, -1, 0])

prob += a[0]*u[0] + a[1]*u[1] + a[2]*u[2], "Expected Utility"

prob += a[0]+a[1]+a[2] == 1, "PercentagesSum"
prob += a[0]*v[0] + a[1]*v[1] + a[2]*v[2] >= 0, "MinimalOutcome"

Однако я хочу иметь динамическое число уф, я думаюрешение может заключаться в использовании LpVariable.dicts () , но у меня ничего не получилось.

1 Ответ

2 голосов
/ 13 апреля 2019

Если ваши переменные настроены так же, как вы, в качестве объектов-переменных в списке (с n=len(mylist), вполне естественно использовать что-то вроде ( понимание списка ):

prob += lpSum([a[i] * u[i] for i in range(n)]), "Expected Utility"

То же самое относится и к другим компонентам. Конечно, вы также можете хранить свои переменные в словаре и следовать диктовому доступу.

Основная идея состоит в том, чтобы просто использовать возможности python чтобы собрать ваши данные и целлюлозные массы lpSum, чтобы подвести их.

...