Gurobi 求解器的 Python 调用简明教程
安装与配置(Windows);Python 调用的基本语句
·
本文介绍 Gurobi 求解器的安装,及使用 Python 调用求解器求解的方法。
安装与配置(Windows)
1. 官网下载求解器:https://www.gurobi.com/
2. 本地安装 Gurobi.msi,在安装目录下找到 gurobipy 包,将其拷贝到 Python 包的目录
3. 将 license 文件 "gurobi.lic" 拷贝到 "C:\用户\用户名" 目录下
Python 调用的基本语句
gurobipy 包调用:
from gurobipy import *
模型声明:
model = Model("model_name")
变量声明:
lb: 取值下限,默认 0.0
ub: 取值上限,默认 GRB.INFINITY
vtype: 变量类型,默认 GRB.CONTINUOUS,常用:GRB.BINARY, GRB.INTEGER, GRB.CONTINUOUS
# 声明一组变量
x = model.addVars(num_x, vtype=GRB.INTEGER, name='x_')
y = model.addVars([(i, j) for i in range(num_i) for j in list_j], vtype=GRB.BINARY, name='y_')
# 声明单个变量
z = model.addVar(vtype=GRB.CONTINUOUS, name='z_')
约束添加:
model.addConstr(z <= upper_z, name='cons_{}'.format(index_cons))
特殊地,如需加入绝对值约束:
# 声明两组辅助变量,分别用于获取原数值和其绝对值
dev_v = model.addVars(num_v, lb=-GRB.INFINITY, vtype=GRB.CONTINUOUS, name='dev_v_')
dev_abs_v = model.addVars(num_v, vtype=GRB.CONTINUOUS, name='dev_abs_v_')
# 添加两组辅助约束,用于获取绝对值,使用 abs_ 函数
for i in range(num_v):
model.addConstr(dev_v[i] == value_v, name='cons_dev_v_[{}]'.format(i))
model.addConstr(dev_abs_v[i] == abs_(dev_v[i]), name='cons_dev_abs_v_[{}]'.format(i))
目标函数设置:
sense: GRB.MINIMIZE 或 GRB.MAXIMIZE
model.setObjective(expr_obj, sense=GRB.MINIMIZE)
模型写入本地文件:
文件路径:主程序目录下
model.write("file_name.lp")
执行参数设置:
# 求解时间限制
model.setParam(GRB.Param.TimeLimit, 300)
# 整数规划 gap
model.setParam(GRB.Param.MIPGap, 0.02)
模型求解:
model.optimize()
模型无解的情况,打印出有冲突的约束:
def print_infeasible(model):
"""
if model infeasible, print the infeasible constraints
:param model: Model, Gurobi Model object
:return: infeasible_list: [str], list of infeasible constraint names
"""
model.computeIIS()
infeasible_list = []
for constr in model.getConstrs():
if constr.IISConstr:
print(constr.constrName)
infeasible_list.append(constr.constrName)
return infeasible_list
if model.status in {3, 4, 5}:
print_infeasible(model)
获取求解结果:
# 获取目标函数值
obj_res = model.getObjective().getValue()
# 获取变量的解,参数 'X' 或 'x' 均可,不区分大小写
x_res = model.getAttr('X', x)
特别地,如需获取对偶变量值:
# 注:参数 'PI', 'Pi', 'pi', 'pI' 均可,不区分大小写
list_dual = model.getAttr('Pi')
参考资料:
Gurobi Optimizer Reference Manual
更多推荐
已为社区贡献3条内容
所有评论(0)