在初始使用的时候,很多人觉得,最起码我是这么觉得,gurobi是个黑箱。即:只要输入决策变量,目标函数,和约束,直接调用model.optimize()即可,至于optimize是怎么求解,不了解不知道也没办法干预。

但其实不是的。

model.optimize()的完整形式是model.optimize(callback=none),既我们没有赋予括号中任何信息。但其实callback功能十分强大,在后期实现分支定价,分支切割算法的时候经常用。

callback可以实现监视,干预,也就是部分程度和gurobi求解器实现交流交互,管理gurobi的优化进程。更多callback的分析可以看gurobi自带的参考资料,即refman.pdf文件。

1.callback的使用

首先需要定义callback即回调函数,然后model.optimize(所定义的callback函数),即传入定义的callback函数即可。

而定义callback函数,有固定的模式,是半定制的形式(不像我们编程其它的函数,从头到尾都是自己定义;也不是全部定义好了,只需调用)。

callback里头的参数是where和what两个,where的取值直接决定了what的取值,即在什么地方(where)获取什么信息(what),因此二者要正确对应。where是callback函数的触发点,表明了我们在哪里进行callback的调用;而what是要进行的操作,即能够获取什么信息。其中where的取值有9种,what的取值也有很多种。比较常用的what取值是:

MIP_SOL:当前解的具体取值

MIP_OBJ:新解的目标值

MIP_OBJBST:当前最优的目标值

MIP_OBJBND:当前最优界

MIP_ODCNT:当前已搜索的节点数

MIP_SOLCNT:当前发现可行解的数量

MIP_CUTCNT:当前割平面使用次数

MIP_NODLFT:当前未搜索的节点数

MIP_ITRCNT:当前单纯形迭代步数

...

调用也很简单,如下述:

if where== grb.GRB.Callback.MULTIOBJ:  # whereprint(model.cbGet(grb.GRB.Callback.MULTIOBJ_OBJCNT))  # what

可以看到,需要用model.cbGet(what)获取信息。

2.callback其它常用函数

除了model.cbGet(what)之外,还有其它的一些常用函数来获取运行过程中的信息或修改模型运行状态。如:

        (1)model.cbGetNodeRel(vars):在callback函数中获取当前节点的线性松弛的解中决策变量的取值,即当前节点的松弛解。vars 为要查询的变量,需要注意的是,只有在where == GRB.Callback.MIPNODE并且 CRB.Callback.MIPNODE STATUS == GRB.OPTIMAL两个条件同时成立时才能使用。

# 查询变量在当前节点的松弛解
def mycallback(model, where):if where == GRB.Callback.MIPNODE and model.cbGet(GRB.Callback.MIPNODE_STATUS) ==                GRBOPTIMAL:print(model.cbGetNodeRel(model._vars))model._vars= model.getVars()
model.optimize(mycallback)

(2)model.cbGetSolution(vars): 获取MIP的当前解(整数解),或者说查询变量在新可行解中的值。

(3)model.cbLazy(lhs, sense, rhs):向MIP模型中添加一个lazy惰性约束,需要设置model.Params.lazyConstrains=1,即启用lazy约束。使用场景是:当模型中的约束集太大无法全部添加时(比如TSP破除子回路的约束,初始肯定不可能把所有的节点的真子集子回路避免约束全部添加进去),通常会使用lazy约束。通过只包含在分支割平面搜索过程中不满足条件的约束(即只有在被违反时才会起作用),有时也可以在只添加完整约束集的一部分时找到经验证的最优解。在添加lazy cut时应该先查询当前节点的解(通过cbGstSolution获取GRB.CB_MIPSOL或通过该cbGetNodeNodelRel获取GRB.CB_MIP_NODE)。

for m in model.getVars():if (m.varName.startswith('x')):a = (int)(m.varName.split('_')[1])  #m.varName为'x_10_9'.split('_')为['x','10','9']b = (int)(m.varName.split('_')[2])x_value[a][b] = model.cbGetSolution(m)  # 获取model中变量的值

(4)model.cbCut(lhs, sense, rhs):用于求解MIP问题时,在节点添加割平面。虽然割平面可以添加到树枝和切割树的任何节点,但是它们会增加在每个节点处求解松弛模型的大小,并且会显著降低节点处理的速度,因此应谨慎添加。除此以外,割平面通常用于切断当前松弛解,要在当前节点上检索松弛方案,因此应该先调用cbGetNodeRel。也必须将参数precrush设置为1,即model.Params.PreCrush = 1,意思是关闭gurobi预处理对模型约束的转化。

