Линейное программирование на PuLP с аргументами разного размера

#python #linear-programming #pulp

#python #линейное программирование #pulp

Вопрос:

Мне нужно решить задачу линейного программирования на 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:

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

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

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

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