在PuLP上使用可变大小参数进行线性编程

时间:2019-04-13 16:36:24

标签: python linear-programming 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"

但是我希望能够获得动态数量的u.v.,我认为解决方案可能是使用 LpVariable.dicts(),但是我没有成功。

1 个答案:

答案 0 :(得分:2)

如果像您一样设置变量,将其作为列表中的变量对象(使用n=len(mylist),则很自然地使用(list comprehension):

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

其他组件也是如此。当然,您也可以将变量保存在字典中,并遵循类似dict的访问方式。

核心思想只是使用 python的功能来收集数据,并使用纸浆的 lpSum对其进行汇总。