Gurobi 求解器的 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

 

  • 10
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值