(5)model.cbSetsolution(vars, solution):将一个已知解(完整的),或已知解的部分信息(部分解)传递给当前模型。如将启发式求解得到的解作为上界传给gurobi,gurobi可以在它的基础上求解,从而加快模型整体求解。如果要指定多组变量的值,可以多次调用该方法。

(6)model.cbUseSolution():使用cbUseSolution导入一个解后,可以调用cbUseSolution来计算这个解对应的目标函数。

gurobi中callback函数的使用整理相关推荐

  1. Keras中Callback函数的使用

    回调函数是一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息.通过传递回调函数列表到模型的.fit()中,即可在给定的训练阶段调用该函数集中的函数. [Ti ...

  2. keras中的fit函数参数_keras的fit_generator与callback函数

    fit_generator函数 fit_generator函数 callback类 每一个epoch结束(on_epoch_end)时,都要调用callback函数,callback函数(类)都要集成 ...

  3. c 打印 callback 函数名_Go 中的函数

    1. 函数参数和返回值的写法 如果有多个参数是同一个类型,可以简略写: func testReturnFunc(v1,v2 int)(int,int) {x1 := 2 * v1x2 := 3 * v ...

  4. java addcallback函数_java中怎么使用callback函数?

    UYOU 在很多场景,作为开发都会想到,在执行完毕一个任务的时候,能执行一个callback函数是多么好的事情.现在模拟一下这个情景:定义三个类.分别是主函数类.callback函数的接口类.业务处理 ...

  5. C++中回调函数(CALLBACK)初探

    C++中回调函数(CALLBACK)初探 简介 对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理.本文将要解释什么是回调函数.它们有什么好处.为什么要使用它们等等问题,在开始之前 ...

  6. 二级计算机的office用到哪些函数,计算机二级MS office excel中所用函数整理

    <计算机二级MS office excel中所用函数整理>由会员分享,可在线阅读,更多相关<计算机二级MS office excel中所用函数整理(11页珍藏版)>请在人人文库 ...

  7. Java中callback作为函数参数传递

    反射方法类Method 需要callback函数为变量时,java通常用反射(java.lang.reflect)的相关方法. import java.lang.reflect.Method; 利用M ...

  8. php中date里面的参数,PHP中date()日期函数有关参数整理

    PHP中date()日期函数有关参数整理 更新时间:2011年07月19日 22:47:41   作者: PHP中date()日期函数有关参数整理,需要的朋友可以参考下. 在页面的最前页加上 date ...

  9. 《APUE》中的函数整理

    第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. ...

最新文章

  1. docker之Dockerfile实践
  2. 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3)
  3. android bitmap xml,XML Bitmap
  4. 站在我个人的角度上来说。。。。。
  5. ReactNative从零到完整项目-Flexbox使用
  6. 模块之序列化模块json
  7. 情感分析入门[2]-一些数学工具
  8. ColorTransform类应用实例:鼠标经过时使图片发光。
  9. 在MySQL中以下属于ddl语句的_ddl语言(以下哪些命令是ddl语句)
  10. GB2312编码理解
  11. 基于STM32F405平台的多摩川协议编码器通讯过程(2)
  12. 潇洒郎: PDF加密 设置不可打印 - 福昕高级PDF编辑器或者Adobe Acrobat
  13. 数据结构--图的深度优先遍历
  14. cmd检查java_如何通过cmd查看java环境
  15. php mp4 ckplayer,ckplayer:超酷网页视频播放器
  16. Web前端HTML、CSS测试:世界地球日
  17. 信息学奥赛一本通 1400:统计单词数 | 1954:【11NOIP普及组】统计单词数 | OpenJudge NOI 1.12 05 | 洛谷 P1308 [NOIP2011 普及组] 统计单词数
  18. ipad/ios按钮背景颜色为渐变色?去除iOS按钮渐变色
  19. 漫画:5G 到底是个什么玩意儿?
  20. Tera - 高性能、可伸缩的结构化数据库

热门文章

  1. 戴尔X数字战略,成就未来企业
  2. DMZ-demilitarized zone 隔离区
  3. 小程序 获取短信验证码 功能实现
  4. 学习笔记(1):CCNA视频----从零开始学CCNA实验视频课程(加强版)-课程介绍【有资料下载】...
  5. 装备合成系统(最大限度地合成目标装备)
  6. Linux基础指令(有图有真相,附实例)
  7. 只用十几行python代码向靓仔打招呼?这不分分钟~
  8. oracle里面substr,Oracle substr函数用法
  9. 5 月全球数据库排名:PostgreSQL 有所回升;Fedora 开始支持 Google Chrome 和 Steam
  10. Spring任务调度task:scheduled-tasks【含cron参数详解】