一、Gorubi参数修改方法
对于Gorubi参数的修改有3种方法:一种是 setParam(paramname,newvalue)方法,其中param-name还有两种方法,一种是参数的字符串,比如“TimeLimit”,一种是完整的类属性,比如“gkb.CRB.param.TimeLimit”;第三种方法是直接修改类的属性,写法是model.Paramsxxx,代码如下所示。
import gurobipy as grb
model = grb.Mode1()
#设定求解时间的方法
#方法1
model.setParam('TimeLimit',600)
#方法2
model.setParam(GRB.param.TimeLimit, 600)
#方法3
model.Params.TimeLimit = 600
二、Gorubi参数修改的例子
代码选自 Gurobi安装目录下的 example 下的 paramspy,演示了如何在优化器启动前修改timeLimit 参数和MIP模型的 MIPFocus 参数。通过这个例子可以了解到修改和调整 Gurobi的运行参数并不难,同时还学习了如何比较不同参数下模型求解的结果。
import gurobipy as grb
# 读取模型文件
model_file = 'xxx.lp'
m = grb.read(model_file)
# 参数设定1:设定优化器求解时间限定为2秒
m.Params.timeLimit = 2
# 复制模型
bestModel = m.copy()
bestModel.optimize()
# 修改模型参数比较不同参数下的求解结果
for i in range(1, 4):
m.reset() # 将所有参数重置为默认值
m.Params.MIPFocus = i # 参数设定2:修改 MIPFocus 参数
m.optimize()
if bestModel.MIPGap > m.MIPGap:
bestModel, m = m, bestModel # swap models
# 最后将运行参数修改为默认值,重新运行模型
del m
bestModel.Params.timeLimit = "default"
bestModel.optimize()
print('Solved with MIPFocus: %d' % bestModel.Params.MIPFocus)
三、、Gorubi自动调优
在上面的例子中,使用for 循环来判断模型结果更优就是一种参数调优方法,然而 Gurobi提供了另一种模型自动调优的方法。通过下面的例子观察 Gurobi是如何进行参数调优的,这个例子取自Gurobi安装目录下example文件夹中的tune.py参数。
从代码中可以看到,model是一个类,其方法getTuneResult0会将其返回的属性赋值给内部的 self属性,相当于覆盖模型内部的默认属性,如代码所示。
import gurobipy as grb
# 读取模型
model = grb.read('tune_model.lp')
# 将返回最优参数组合数设置为1
model.Params.tuneResults = 1
# 开始自动调参
model.tune()
# 如果找到最优参数组合数大于0
if model.tuneResultCount > 0:
# 获取最优参数组合
# 注意到getTuneResult会覆盖内部默认属性
# 参数组合按最优到最差降序排序,最好的结果序号是0
model.getTuneResult(0)
# 将调参后的参数组合保存到文件
model.write('tune.prm')
# 用获取到的最优参数组合再次求解模型
model.optimize()
上一条:Gurobi-第二章Gurobi常用参数
下一条:Gurobi-第四章Gurobi属性和修改方法