本文介绍 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

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