#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
— для их суммирования.