使用列表推导式创建Gurobi约束失败,求助批量创建方法
解决Gurobi批量添加约束的TypeError问题
错误原因
你用addConstrs()时的参数格式不对:
addConstr()是单约束接口,接受lhs, sense, rhs三个位置参数;- 但
addConstrs()是批量接口,它需要的是一个生成完整约束的迭代器(每个元素是lhs == rhs这类表达式),或者配合循环变量传入对应参数,不能直接把所有lhs打包成列表再单独传sense和rhs,这会导致参数数量超出函数预期,触发TypeError。
另外你原代码里的test_list[i]在循环外,i未定义,也会引发错误。
正确写法
方法1:用生成器表达式(推荐)
先把所有决策变量整理到一个列表里简化代码,再通过生成器逐个生成约束表达式:
# 把所有decision变量存入列表,避免重复书写 decision_vars = [0_decision, 1_decision, 2_decision, 3_decision, 4_decision, 5_decision, 6_decision] # 批量添加约束 m.addConstrs( (sum(var[i] for var in decision_vars) == test_list[i] for i in range(500)) )
方法2:使用addConstrs的循环参数语法
也可以直接指定lhs、sense、rhs,最后跟上循环变量:
decision_vars = [0_decision, 1_decision, 2_decision, 3_decision, 4_decision, 5_decision, 6_decision] m.addConstrs( sum(var[i] for var in decision_vars), GRB.EQUAL, test_list[i], for i in range(500) )
关键说明
- 两种写法都能批量生成500个约束,效率和手动添加一致但代码简洁;
- 用列表整理决策变量不仅简化代码,也方便后续维护(比如增减变量只需修改列表)。
内容的提问来源于stack exchange,提问作者beginnerprogrammer
相关产品推荐
相关产品推荐

