本文章参考Gurobi官方手册,内容上为更适合入门者学习,有所删减。
Model
是Gurobi中最重要的对象,其包含许多常用方法,包括optimize
优化模型、printStats
打印关于模型的统计信息、printAttr
打印属性值、write
将有关模型的信息写入文件、addVar
添加新变量、addVars
添加多个新变量、addMVar
添加Numpy变量、addConstr
添加新约束和addConstrs
添加多个新约束等。
首先还是老规矩,提醒大家先调用gurobipy
的库。
下载和调用gurobipy库
进入Python环境,下载名为“gurobi”的软件包,并且在每次使用Gurobi求解时,需要引入这个软件包。
from gurobipy import *
Model()
- 语句:
Model( 'name', env=defaultEnv )
- 功能:模型构造函数
- 输入:新模型的名称、环境(有默认参数,可不输入)
- 输出:新的模型对象,不包含任何变量和约束
- 说明:新模型的名称将被存储为ASCII码的字符串,因此不允许出现非ASCII码字符,也不允许出现空格
# 示例
m = Model("NewModel") # 定义名为NewModel的模型对象
x0 = m.addVar() # 向模型对象中添加变量x0
# Model ( name="", env=defaultEnv ) 这是一般格式,env可以省略
Model.addConstr()
- 语句:
Model.addConstr( TempConstr, name='' )
- 功能:为模型添加约束
- 输入:
TempConstr
作为第一个参数(下面有解释),第二个参数是可选参数,为约束名称 - 输出:新的约束对象
- 说明:新模型的名称将被存储为ASCII码的字符串,因此不允许出现非ASCII码字符,也不允许出现空格;一个约束只能有一个比较运算符,虽然
1 <= x + y <= 2
看起来很像一个约束,但是Model.addConstr()
方法不会接受
# 示例
model.addConstr(x + y <= 2.0, "c1")
model.addConstr(x*x + y*y <= 4.0, "qc0")
model.addConstr(x + y + z == [1, 2], "rgc0")
model.addConstr(A @ t >= b)
model.addConstr(z == and_(x, y, w), "gc0")
model.addConstr(z == min_(x, y), "gc1")
model.addConstr((w == 1) >> (x + y <= 1), "ic0")
TempConstr
- 功能:Gurobi临时约束对象,用于创建各种不同类型的约束
- 线性约束:(不)等号两端可以是线性表达式对象、变量对象或者常量,不能都是常量
- 范围线性约束:“
线性表达式 == [常量1, 常量2]
”的形式,说明线性表达式的值在区间[常量1, 常量2]
内 - 二次约束:(不)等号两端可以是二次表达式对象、线性表达式对象、变量对象或者常量,至少两端之一是二次表达式,否则就是线性约束
- 线性矩阵约束:(不)等号两端至少有一个是线性矩阵表达式对象
- 二次矩阵约束:(不)等号两端至少有一个是二次矩阵表达式对象
- 绝对值约束:“
x == abs_(y)
”的形式,x
和y
都是变量 - 逻辑约束:“
x == op_(y)
”的形式,x
是二值变量(即只有两种取值),y
是二值变量、二值变量列表或者二值变量元组字典(tupledict
,这个后面的内容里会提到,先有个印象就行);op_
可以是and_
或者or_
- 最大或最小约束:“
x == op_(y)
”的形式,x
是变量对象,y
可以是变量、变量和常量的列表、或者变量的元组字典;op_
是min_
或者max_
- 指示约束:“
(x == b) >>(线性表达式)
”的形式,符号>>
两端的式子都需要用()
括起来。x
是二值变量,b
是0
或1
。例如,(x == 1) >> (y + w <= 5)
中,当x
等于1
时,右端的线性约束y + w <= 5
必须成立
- 说明:这个类没有成员函数
# 示例
# 线性约束
x + y <= 1 + z
x + y == 5
# 范围线性约束
x + y + z == [1, 2]
# 二次约束
x*x + y*y <= 3
x*</