当前位置: 首页 > news >正文

GUROBI之数学启发式算法Matheuristics

参考运小筹的帖子:优化求解器 | Gurobi 数学启发式算法:参数类型与案例实现 - 知乎 (zhihu.com)

      简言之,数学启发式是算法就是数学规划和启发式算法的融合,与元启发式算法相比,数学启发式算法具有更强的理论性。

       在GUROBI求解器中,整体算法框架依然是数学规划算法,只是在其中的某些环节采用了启发式算法以更快获得可行解来加速算法收敛。

GUROBI求解MIP问题默认的框架是branch and cut,但是在 branch and cut tree 的探索中,在每个节点处,会调用30多种启发式算法,用于快速获得高质量的整数可行解,进而加速上界(min 问题)的更新Gap的收敛。此外,每个节点上也会调用二十多种 cutting plane 算法来生成割平面,收紧模型,逼近该节点的可行域的凸包,收紧下界。

以一个MIP问题的求解日志来说明GUROBI中的数学启发式算法:使用默认的求解方式,得到的求解日志如下:

presolve:代表在正式求解前对模型进行预处理,对模型进行简化

Incument:当前找到的最好的可行解

H 标注的代表使用启发式算法找到了新的可行整数解:红色框的一栏表示使用启发式算法找到了初始可行解462.2,此时算法找到的下界是357.53333,因此此时的gap为22.5%,求解历时1秒

* 标注的代表使用经典割平面法且找到了新的可行整数解

可见,GUROBI默认的求解过程中多次使用了数学启发式算法。

通过设置求解参数,我们也可以改变GUROBI求解过程中的一些细节:

model = read("VRPTW_r102_20_5.mps")
model.optimize()   #  不设置参数,默认方式求解model = read("VRPTW_r102_20_5.mps")
model.setParam("MIPFocus", 1)   #  设置MIPFocus参数,具体含义见原帖
model.optimize()model = read("VRPTW_r102_20_5.mps")
model.setParam("Heuristics", 0)  # 设置Heuristics参数
model.optimize()model = read("VRPTW_r102_20_5.mps")
model.setParam("ZeroObjNodes",100)
model.optimize()model = read("VRPTW_r102_20_5.mps")
model.setParam("PumpPasses",1000)
model.optimize()model = read("VRPTW_r102_20_5.mps")
model.setParam("RINS",1000)
model.optimize()

总结:个人感觉针对不同的问题可能适合不同的参数设置,但更多的可能依靠的是经验值。

相关文章:

  • Python中的区块链技术与应用
  • Linux 网络套接字编程基础
  • 人工智能在未来的优势
  • SpringBoot使用log4j2将日志记录到文件及自定义数据库
  • Django快速入门
  • Kafka 技术指南:使用、特性、一致性保证与 Golang 中间件应用(下)
  • 【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)
  • 【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列二:Fast R-CNN图文详解
  • 走进网络世界 了解一些基础知识
  • rabbitmq-spring-boot-start配置使用手册
  • 数字孪生10个技术栈:数据清洗-数据的洗衣机
  • Qt+FFmpeg+opengl从零制作视频播放器-15.音视频一些知识
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Toggle)
  • VS 调试Hololens 2工程报错 有未经处理的异常: Microsoft C++ 异常:
  • 2115. 从给定原材料中找到所有可以做出的菜
  • #Java异常处理
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript 基础知识 - 入门篇(一)
  • jdbc就是这么简单
  • k8s 面向应用开发者的基础命令
  • Python3爬取英雄联盟英雄皮肤大图
  • tensorflow学习笔记3——MNIST应用篇
  • underscore源码剖析之整体架构
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 大数据与云计算学习:数据分析(二)
  • 区块链共识机制优缺点对比都是什么
  • 深度学习在携程攻略社区的应用
  • 通过git安装npm私有模块
  • 译米田引理
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #Linux(Source Insight安装及工程建立)
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #数学建模# 线性规划问题的Matlab求解
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (11)MATLAB PCA+SVM 人脸识别
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)大型网站架构演变和知识体系
  • (转载)从 Java 代码到 Java 堆
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core Web APi类库如何内嵌运行?
  • .NET delegate 委托 、 Event 事件,接口回调
  • @Autowired自动装配
  • @Documented注解的作用
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn