我需要用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(),但是我没有成功。
答案 0 :(得分:2)
如果像您一样设置变量,将其作为列表中的变量对象(使用n=len(mylist)
,则很自然地使用(list comprehension):
prob += lpSum([a[i] * u[i] for i in range(n)]), "Expected Utility"
其他组件也是如此。当然,您也可以将变量保存在字典中,并遵循类似dict的访问方式。
核心思想只是使用 python的功能来收集数据,并使用纸浆的 lpSum
对其进行汇总。