问题描述
我正在尝试为 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