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

在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操作转化为线性约束,具体代码如下:

  1. 创建辅助变量:为每个flow_variable实例定义辅助变量,用来存储min(flow_variable, 0)的结果
  2. 添加线性约束:限制辅助变量同时不大于原变量和0
  3. 累加辅助变量:辅助变量是线性类型,可以直接添加到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:43:17