You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 09:24:05