参数类别 | 属性 | 例子 |
---|---|---|
Termination | 停止参数,控制求解停止条件 | TimeLimit设置时间; SolutionLimit设置MIP可行解数量 |
Tolerances | 容差参数,控制求解器的最优或可行的偏差 | MIPGap设置MIP的gap值; FeasibilityTol设定精度 |
Simplex | 单纯形参数,控制单纯形法 | InfUnbdInfo控制是否获取不可行或无界模型的额外信息 |
Barrier | 障碍法参数,控制障碍法 | QCPDual控制是否获取二次模型的对偶值 |
Mip | 混合整数参数,控制混合整数规划算法 | BranchDir设定优先分支方向; Heuristics设定启发式算法求解时间所占的比重 |
Mip Cuts | 割平面参数,控制割平面 | Cuts设定割平面法的强度 |
Tuning | 调参参数,控制调参工具 | TuneCriterion设定调参的准则; TuneTimeLimit设定调参的时间 |
Multiple Solutions | 多解参数,尝试寻找多个解 | PoolSolutions 决定存储可行解的数量 |
常用参数 | 属性 | 取值 |
TimeLimit | 时间设定 | 单位秒 |
MIPFocus | 设定MIP的求解侧重点 | 0 默认。均衡搜寻可行解和证明最有; 1 侧重快速找到可行解; 2 侧重证明最有; 3 侧重界的提升(发现界提升缓慢) |
Method | 设定线性模型或MIP根节点的求解方法 | -1 默认,(3LP, 2 QP/QCP, 1 MIP); 0 初始单纯形; 1 对偶单纯形; 2 内点法; 3 (0,1,2) 并发(线程数,重复运行最基本可能不同) 4 确定性(0, 1, 2)并发,重复运行结果相同; 5 确定性(0, 1)并发,重复运行结果相同 |
LogToConsole | log记录是否在控制台显示 | 0 关闭控制台显示; 1 打开控制台显示(默认) |
LogFile | 设定log文件名称 | 默认空字符串 |
Presolve | 控制预处理的程度 | -1 默认 ,0 关闭预处理,1 保守倾向; 2 进取倾向(耗时多,处理后的模型更紧凑) |
MIPGap | 设定gap值 | 0.0001默认,小于给定的值终止计算 |
ImproveStartGap | 提升策略开始gap值 | 0.0 默认,例如取0.1,给gap < 0.1,开始提升策略 |
ImproveStartNodes | 提升策略开始节点值 | Infinity 默认,例如取5,当前节点数 > 5,开始提升策略; |
ImproveStartTime | 提升策略开始的时间 | Infinity默认,例如取100,当运行时间到100s时,开始提升策略 |
ObjNumber | 目标函数索引(多目标) | 索引从0开始编号 |
参数设置方法
属性类别 | 例子 |
---|---|
Model Attributes 模型属性 | ModelSense 模型优化方向(最大值或最小值); Objval 当前目标值。 |
Variable Attributes 变量属性 | X 当前变量的取值; Start MIP初始解。 |
Linear Constaraint Attributes 线性约束属性 | Pi 约束对应的对偶值 Slack 约束的松弛量 RHS 约束的右端项 |
Special-ordered Set constraints Attributes SOS约束属性 | llssos对不可行的模型,指示约束是否属于IlS(Irreducible Inconsistent Subsystem) |
参数设置和查询方法
属性名字 | 作用 | 取值 |
---|---|---|
ModelSense(可调整) | 模型优化方向 | 1 最小化(默认); -1 最大化 |
ObjVal(不可调整) | 目标函数值 | |
Status(不可调整) | 解的状态 | |
LB/UB(可调整) | 变量下界/上界 | double |
Obj(可调整) | 变量的线性目标系数 | oduble |
VType | 变量类型 | C,B,I,S,N |
X(不可调整) | 变量值 | double |
Start(可调整) | 变量的初始值 | double |
RHS(可调整) | 线性约束右端项 | double |
Pi(不可调整) | 线性约束对应的对偶变量 | double |
自动调参
参数名称 | 作用 | 取值 |
---|---|---|
TuneCriterion | 调整调参准则 | -1 默认, 缩短发现最优解所需的时间; 1 最优的Gap; 2 最好的可行解; 3 最好的bound。 |
TuneJobs | 分布式并行调参 | 0 默认. |
TuneOutput | 控制输出结果的量 | 0 没有输出; 1 发现最好参数组合时输出; 2 默认,输出试过的参数组合; 3 试过的参数组合和详细的求解器输出。 |
TuneResults | 返回最优参数组合的数量 | -1 默认,按照调整参数的个数返回调参结果。 |
TuneTimeLimit | 调参时间 | -1 自动选择时间 |
TuneTrials | 每组参数组合运行的次数 | 主要目的减小随机因素的影响 |
特殊约束的表达方式和使用
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。
例如: 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。
例如: x = 0且y = 0,那么z = 0,否则 z = 1
m.addGenConstrOr(z, [x,y], "orconstr")
换成一般的约束表达方式:
m.addConstr(z == or_(x, y), "orconstr")
• 广义约束—Indicator
addGenConstrIndicator(binvar, binval, lhs, sense, rhs, name)
• binvar 指示变量
• binval 指示变量的值{0,1}
• lhs 约束左端项
• sense 约束符号
• rhs 约束右端项
• name 广义约束名称
指示变量的值为1,约束成立,否则约束可以被违反。
例如: 如果 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约束(Special-Ordered Set)
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 实现不同的优化方向。
Gurobi 支持三种多目标模式:
• 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 的所有解中挑选最优解
。
• 混合以上两种。
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 定义分段线性目标函数的点的纵坐标值
对一些非线性模型,可以使用这一功能去线性逼近。
m.setPWLObj(x, [0, 2, 5], [0, 2, 3])
m.setAttr(GRB.Attr.ModelSense, -1)