Gurobi 是一款强大的商业优化求解器,能够高效解决各类线性规划、整数规划、二次规划等优化问题。以下通过具体案例详细介绍其使用方法,以 Python 接口为例:
一、基础案例:线性规划问题
问题描述
求解以下线性规划问题:
目标函数:max
z=3x+4y
约束条件:
2x+y≤10
x+2y≤8
x,y≥0
(非负约束)
求解代码
Gurobi求解线性规划问题示例
V1
创建时间:22:15
代码说明
首先导入 gurobipy 库并创建模型对象
使用 addVar() 方法定义决策变量,指定变量类型(GRB.CONTINUOUS 表示连续变量)和下界
通过 setObjective() 方法设置目标函数及优化方向(最大化 GRB.MAXIMIZE 或最小化 GRB.MINIMIZE)
使用 addConstr() 方法添加约束条件
调用 optimize() 方法进行求解
根据求解状态(model.status)输出结果,GRB.OPTIMAL 表示找到最优解
二、进阶案例:整数规划问题
问题描述
在上述线性规划问题基础上,要求
x
和
y
必须为整数,即求解整数规划问题。
求解代码(关键部分修改)
只需修改变量类型为整数即可:
python
运行
# 将变量类型改为整数
x = model.addVar(name="x", vtype=GRB.INTEGER, lb=0) # 整数变量
y = model.addVar(name="y", vtype=GRB.INTEGER, lb=0) # 整数变量
说明
0-1 变量可使用 vtype=GRB.BINARY
整数规划问题求解通常比线性规划慢,可通过设置参数(如时间限制)进行控制
三、常用参数设置
通过 setParam() 方法可配置求解参数,常用参数包括:
python
运行
# 设置求解时间上限(秒)
model.setParam("TimeLimit", 60)
# 设置整数规划最优性差距(如0.01表示1%)
model.setParam("MIPGap", 0.01)
# 设置线程数(利用多核加速)
model.setParam("Threads", 4)
# 关闭求解日志输出
model.setParam("OutputFlag", 0)
四、求解结果分析
求解完成后,可获取丰富的结果信息:
python
运行
if model.status == GRB.OPTIMAL:
# 目标函数值
print(f"目标函数值: {model.ObjVal}")
# 变量值
for var in model.getVars():
print(f"{var.VarName}: {var.X}")
# 约束松弛量(右侧减左侧)
for constr in model.getConstrs():
print(f"{constr.ConstrName} 松弛量: {constr.Slack}")
# 灵敏度分析(仅对线性规划有效)
print(f"x系数允许范围: [{x.SAObjLow}, {x.SAObjUp}]")
五、常见问题处理
许可证问题:
错误提示:Invalid license
解决方法:重新激活许可证,运行 grbgetkey <许可证密钥>
模型无可行解:
python
运行
if model.status == GRB.INFEASIBLE:
model.computeIIS() # 计算最小不可行约束集
print("矛盾约束:")
for constr in model.getConstrs():
if constr.IISConstr:
print(f"- {constr.ConstrName}")
求解速度慢:
简化模型(合并约束、减少变量)
调整 MIPGap 参数接受次优解
增加线程数利用并行计算
通过以上步骤,你可以快速掌握 Gurobi 的基本使用方法。对于更复杂的问题(如大规模规划、二次规划等),可参考官方文档和示例库进一步学习。
上一条:gurobi适合求解的优化类型
下一条:选择Docusign电子签名的5个理由