赞
踩
本文章参考Gurobi官方手册,内容上为更适合入门者学习,有所删减。
Model
是Gurobi中最重要的对象,其包含许多常用方法,包括optimize
优化模型、printStats
打印关于模型的统计信息、printAttr
打印属性值、write
将有关模型的信息写入文件、addVar
添加新变量、addVars
添加多个新变量、addMVar
添加Numpy变量、addConstr
添加新约束和addConstrs
添加多个新约束等。
首先还是老规矩,提醒大家先调用gurobipy
的库。
进入Python环境,下载名为“gurobi”的软件包,并且在每次使用Gurobi求解时,需要引入这个软件包。
from gurobipy import *
Model( 'name', env=defaultEnv )
# 示例
m = Model("NewModel") # 定义名为NewModel的模型对象
x0 = m.addVar() # 向模型对象中添加变量x0
# Model ( name="", env=defaultEnv ) 这是一般格式,env可以省略
Model.addConstr( TempConstr, name='' )
TempConstr
作为第一个参数(下面有解释),第二个参数是可选参数,为约束名称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")
线性表达式 == [常量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*x + y*y <= z*z # 线性矩阵约束 A @ x <= 1 A @ x == B @ y # 二次矩阵约束 x @ Q @ y <= 3 x @ Q @ x <= y @ A @ y # 绝对值约束 x == abs_(y) # 逻辑约束 x == and_(y) y == or_(y) # 最大最小约束 x == min_(y) x == max_(y) # 指示约束 (x == 1) >> (y + w <= 5)
Model.addConstr
方法# 示例
model.addConstr(x + y == 1)
model.addConstr(x + y == [1, 2])
model.addConstr(x*x + y*y <= 1)
model.addConstr(A @ x <= 1)
model.addConstr(x @ A @ x <= 1)
model.addConstr(x == abs_(y))
model.addConstr(x == or_(y, z))
model.addConstr(x == max_(y, z))
model.addConstr((x == 1) >> (y + z <= 5))
Model.addConstrs ( generator, name="" )
(x[i] <= 1 for i in range(4))
作为第一个参数,第二个参数是可选参数,为约束名称m.addConstrs((x[i] <= 1 for i in range(4)), name='c')
这个式子意味着同时添加4个约束,其中第一个约束与变量x[0]
有关,即x[0] <= 1
,该约束名为c[0]
,以此类推;约束名可以省略,但如果给定约束名称参数,那生成器表达式就一定要放在括号里# 示例 m.addConstrs((x[i,j] == 0 for i in range(4) for j in range(4) if i != j), name='c') # 第一个约束是 x[0,1] == 0, name='c[0,1]' model.addConstrs(x.sum(i, '*') <= capacity[i] for i in range(5)) model.addConstrs(x[i] + x[j] <= 1 for i in range(5) for j in range(5)) model.addConstrs(x[i]*x[i] + y[i]*y[i] <= 1 for i in range(5)) model.addConstrs(x.sum(i, '*') == [0, 2] for i in [1, 2, 4]) model.addConstrs(z[i] == max_(x[i], y[i]) for i in range(5)) model.addConstrs((x[i] == 1) >> (y[i] + z[i] <= 5) for i in range(5)) # 上面这几个约束都没有带括号,是因为他们并没有名称参数
上面我们介绍了基本约束的构造,Gurobi接受一些额外的约束类型,我们将其统称为一般(函数)约束。这些问题通常不会由求解器直接处理。相反,它们是通过预先转换为从上面列出的基本类型中选择的约束(和变量)。在某些情况下,产生的约束或原始约束在数学上是等价的;在其他情况下,它们是近似。如果这些约束出现在您的模型中,但是如果您更喜欢自己使用基本的约束类型来重新构造它们,那么您当然可以这样做。但是,请注意,Gurobi有时可以利用模型中其他约束中包含的信息来构建比您可能创建的更有效的公式。
上面这段话不理解也没关系,大致意思就是,有一些函数约束,Gurobi也能直接构造,比如ln(x) <= 5
,我们前面学过的构造方式里并没有包括这种约束。在求解上,可能是等价求解,也有可能是近似求解。如果你很牛,可以自己通过基本的约束形式把这类约束表征出来,当然也可以,但是Gurobi既然帮我们考虑了,那我们可就直接拿来用了哈哈哈哈。
addGenConstrMax ( resvar, vars, constant=None, name="" )
max_
函数来构造)resvar
一个变量,其值将等于其他变量的最大值;vars
变量列表或变量的tupledict
字典;constant
在最大操作中的常数,浮点数,是个可选参数;name
老朋友就不多介绍了# 示例
# x5 = max(x1, x3, x4, 2.0)
model.addGenConstrMax(x5, [x1, x3, x4], 2.0, "maxconstr")
# overloaded forms 下面两种哪个都行,是不是感觉上面的方法更简单呢
model.addConstr(x5 == max_([x1, x3, x4], constant=2.0), name="maxconstr")
model.addConstr(x5 == max_(x1, x3, x4, constant=2.0), name="maxconstr")
和上面的方法一样,就不介绍了
addGenConstrAbs ( resvar, argvar, name="" )
abs_
函数来定义这个约束argvar
将要取绝对值的变量# 示例
# x5 = abs(x1)
model.addGenConstrAbs(x5, x1, "absconstr")
# overloaded form
model.addConstr(x5 == abs_(x1), name="absconstr")
and_
函数定义的约束,vars
变量列表中的变量必须都为1时,其值才为1,否则为0# 示例
# x5 = and(x1, x3, x4)
model.addGenConstrAnd(x5, [x1, x3, x4], "andconstr")
# overloaded forms
model.addConstr(x5 == and_([x1, x3, x4]), "andconstr")
model.addConstr(x5 == and_(x1, x3, x4), "andconstr")
addGenConstrOr ( resvar, vars, name="" )
or_
函数定义的约束一致# 示例
# x5 = or(x1, x3, x4)
model.addGenConstrOr(x5, [x1, x3, x4], "orconstr")
# overloaded forms
model.addConstr(x5 == or_([x1, x3, x4]), "orconstr")
model.addConstr(x5 == or_(x1, x3, x4), "orconstr")
addGenConstrNorm ( resvar, vars, which, name="" )
resvar
一个变量,其值将等于其他变量的最大值;vars
变量列表或变量的tupledict
字典或一维的MVar
;which
范数级别,浮点数;name
老朋友就不多介绍了# 示例
x5 = 2-norm(x1, x3, x4)
model.addGenConstrNorm(x5, [x1, x3, x4], 2.0, "normconstr")
我觉得这个参数太多,不如自己建立指示符约束来的舒服
addGenConstrPWL ( xvar, yvar, xpts, ypts, name="" )
xvar
变量x;yvar
变量y;xpts
定义分段线性函数点的x,必须是单调非递减序列;ypts
与前一个参数意义一致# 示例
gc = model.addGenConstrPWL(x, y, [0, 1, 2], [1.5, 0, 3], "myPWLConstr")
addGenConstrPoly ( xvar, yvar, p, name="", options="" )
p
多项式函数的系数,从最高幂的系数开始,options
是个可选参数,因为多项式是根据分段线性约束近似来的,这个参数能够对近似约束进行限制# 示例
# y = 2 x^3 + 1.5 x^2 + 1
gc = model.addGenConstrPoly(x, y, [2, 1.5, 0, 1])
addGenConstrExp ( xvar, yvar, name="", options="" )
# 示例
# y = exp(x)
gc = model.addGenConstrExp(x, y)
addGenConstrExpA ( xvar, yvar, a, name="", options="" )
a
很显然是底数啦# 示例
# y = 3^x
gc = model.addGenConstrExpA(x, y, 3.0, "expa")
addGenConstrLog ( xvar, yvar, name="", options="" )
# 示例
# y = ln(x)
gc = model.addGenConstrLog(x, y)
addGenConstrLogA ( xvar, yvar, a, name="", options="" )
# 示例
# y = log10(x)
gc = model.addGenConstrLogA(x, y, 10.0, "log10", "FuncPieces=-1 FuncPieceError=1e-5")
addGenConstrLogistic ( xvar, yvar, name="", options="" )
# 示例
# y = 1 / (1 + exp(-x))
gc = model.addGenConstrLogistic(x, y)
addGenConstrPow ( xvar, yvar, a, name="", options="" )
# 示例
# y = x^3.5
gc = model.addGenConstrPow(x, y, 3.5, "gf", "FuncPieces=1000")
addGenConstrSin ( xvar, yvar, name="", options="" )
# 示例
# y = sin(x)
gc = model.addGenConstrSin(x, y)
和上面一样
和上面一样
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。