PuLP - 为什么不能对 UpBounds 使用生成器/列表表达式? “类型错误:必须是实数,而不是列表” 产量:

问题描述

我正在尝试为 Pulp 中的问题编写一组变量 (x1,x2...xn) 的上限。我已经有了要使用的上限列表。问题在于生成器或列表表达式会产生错误

UpBounds=[370.94,490.81,1582.52,3681.33,213.85,61.15,66.09,55.32,55.94,147.13,17.02,27.09,155.67,51.61,166.18,61.93,66.27,46.57,25.33,69.86,126.68,12.95,65.03,121.75,103.71,44.07,46.71,19.99,44.12,91.54,59.54,24.6,42.84,135.04,30.91,61.05,26.5,52.74,11.88,4.21,111.1,187.04,370.94,687.89,205.43,23993.51,1515.28,275.62,127.21,130.46,757.46,118.15,137.27,495.62,1240.92,260.85,637.26,15.1,415.94,462.88,118.33,270.73,83.52,499.7,433.21,136.33,24.22,484.35,4346.76,82.92,26.64,2901.47,6155.17,78.6,0.0,18654.02,28.97,7496.19,10.0,182.07,31.01,127.26,55.77,206.89,98.65,200.0,29.18,200.37,21.04,199.75]

x = pl.LpVariable.matrix('x',range(0,96),[up for up in UpBounds])

>>>TypeError: must be real number,not list

numpy 数组也不起作用。

令人讨厌的是,这在 linprog 中没有问题,它应该是次等的求解器,例如

bounds=[(0,up) for up in UpBounds)]

有谁知道我如何写上面的,即每个变量 x_n 都有自己的上限 UpBound[i​​]?

编辑

问题是当我尝试解决即 prob.solve() 时,它会抛出一个错误,指向上限:

>>>(name,variable.upBound))
TypeError: must be real number,not list

解决的模型很简单:

prob += pl.lpSum([x[i]*-constants[i] for i in range(len(constants))])

解决方法

啊,因此我们回到 SO 指南,即放入最小可重现示例。 :)

无论如何,最简单的解决方案是将上限作为约束添加,这(我很确定)在求解器眼中是等效的操作。有几种方法可以做到这一点。这是使用您的上限列表的一个:

# pulp upper bounds on dv

import pulp

ub_list = [1,2,3]

prob = pulp.LpProblem("UB setter",pulp.LpMaximize)

X = pulp.LpVariable.matrix('X',range(3),lowBound=0,cat='Continuous')

for idx in range(3):
    prob += X[idx] <= ub_list[idx]

prob += pulp.lpSum(X[i] for i in range(3))

prob.solve()
pulp.LpStatus[prob.status]

for idx in range(3):
    print(f'X[{idx}]: {X[idx].varValue}')

产量:

X[0]: 1.0
X[1]: 2.0
X[2]: 3.0