Gurobi 安装到使用教程(3)

Gurobi 安装到使用教程(3)

  • 参数和属性
    • 参数
    • 属性
  • 特殊的约束的表示方法
    • Max
    • Min
    • Abs
    • And
    • Or
    • Indicator
    • 范围约束
    • SOS约束
    • 多目标函数
    • 分段线性函数
  • Solution Pool

参数和属性

参数

参数主要指的是启动前需要设置的行为:

model.setParam( paramname, newvalue)
# paramname 参数名称
# newvalue 参数取值

# 比如设置求解时间
model.setParam("TimeLimit“, 600) 
model.setParam(GRB.Param.TimeLimit, 600) 
model.Params.TimeLimit= 600     

参数类别主要有:
(1) Termination 停止参数,控制求解停止条件。
例如: TimeLimit设定时间;SolutionLimit设定MIP可行解数量。
(2) Tolerances 容差参数,控制求解器的最优或可行的偏差。
例如: MIPGap设定MIP的gap值;FeasibilityTol设定精度。
(3) Simplex 单纯形参数,控制单纯形法。
例如: InfUnbdInfo控制是否获取不可行或无界模型的额外信息。
(4) Barrier 障碍法参数,控制障碍法。
例如: QCPDual控制是否获取二次模型的对偶值。
(5) Mip 混合整数参数,控制混合整数规划算法。
例如: BranchDir设定优先分支方向;Heuristics设定启发式算法求解时间所占的比重。
(6) MipCuts 割平面参数,控制割平面。
例如: Cuts设定割平面法的强度。
(7) Tuning 调参参数,控制调参工具。
例如: TuneCriterion设定调参的准则;TuneTimeLimit设定调参的时间。
(8) Multiple Solutions 多解参数,尝试寻找多个解。
例如: PoolSolutions决定存储可行解的数量。
(9) Distributed algorithms 分布式计算参数
(10) Compute Server 计算服务器参数
(11) Cloud 云参数
(12) Token server 令牌服务器参数
(13) Other 其他一些参数
完整参数在gurobi下载软件的参考手册里面:…\docs\refman.pdf
使用参数优化模型的案例:

import sys
import gurobipy as gp


if len(sys.argv) < 2:
    print('Usage: params.py filename')
    sys.exit(0)


# Read model and verify that it is a MIP
m = gp.read(sys.argv[1])
if m.IsMIP == 0:
    print('The model is not an integer program')
    sys.exit(1)

# Set a 2 second time limit
m.Params.TimeLimit = 2

# Now solve the model with different values of MIPFocus
bestModel = m.copy()
bestModel.optimize()
for i in range(1, 4):
    m.reset()
    m.Params.MIPFocus = i
    m.optimize()
    if bestModel.MIPGap > m.MIPGap:
        bestModel, m = m, bestModel  # swap models

# Finally, delete the extra model, reset the time limit and
# continue to solve the best model to optimality
del m
bestModel.Params.TimeLimit = float('inf')
bestModel.optimize()
print('Solved with MIPFocus: %d' % bestModel.Params.MIPFocus)

常用的参数:
Gurobi 安装到使用教程(3)_第1张图片
Gurobi 安装到使用教程(3)_第2张图片

属性

(1) Model Attributes 模型属性
例如: ModelSense模型优化方向(最大化或最小化);ObjVal当前目标值。
(2) Variable Attributes 变量属性
例如: X 当前变量的取值; Start MIP初始解。
(3) Linear Constraint Attributes 线性约束属性
例如: Pi 约束对应的对偶值;Slack 约束的松弛量;RHS 约束的右端项。
(4) Special-ordered Set constraints Attributes SOS约束属性
例如: IISSOS 对不可行的模型,指示约束是否属于IIS (Irreducible Inconsistent Subsystem)。
(5) Quadratic Constraint Attributes 二次约束属性
例如: QCRHS 约束右端项。
(6) General Constraint Attributes 广义约束属性
例如: GenConstrName约束名称。
(7) Quality Attributes 解质量属性
例如: BoundVio最大的界违反;IntVio整数变量离最近整数的最大距离。
(8) Multi-objective Attributes 多目标属性
例如: ObjN 对应多目标表达式中变量系数;ObjNVal对应目标函数值
设置和查询属性的方法:

setAttr( attrname, newvalue) 
# attrname 属性名称
# newvalue 属性的值
var.setAttr(GRB.Attr.VType, ‘C’) 

getAttr( attrname, objs)
# attrname属性名称
# objs(可选)   列表或字典对象用来存储查询的值
model.getAttr(GRB.Attr.ObjVal) 

常用的属性
Gurobi 安装到使用教程(3)_第3张图片

特殊的约束的表示方法

Max

addGenConstrMax( resvar, vars, constant, name )          
# resvar 变量(x = max(x1,x2,10))
# vars 一组变量(可以包含常数)
# constant 常数
# name 广义约束名称

z = max(x, y, 3) 
m.addGenConstrMax(z, [x, y], 3, "maxconstr")
m.addGenConstrMax(z, [x, y, 3], name="maxconstr")
m.addConstr(z == max_([x, y, 3]), "maxconstr")
m.addConstr(z == max_(x, y, 3), "maxconstr")

Min

addGenConstrMin( resvar, vars, constant, name )          
# resvar 变量(x = min(x1,x2,10))
# vars 一组变量(可以包含常数)
# constant 常数
# name 广义约束名称
z = min(x, y, 3) 
m.addGenConstrMin(z, [x, y], 3, "minconstr")
m.addGenConstrMin(z, [x, y, 3], name="minconstr")
# 换成一般的约束表达方式:
m.addConstr(z == min_([x, y, 3]), "minconstr")
m.addConstr(z == min_(x, y, 3), "minconstr")

Abs

addGenConstrAbs( resvar, argvars, name )          
# resvar 变量
# argvar变量
# name 广义约束名称

# 例如: x = |y|      
m.addGenConstrAbs(x, y, "absconstr")
# 换成一般的约束表达方式: 
m.addConstr(x == abs_(y), "absconstr")

And

addGenConstrAnd( resvar, vars, name )          
# resvar 变量
# vars一组变量
# name 广义约束名称
# 一组变量的值全等于1,则取1,否则取0。
# 注意:所有的变量都被视为0,1变量,不论他们之前被定为什么类型。

# x = 1且y = 1,那么z = 1,否则 z = 0      
m.addGenConstrAnd(z, [x,y], "andconstr")
# 换成一般的约束表达方式: 
m.addConstr(z == and_(x, y), "andconstr")

Or

addGenConstrOr( resvar, vars, name )          
# resvar 变量
# vars 一组变量
# name 广义约束名称
#一组变量的值有一个等于1,则取1,否则取0。
#注意:所有的变量都被视为0,1变量,不论他们之前被定为什么类型。
# x = 0且y = 0,那么z = 0,否则 z = 1      
m.addGenConstrOr(z, [x,y], "orconstr")
# 换成一般的约束表达方式: 
m.addConstr(z == or_(x, y), "orconstr")

Indicator

# 如果 z = 1,则 x+y <= 4 
m.addGenConstrIndicator(z, True, x + y, GRB.LESS_EQUAL, 4, 'indicator')  
# 换成一般的约束表达方式: 
m.addConstr((z == 1) >>(x + y<= 4))

范围约束

addRange( expr, lower, upper, name) 
# expr 表达式 
# lower 下界 
# upper 上界 
# name 约束名称
# 例如: 5 <= x + y + z <= 10 
m.addRange(x+y+z, 5, 10, "c")  
#换成一般的约束表达方式: 
m.addConstr(x+y+z==[5,12])

SOS约束

addSOS( type, vars, wts=None )
# type 约束种类(GRB.SOS_TYPE1 或者 GRB.SOS_TYPE2).
# vars 变量
# wts 变量对应的权重,且权重唯一,默认1, 2, 3 ...
# SOS_TYPE1 表示一组有序变量中最多有一个变量取值不为0;
# SOS_TYPE2 表示一组有序变量中最多有两个变量取值不为0,且非零变量相邻。变量是否相邻由权重决定。
model.addSOS(GRB.SOS_TYPE2, [x, y, z], [1, 2, 4])

多目标函数

setObjectiveN( expr, index, priority, weight, abstol, reltol, name ) 
# expr   目标函数表达式 
# index  目标函数对应的序号(0, 1, 2, ….) 
# priority 优先级(整数值) 
# weight 权重(浮点数) 
# abstol 允许的目标函数值最大的降低量abstol(浮点数) 
# reltol 允许的目标函数值最大的降低量reltol*|目标函数值|(浮点数) 
# name   目标函数名称
# 注意:所有的目标函数都为线性的,并且目标函数的优化方向一致(全部最大化或全部最小化)。可以通过乘 以 -1 实现不同的优化方向。

• Blend(合成型) 有权重,没有优先级。例如优化:
Obj1 = x + y
weight1 = 1
Obj2 = x –5y
weight2 = -2
Gurobi会混合这两个目标值形成:
1*(x+y) -2*(x –5y) = -x+11y
• Hierarchical(分层型) 有优先级。 例如优化:
Obj1 = x + y
priority 1 = 10
Obj2 = x –5y
priority 2 = 5
Gurobi按照优先级大小优化(先优化Obj1),若没有设定abstol或reltol,在优化低优先级目标时,不会改
变高优先级的目标值。假设Obj1=10,在优化Obj2 时只能在使得 Obj1=10 的所有解中挑选最优解。
• 混合以上两种。

# Blend(合成型) 
m.setObjectiveN(x+y+3*z, index=0, weight=0.1, name='obj1') 
m.setObjectiveN(2*x+y+3*z, index=1, weight=3, name='obj2')
# Hierarchical  
m.setObjectiveN(x+y+3*z, index=0, priority=1, name='obj1') 
m.setObjectiveN(2*x+y+3*z, index=1, priority=3, name='obj2')
# 混合以上两种。 
m.setObjectiveN(x+y+3*z, index=0, weight=0.1,priority=1, name='obj1') m.setObjectiveN(2*x+y+3*z, index=1, weight=3, priority=3, name='obj2')
# 通过参数ObjNumber选择特定的目标,进而获得对应的目标函数值。 
for i in range(model.NumObj): 
	model.setParam(GRB.Param.ObjNumber, i) 
	print('Obj%d= ' %(i+1),  model.ObjNVal)

分段线性函数

setPWLObj( var, x, y )            
# var 指定变量的目标函数是分段线性 
# x 定义分段线性目标函数的点的横坐标值(非减序列) 
# y 定义分段线性目标函数的点的纵坐标值
# 对一些非线性模型,可以使用这一功能去线性逼近。

Gurobi 安装到使用教程(3)_第4张图片

Solution Pool

Gurobi在搜寻最优解的过程中,会找到一些次优解(sub-optimal solutions),有时候用户也希望知道次优解的具体 情况。因此Gurobi会将计算过程中发现的所有解记录在Solution Pool里供用户查询。
Solution Pool参数
Gurobi 安装到使用教程(3)_第5张图片
Solution Pool 里的解按照质量非增排序,并从零开始编号。因此,查询具体解的情况(变量值和对应目标值等) 需要先设定参数SolutionNumber的值,然后通过模型属性PoolObjVal和变量属性Xn获得目标值和变量值。
例如:查询pool里面第4个解(索引为3)的目标值和变量值。

model.setParam(GRB.Param.SolutionNumber, 3) 
print("obj = ",  model.PoolObjVal) 
for iin range(model.NumVars): 
	print(Vars[i]. VarName, " = ", Vars[i].Xn)

你可能感兴趣的:(Python,python)