在Gurobi的LinExpr中使用min_函数报错的技术咨询
Gurobi使用min_函数报错的解决办法
问题背景
想要用Gurobi内置的min_函数实现变量与0的最小值累加,但调用时触发错误,无法将min_的结果添加到线性表达式中。
已导入的库:
import gurobipy as gp from gurobipy import quicksum, min_
编写的表达式代码:
expr = gp.LinExpr(0) for location in locations: for time in range(time_range): expr.add(min_(flow_variable[location, time], constant=0))
触发的错误信息:
File "src\gurobipy\linexpr.pxi", line 212, in gurobipy.LinExpr.add
gurobipy.GurobiError: Unsupported type (<class 'gurobipy.GenExprMin'>) for LinExpr addition argument
原因
gp.LinExpr仅支持存储线性表达式,而min_()生成的是非线性的广义表达式(GenExprMin类型),两者不兼容。Gurobi的min_函数并非直接计算最小值,而是需要通过辅助变量和约束来间接实现非线性逻辑。
解决步骤
要实现“取变量与0的最小值并累加”的需求,需要将非线性的min操作转化为线性约束,具体代码如下:
- 创建辅助变量:为每个
flow_variable实例定义辅助变量,用来存储min(flow_variable, 0)的结果 - 添加线性约束:限制辅助变量同时不大于原变量和0
- 累加辅助变量:辅助变量是线性类型,可以直接添加到
LinExpr中
import gurobipy as gp from gurobipy import quicksum # 假设已初始化模型model和变量flow_variable model = gp.Model() flow_variable = model.addVars(locations, time_range, name="flow") # 1. 定义辅助变量 aux_min = model.addVars(locations, time_range, name="aux_min") # 2. 添加约束,确保aux_min等于min(flow_variable, 0) for loc in locations: for t in range(time_range): # 约束1:辅助变量不大于原变量 model.addConstr(aux_min[loc, t] <= flow_variable[loc, t]) # 约束2:辅助变量不大于0 model.addConstr(aux_min[loc, t] <= 0) # 3. 构建线性表达式(直接累加辅助变量) expr = gp.LinExpr(0) for loc in locations: for t in range(time_range): expr.add(aux_min[loc, t]) # 如果是用于目标函数,可简化为: # model.setObjective(quicksum(aux_min[loc, t] for loc in locations for t in time_range), gp.GRB.MINIMIZE)
内容的提问来源于stack exchange,提问作者whitepanda
相关产品推荐
相关产品推荐

