Gurobi 是一款高效的商业优化求解器,支持多种编程语言接口(Python、Java、C++ 等),主要用于解决线性规划、整数规划、二次规划等优化问题。以下是 Gurobi 软件的核心用法指南,以最常用的 Python 接口 为例进行说明。
一、Gurobi 基本工作流程
使用 Gurobi 求解优化问题的核心步骤可概括为:
安装与激活:安装软件并激活许可证
构建模型:定义决策变量、目标函数和约束条件
配置参数:设置求解时间、精度等参数(可选)
执行求解:调用求解器运行模型
分析结果:提取最优解或诊断求解失败原因
二、详细操作步骤
1. 安装与环境配置
(1)获取许可证
学术用户可在 Gurobi 官网 申请免费学术许可证
商业用户需购买许可证
激活许可证:通过命令行运行 grbgetkey <许可证密钥>
(2)安装求解器与 Python 接口
下载并安装 Gurobi 求解器(对应操作系统版本)
安装 Python 接口:
pip install gurobipy
3)验证安装
python
运行
import gurobipy as gp
print("Gurobi 版本:", gp.__version__) # 输出版本号即安装成功
2. 构建优化模型(核心步骤)
以一个简单的 生产优化问题 为例:某工厂生产 A、B 两种产品,A 每件利润 3 元,需 2 小时机器时间和 1kg 原料;B 每件利润 4 元,需 1 小时机器时间和 2kg 原料。每天机器时间上限 10 小时,原料上限 8kg。如何安排生产使利润最大?
(1)初始化模型
python
运行
import gurobipy as gp
from gurobipy import GRB
# 创建模型对象(参数为模型名称)
model = gp.Model("production_optimization")
(2)定义决策变量
使用 addVar() 方法定义变量,需指定变量类型、上下界等:
python
运行
# 定义变量:x为A产品产量,y为B产品产量(均为非负整数)
x = model.addVar(
name="ProductA", # 变量名称(用于日志和结果查看)
vtype=GRB.INTEGER, # 变量类型:INTEGER(整数)、CONTINUOUS(连续)、BINARY(0-1)
lb=0 # 下界(默认为0,非负变量可省略)
)
y = model.addVar(name="ProductB", vtype=GRB.INTEGER, lb=0)
(3)定义目标函数
使用 setObjective() 方法设置目标,需指定目标表达式和优化方向:
python
运行
# 目标函数:最大化总利润(3x + 4y)
model.setObjective(3 * x + 4 * y, sense=GRB.MAXIMIZE) # GRB.MAXIMIZE(最大化)或 GRB.MINIMIZE(最小化)
(4)添加约束条件
使用 addConstr() 方法添加约束:
python
运行
# 约束1:机器时间限制(2x + y ≤ 10)
model.addConstr(2 * x + y <= 10, name="machine_time_constraint")
# 约束2:原料限制(x + 2y ≤ 8)
model.addConstr(x + 2 * y <= 8, name="material_constraint")
3. 配置求解参数(可选)
通过 setParam() 方法设置求解参数,常用参数包括:
python
运行
# 设置求解时间上限(秒)
model.setParam("TimeLimit", 60)
# 设置混合整数规划的最优性差距(如 1e-4 表示 0.01%)
model.setParam("MIPGap", 1e-4)
# 关闭求解日志(0=关闭,1=简要,2=详细)
model.setParam("OutputFlag", 1)
4. 执行求解
调用 optimize() 方法启动求解器:
python
运行
model.optimize() # 执行求解
5. 分析求解结果
根据求解状态(model.Status)处理结果:
python
运行
# 判断求解状态
if model.Status == GRB.OPTIMAL:
# 输出最优解
print(f"最优利润: {model.ObjVal} 元")
print(f"A产品产量: {x.X} 件") # .X 表示变量的最优值
print(f"B产品产量: {y.X} 件")
elif model.Status == GRB.INFEASIBLE:
print("模型无可行解(约束矛盾)")
# 查找矛盾约束
model.computeIIS() # 计算最小不可行子集
for constr in model.getConstrs():
if constr.IISConstr:
print(f"矛盾约束: {constr.ConstrName}")
elif model.Status == GRB.UNBOUNDED:
print("模型无界(目标可无限优化)")
else:
print(f"求解未完成,状态码: {model.Status}")
# 关闭模型释放资源
model.close()
上述案例的输出结果为:
plaintext
最优利润: 20.0 元
A产品产量: 4.0 件
B产品产量: 2.0 件
三、进阶功能
1. 灵敏度分析
分析目标函数系数或约束右侧值变化对最优解的影响:
python
运行
# 求解后执行(仅对线性规划有效)
if model.Status == GRB.OPTIMAL:
# 变量系数灵敏度:A产品利润在什么范围内变化,最优解不变?
print(f"A产品利润允许范围: [{x.SAObjLow}, {x.SAObjUp}]")
# 约束右侧灵敏度:机器时间在什么范围内变化,最优解不变?
machine_constr = model.getConstrByName("machine_time_constraint")
print(f"机器时间允许范围: [{machine_constr.SARHSLow}, {machine_constr.SARHSUp}]")
2. 批量添加变量和约束
对于大规模模型,可批量定义变量和约束:
python
运行
# 批量定义变量(例如10种产品)
products = range(10)
x = model.addVars(products, vtype=GRB.INTEGER, lb=0, name="x")
# 批量添加约束(例如资源约束)
resources = range(5)
model.addConstrs((gp.quicksum(consumption[r,p] * x[p] for p in products) <= capacity[r]
for r in resources), name="resource_constraint")
四、常见问题解决
许可证错误:提示 “Invalid license” 时,检查许可证是否激活或过期,重新运行 grbgetkey 激活。
模型无可行解:使用 model.computeIIS() 定位矛盾约束,调整约束条件。
求解速度慢:
简化模型(合并约束、减少变量)
调大 MIPGap 接受次优解
增加线程数(model.setParam("Threads", 8))
五、学习资源
Gurobi 官方文档:包含详细接口说明和案例
Gurobi 示例库:覆盖各类优化问题的代码示例
学术用户可免费获取完整功能,建议结合具体问题(如供应链优化、调度问题)练习建模。
通过上述步骤,可快速掌握 Gurobi 的核心用法,解决各类线性和整数规划问题。
上一条:Gurobi 求解时间限制 Gurobi 线性规划示例
下一条:gurobi适合求解的优化类型