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()

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

相关推荐
博观而约取厚积而薄发9 分钟前
Pytest 从入门到精通,一篇就够(超详细实战教程)
python·测试工具·单元测试·自动化·pytest
imzed20 分钟前
使用 Playwright + Pytest 构建 Web UI 自动化测试框架
python·自动化·pytest
普通网友25 分钟前
pytest一些常见的插件
开发语言·python·pytest
时空系33 分钟前
Python 高性能高压缩打包器 —— 基于 JianPy 语义分析引擎
python
cndes1 小时前
给Miniconda换源,让包下载更迅速
开发语言·python
froyoisle1 小时前
CSP 真题解析:[CSP-J 2019-T4] 加工零件
c++·算法·bfs·csp-j·算法竞赛·信息学·信奥赛
Metaphor6921 小时前
使用 Python 添加、隐藏和删除 PDF 图层
python·pdf·图层
兰令水1 小时前
hot100【acm版】【2026.7.13打卡-java版本】
java·开发语言·数据结构·算法·leetcode·面试
丨白色风车丨1 小时前
【Python 计算机视觉】基于 Dlib+OpenCV 实现实时人眼疲劳检测(闭眼预警)
python·opencv·计算机视觉