Gurobi笔记(使用手册)

一、基本了解

1、求解范围

  1. 连续问题、整数问题、线性和二次凸问题、二次非凸问题、广义非线性问题等
  2. 广义非线性问题——广义函数约束
    函数形式可以是高阶多项式、对数、指数、三角函数等非线性函数,那么Gurobi 会对这些函数自动分段线性化进行近似,用户可以通过参数来平衡近似的精度和速度。这样我们就允许在传统的线性和二次型模型中看到这些非线性函数,大大扩展了Gurobi求解器的适用范围,而且这些结果也具有全局最优性。

2、求解速度

线性规划速度 > 0-1 整数线性规划 > 整数线性规划 > 混合整数线性规划 > 非线性规划
在现实问题中,应用最广泛的数学规划问题类型是混合整数线性规划(MILP)。

3、学习资料

  • 安装目录 examples, docs 目录下有完整的范例和使用手册、参考手册
  • 官网 www.gurobi.com
    1. 在线手册:http://www.gurobi.com/documentation/
    2. 视频:http://www.gurobi.com/resources/seminars-andvideos/seminars-videos
    3. 在线课程:http://www.gurobi.com/academia/for-online-courses
  • 中文网站 www.gurobi.cn

二、快速入门

1.常规步骤

MODEL = gurobipy.Model()#创建模型

x = MODEL.addVars(创建变量, vtype=gurobipy.GRB.CONTINUOUS, name="X")#创建变量

MODEL.update()#更新变量环境

MODEL.setObjective(创建目标函数, sense=gurobipy.GRB.MINIMIZE)#创建目标函数

MODEL.addConstrs(创建约束条件) #创建约束条件

MODEL.optimize() #执行最优化

2.基础模型

在这里插入图片描述

3.详细步骤

3.1 实例化求解器

MODEL = gurobipy.Model(name="")
name 为模块名默认为空
import gurobipy as GRB
MODEL = GRB.Model("Model_name")   #创建模型

3.2 添加决策变量

(1) 单个变量
x = MODEL.addVar(lb=0.0, ub=gurobipy.GRB.INFINITY, vtype=gurobipy.GRB.CONTINUOUS, name="")
lb = 0.0	 #变量的下界,默认为 0
ub = GRB.INFINITY: 变量的上界,默认为无穷大
vtype = GRB.CONTINUOUS 	#变量的类型,默认为连续型,可改为 GRB.BINARY 0-1变量,GRB.INTEGER 整型
name = "" 	#变量名,默认为空
x1 = MODEL.addVar(lb=0, ub=1, name="x1")
(2) 多个变量
x = MODEL.addVars(*indexes, lb=0, ub=gurobipy.GRB.INFINITY, vtype=gurobipy.GRB.CONTINUOUS, name="")
# *indexes 不能含有中文字符 索引的集合

x = MODEL.addVars(3, 4, 5, vtype=gurobipy.GRB.BINARY, name="C") 
# 创建 3*4*5 个变量,使用 x[1,2,3] 进行访问

3.3 更新变量空间

MODEL.update()

3.4 添加目标函数

(1) 单目标函数
MODEL.setObjective(expression, sense=None)
expression #表达式,可以是一次或二次函数类型
sense #求解类型,可以是 GRB.MINIMIZE(最小值) 或 GRB.MAXIMIZE(最大值)
MODEL.setObjective(8 * x1 + 10 * x2 + 7 * x3 + 6 * x4 + 11 * x5 + 9 * x6, GRB.GRB.MINIMIZE)
(2) 多目标函数
MODEL.setObjectiveN(expression, index, priority=0, weight=1.0, abstol=0, reltol=0, name="")
expression 	# 表达式,可以是一次或二次函数类型
index	# 目标函数对应的序号 (默认 0,1,2,…), 以 index=0 作为目标函数的值, 其余值需要另外设置参数
priority	# 分层序列法多目标决策优先级(整数值), 值越大优先级越高
weight	#线性加权多目标决策权重(在优先级相同时发挥作用)
abstol 	# 分层序列法多目标决策时允许的目标函数值最大的降低量
reltol	#分层序列法多目标决策时允许的目标函数值最大的降低比率 reltol*|目标函数值|

