PuLP使用列表/生成式设置UpBounds报must be real number错误如何解决
PuLP为多变量设置独立上界的解决方法
报错原因
PuLP的pl.LpVariable.matrix方法的第四个参数要求传入单个实数值,作为该矩阵所有变量的统一上界,不支持直接传入列表为每个变量分配独立上界。你传入列表后PuLP会把整个列表赋值给每个变量的upBound属性,后续求解时自然会触发「需要实数而非列表」的类型错误,这个接口设计和scipy的linprog的bounds参数逻辑不同,不能直接类比写法。
解决方法
方法1:列表推导式逐个创建变量(最推荐)
直接用列表推导式为每个变量单独指定上下界,写法和你熟悉的linprog的bounds逻辑一致,原有目标函数代码不需要做任何修改:
UpBounds=[370.94, 490.81, 1582.52, 3681.33, 213.85, ...] # 你的完整上界列表 x = [pl.LpVariable(f'x_{i}', lowBound=0, upBound=UpBounds[i]) for i in range(96)]
如果你的上界存储在numpy数组中,赋值时用float()转换为Python原生数值即可避免类型兼容问题:
x = [pl.LpVariable(f'x_{i}', lowBound=0, upBound=float(UpBounds[i])) for i in range(96)]
方法2:先创建变量再批量修改上界
如果你一定要用matrix方法创建变量,可以先设置无统一上界,之后循环逐个赋值上界:
# 先创建所有变量,上界暂时设为None(无上限) x = pl.LpVariable.matrix('x', range(0,96), lowBound=0, upBound=None) # 循环为每个变量赋值专属上界 for idx, bound in enumerate(UpBounds): x[idx].upBound = bound
内容的提问来源于stack exchange,提问作者beginner_python
相关产品推荐
相关产品推荐

