PuLP - Why cant you use a generator/list expression for UpBounds? "TypeError: must be real number, not list"

PuLP - Why cant you use a generator/list expression for UpBounds? "TypeError: must be real number, not list"

我正在尝试为 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, 490.81, 687.89, 205.43, 1582.52, 3681.33, 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, 0.0, 18654.02, 28.97, 0.0, 0.0, 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), 0, [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