注意: 所有的目标函数都为线性的,并且目标函数的优化方向一致(全部最大化或全部最小化)。可以通过乘以 -1 实现不同的优化方向。

1.合成型
# Obj1 = x + y      weight = 1
# Obj2 = x - 5 * y    weight = -2
# MODEL.setObjectiveN(x + y, index=0, weight=1, name='obj1')
# MODEL.setObjectiveN(x -5 * y, index=1, weight=-2, name='obj2')
# 即转化为: (x + y) - 2 * (x - 5 * y) = - x + 11 * y
2.分层型
# Obj1 = x + y      priority = 5
# Obj2 = x - 5 * y    priority = 1
# MODEL.setObjectiveN(x + y, index=0, priority=5, name='obj1')
# MODEL.setObjectiveN(x -5 * y, index=1, priority=1, name='obj2')
# 即转化为: 先优化 Obj1,再优化 Obj2(按照 priority 的大小关系)

注意: Gurobi 按照优先级大小优化(先优化Obj1),若没有设定abstol或reltol,在优化低优先级目标时,不会改变高优先级的目标值。假设Obj1=10,在优化 Obj2 时只能在使得 Obj1=10 的所有解中挑选最优解

3.混合型
MODEL.setObjectiveN(x + y, index=0, weight=1, priority=5, name='obj1')
MODEL.setObjectiveN(x -5 * y, index=1, weight=-2, priority=1, name='obj2')
# 则 先优化 Obj1 再优化 Obj2 最后相加作为目标值, 由于优先级不同, weight不会起作用
4.获取目标函数值

通过参数 ObjNumber 选择特定的目标,进而获得对应的目标函数值。

MODEL.setParam(gurobipy.GRB.Param.ObjNumber, i) # 第 i 个目标
print(MODEL.ObjNVal)  # 打印第 i 个值
for i in range(model.NumObj):
model.setParam(GRB.Param.ObjNumber, i)
print('Obj%d = ' %(i+1), model.ObjNVal)
(3) 分段目标函数
setPWLObj(var,x,y)
• var	 #指定变量的目标函数是分段线性
• x 	#定义分段线性目标函数的点的横坐标值(非减序列)
• y 	#定义分段线性目标函数的点的纵坐标值

例1:

在这里插入图片描述
在这里插入图片描述

m.setPWLObj(x, [0, 2, 5], [0, 2, 3])
m.setAttr(GRB.Attr.ModelSense, -1)

注意: 对一些非线性模型,可以使用这一功能去线性逼近。
例2:
在这里插入图片描述
在这里插入图片描述

m.setPWLObj(x, [
  • 50
    点赞
  • 196
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于Gurobi的使用教程,您可以参考以下步骤: 1. 安装Gurobi:首先,您需要从Gurobi官方网站(https://www.gurobi.com/)下载并安装Gurobi软件包。根据您的操作系统,选择相应的版本进行下载和安装。 2. 获取许可证:在安装完Gurobi后,您需要在Gurobi官方网站上注册并获取一个许可证。填写相应的信息并提交申请,然后您将收到一封包含许可证的电子邮件。 3. 配置Gurobi环境:将Gurobi添加到系统路径,这样您就可以在命令行或脚本直接使用Gurobi命令。具体操作请参考Gurobi的官方文档,其有详细的说明和示例。 4. 编写优化模型:使用Gurobi解决优化问题需要编写一个数学优化模型。您可以选择使用Python、C++、MATLAB等编程语言来编写模型。在这个模型,您需要定义变量、目标函数和约束条件。 5. 调用Gurobi求解器:一旦您编写好了优化模型,就可以调用Gurobi求解器来求解该模型。根据您选择的编程语言,可以使用相应的API来调用Gurobi求解器,并获取最优解或最优解的近似解。 6. 解读结果:根据Gurobi求解器返回的结果,您可以获取最优解的变量取值,以及目标函数的最优值。根据具体的应用场景,您可以进一步解读结果,并进行相应的决策或优化。 请注意,以上是一个简要的概述,更详细的使用教程和示例可以在Gurobi官方网站上找到。他们提供了丰富的文档和教程资源,以帮助用户快速上手并深入了解Gurobi的使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值