Gurobi的callback机制学习随记
Callback函数的主要作用:获取程序运行中的一些中间信息,或者在程序运行过程中动态修改程序运行状态,如用户有时在求解过程中需要实现一些自定义的高级功能,包括终止优化,加入额外约束条件(割平面)、加入自定义的算法等,不过需要注意不要在callback中改变模型求解参数,这可能会导致未知错误。
Callback函数的定义和使用方法是固定的:
定义:def函数名(model,where):函数体
使用:model.optimize(callback的函数名)
Callback函数使用时涉及到的两个重要参数:
where:回调函数触发点,使用:where==GRB.Callback.XXXX
what:获取何种信息,这取决于触发点where,使用:model.cbGet(GRB.Callback.XXX)
状态where和值what归纳:
.POLLING:使得交互应用程序可以频繁的重新获得控制权,从而保证程序的响应性,注意该轮询回调下是无法查询任何信息;
2.PRESOLVE:在模型预处理的时候触发,用来查询当前预处理对模型的转化信息,如查询预处理删除的变量数、约束数量等;
3.SIMPLEX:查询当前单纯形的信息,如当前单纯形法迭代的次数,目标函数值等;
4.MIP:查询混合整数规划的信息,如当前的最优值,最优界,已探索和未探索的节点数量,当前Gurobi添加的割平面的数量等;
5.MIPSOL:发现新的可行解的时候触发,可以用来查询当前可行解的目标值、变量取值等,也可以向当前模型中添加Lazycut;
6.MIPNODE:探索新的节点的时候触发,注意Gurobi在处理根节点时,每当添加一个新的割平面,也会触发这个节点callback,因此实际中在处理根节点可能会多次调用callback且只有第一次MIPNODE回调报告的是没有添加切割平面的松弛;该callback主要用来查询当前节点的一些信息,如当前节点的优化状态,当前节点的松弛解,也可以用来向模型中添加一般的cut和Lazycut;
7.MESSAGE:用来打印LOG信息;
8.BARRIER:用来查询内点法信息,如内点法迭代次数,对应的目标值等;
9.MULTIOBJ:用来查询多目标的信息,当前已优化的目标数量,当前发现的可行解的数量。注意如果是MIP模型,则MIP相关的callback会被调用,如果是LP模型,则LP相关的callback也会被调用;
what的取值依赖于where!!!