参数主要指的是启动前需要设置的行为:
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)
(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)
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")
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")
addGenConstrAbs( resvar, argvars, name )
# resvar 变量
# argvar变量
# name 广义约束名称
# 例如: x = |y|
m.addGenConstrAbs(x, y, "absconstr")
# 换成一般的约束表达方式:
m.addConstr(x == abs_(y), "absconstr")
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")
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")
# 如果 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])
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在搜寻最优解的过程中,会找到一些次优解(sub-optimal solutions),有时候用户也希望知道次优解的具体 情况。因此Gurobi会将计算过程中发现的所有解记录在Solution Pool里供用户查询。
Solution Pool参数
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)