Gurobi 是目前业界领先的商业数学规划求解器,能高效求解线性规划(LP)、整数线性规划(ILP)、混合整数线性规划(MILP)、二次规划(QP)、混合整数二次规划(MIQP)等多种类型的优化问题,广泛应用于供应链、金融、生产调度、能源优化等领域。下面从核心能力、使用流程、关键操作、常见问题四个维度,系统介绍如何用 Gurobi 求解优化问题。
在使用 Gurobi 前,需先明确其支持的问题类型,避免因问题不匹配导致求解失败。
Gurobi 对不同优化问题的支持度和求解效率不同,核心覆盖以下类别:
| 问题类型 | 英文缩写 | 核心特征 | 典型应用场景 |
|---|
| 线性规划 | LP | 目标函数和约束均为线性表达式,变量为连续值 | 资源分配(如工厂原料分配)、运输路线优化 |
| 整数线性规划 | ILP | 变量全部为整数(0-1 变量是特殊情况),目标 / 约束线性 | 项目选择(选 / 不选某项目)、设备选址 |
| 混合整数线性规划 | MILP | 部分变量为整数,部分为连续值,目标 / 约束线性 | 生产计划(生产数量为整数,原料消耗为连续值) |
| 二次规划 | QP | 目标函数为二次函数(凸 / 非凸),约束为线性,变量连续 | 投资组合优化(最小化风险方差) |
| 混合整数二次规划 | MIQP | 部分变量为整数,目标函数为二次函数,约束线性 | 带整数决策的投资组合(如是否投资某资产) |
| 约束规划 | CP | 聚焦离散变量的逻辑约束(如顺序、依赖关系),非传统数学规划 | 调度问题(如车间机器任务排序) |
求解效率高:针对大规模问题(变量 / 约束数达百万级)优化了算法,支持并行计算、稀疏矩阵存储,比开源求解器(如 PuLP 依赖的 CBC)快 10-100 倍。
鲁棒性强:能处理数值不稳定的模型(如系数差异极大的约束),自动调整求解策略。
灵活性好:支持多种接口(Python、Java、C++、MATLAB 等),可自定义求解参数(如时间限制、精度要求),并提供详细的求解日志和灵敏度分析。
无论使用哪种接口,Gurobi 求解优化问题的核心流程一致,以下以Python 接口(最常用)为例,结合具体案例说明。
获取 Gurobi 许可证:需先在 Gurobi 官网 申请许可证(学术用户可免费获取),并激活许可证(通过 grbgetkey 命令)。
安装求解器:下载对应系统(Windows/macOS/Linux)的 Gurobi 求解器安装包,按向导安装。
安装 Python 接口:通过 pip 安装(需确保 Python 版本与 Gurobi 兼容,如 Gurobi 11.0 支持 Python 3.8-3.11):
bash
pip install gurobipy
运行以下代码,若能正常输出 Gurobi 版本,说明安装成功:
python
import gurobipy as gpfrom gurobipy import GRB# 初始化模型(模型名可自定义)model = gp.Model("test_model")# 输出 Gurobi 版本print(f"Gurobi 版本: {gp.__version__}")# 关闭模型(避免占用内存)model.close()构建模型是核心环节,需明确决策变量、目标函数、约束条件三要素,对应 Gurobi 的 Var()、setObjective()、addConstr() 方法。
某工厂生产 A、B 两种产品,生产 1 件 A 需 2 小时机器时间、消耗 1kg 原料,利润 3 元;生产 1 件 B 需 1 小时机器时间、消耗 2kg 原料,利润 4 元。工厂每天机器时间上限 10 小时,原料上限 8kg。求如何安排生产,使总利润最大?
用 model.addVar() 定义变量,需指定变量类型(连续 / 整数)、上下界(默认非负):
python
用 model.setObjective() 定义目标,需指定目标表达式和优化方向(最大化 / 最小化):
python
用 model.addConstr() 添加约束,需指定约束表达式和约束名称(便于后续排查问题):
python
Gurobi 默认参数已能应对多数简单问题,但复杂问题需自定义参数(如时间限制、精度要求),通过 model.setParam() 配置:
python
常用核心参数见下表:
| 参数名 | 含义 | 默认值 | 适用场景 |
|---|
| TimeLimit | 求解时间上限(秒) | 无穷大 | 大规模问题避免求解过久 |
| MIPGap | 混合整数问题的最优性差距(如 1e-4 表示 0.01%) | 1e-4 | 对精度要求高的场景(如金融) |
| OutputFlag | 是否输出求解日志 | 1 | 调试时设为 1,部署时设为 0 减少冗余 |
| Threads | 并行计算的线程数 | 自动(CPU 核心数) | 大规模问题设为 CPU 核心数,加速求解 |
调用 model.optimize() 启动求解,Gurobi 会自动选择求解算法(如 LP 用单纯形法,MILP 用分支定界法):
python
求解过程中,日志会输出关键信息:当前迭代次数、目标函数值、约束满足情况等,例如:
plaintext
求解后需判断结果状态(如是否找到最优解),并提取变量值、目标函数值等关键信息。
通过 model.Status 获取求解状态,核心状态码含义如下:
| 状态码 | 含义 | 处理建议 |
|---|
| GRB.OPTIMAL | 找到最优解 | 正常提取结果 |
| GRB.INFEASIBLE | 模型无可行解(约束冲突) | 检查约束是否矛盾(如 “x≤1” 且 “x≥2”) |
| GRB.UNBOUNDED | 目标函数无界(无约束限制目标增长) | 检查是否遗漏约束(如目标最大化但无变量上界) |
| GRB.TIME_LIMIT | 达到时间限制,未找到最优解 | 增大时间限制,或优化模型(如合并约束) |
若状态为 GRB.OPTIMAL,可通过 var.X 获取变量值,model.ObjVal 获取目标函数值:
python
plaintex
结果说明:生产 4 件 A、2 件 B 时,机器时间和原料刚好耗尽,总利润最大(20 元),符合预期。
对于大规模或复杂模型,需通过以下操作优化求解过程:
合并重复约束:如 “x≤5” 和 “x≤5” 可合并为一个,减少约束数量。
消除冗余变量:若变量 z = x + y,且仅在目标 / 约束中用 z,可直接用 x + y 替代 z,减少变量数。
固定变量值:若某变量的上下界相等(如 x = 3),可直接用 3 替代该变量,无需定义为决策变量。
Gurobi 支持分析目标函数系数变化或约束右侧(RHS)变化对最优解的影响,帮助决策:
python
设 Threads 参数为 CPU 核心数(如 model.setParam("Threads", 8)),利用并行计算加速分支定界过程。
若模型求解慢,可适当调大 MIPGap(如从 1e-4 改为 1e-3),在精度和速度间权衡。
原因:许可证未激活、过期,或与当前机器不匹配。
解决:
检查许可证状态:运行 grbcluster status 命令。
重新激活许可证:通过 grbgetkey <许可证密钥> 重新激活。
确认许可证类型:学术许可证需绑定教育邮箱,商业许可证需绑定机器硬件信息。
Gurobi 求解优化问题的核心逻辑是 “明确模型三要素(变量、目标、约束)→ 配置参数→ 求解→ 分析结果”,关键在于:
模型构建的准确性:确保变量类型、约束表达式与实际问题一致,避免逻辑错误。
求解参数的合理性:根据问题规模和精度需求调整 TimeLimit、MIPGap 等参数。
结果分析的完整性:不仅要关注变量值和目标值,还要通过松弛量、灵敏度分析验证结果的合理性。
上一条:gurobi求解器用途
下一条:Gurobi怎么处理多目标 Gurobi怎么设置分支策略