基于学习的方法决定在哪些分支节点上运行heuristic算法

简介: 基于学习的方法决定在哪些分支节点上运行heuristic算法

论文阅读笔记,个人理解,如有错误请指正,感激不尽!该文分类到Machine learning alongside optimization algorithms。

1 混合整数规划求解

混合整数规划问题(MIP)目前比较有效的算法就是branch and bound,branch and cut等。很多商业的或者非商业的MIP solver用的都是这些框架。branch and bound构建MIP的搜索数,通过搜索策略(DFS、BFS等)对分支树进行搜索,通过求解节点的linear relaxation(LP)获得节点的下界(lower bound)。如果LP解满足整数约束(IP),则可认为找到了原问题的一个可行解(feasible solution),branch and bound记录在搜索过程中找到的可行解,并维护一个最优可行解作为全局的上界。当节点的下界比上界还差时,则减掉该支路。最终遍历所有支路,获得最优解。

2 Primal Heuristic

通过branch and bound,branch and cut等求解MIP时,通常需要花费大量的计算时间,因为很多问题的LP模型获得的lower bound非常差。在分支节点上运行heuristic算法对可行解进行搜索,可大大提高搜索的速度。比如在前期通过heuristic找到一个较好的上界,可以使得branch and bound在搜索的过程中减掉很多没用的支路,从而加快优化的速度。

在现在常用的MIP solver中已经集成了很多成熟的heuristic算法,例如在IBM 的CPLEX中对heuristic有这样一段说明:

何为探试?


定义探试,并描述 CPLEX 在 MIP 优化中应用探试的条件。


在 CPLEX 中,探试是一个过程,用于尝试快速生成良好或近似的问题解,但缺少理论保证。在求解 MIP 的上下文中,探试是可以生成一个或多个解的方法,它可满足所有约束和所有整数性条件,但没有关于是否已找到最佳可能解的指示。


这些探试解集成到分支裁剪中,在提供最优性证明方面可实现与分支所生成的任何解相同的优势,在许多情况下,它们可以加快最终最优性证明的速度,或者可以提供次最优但高质量的解,而所需的时间比单单进行分支更短。使用缺省参数设置时,CPLEX 将在探试可能有益时自动调用探试。


CPLEX 提供了探试系列,用于在分支裁剪过程中寻找节点(包括根节点)处的整数解。下列主题对这些探试系列进行阐述。

其中一个比较关键的问题就是:在分支树的哪些节点运行heuristic有可能获得更好的结果?这样就引出了这篇文章的motivation:通过对模型的训练,将机器学习的模型集成到MIP的求解过程中,在分支节点中模型决定是否运行heuristic。模型必须是online的,即训练好以后,在进行预测时只知道当前节点以及分支树的信息,整颗分支树或者剩下节点的信息。

在这篇文章中,作者给这个模型取了一个很有深意的名字,叫oracle,中文翻译过来叫“神谕”,简直是绵羊放山羊屁--既洋气又骚气……

640.png

3 数据特征

机器学习是通过输入的数据来给出预测的结果,而应当输入数据的特征应当良好地反映问题当前的状态,这样才能给出准确的结果。这篇论文中使用了49个数据特征:

640.png

  • Global features通过一些"gap"描述了当前搜索的状态;
  • Node LP features使用了节点N的LP解来指示一些节点的特征(括号中的x2表示该特征包含了更细一级的两个特征,下同);
  • Scoring Features for Fractional Variables受启发于大多数diving heuristics中使用的scoring functions,该函数主要用于选取下一个分支的变量。

4 训练数据收集

机器学习的一大关键(亦是难点)就是训练数据的收集。给定一个MIP算例集合,,一个用于搜索过程中的启发式算法,那么关于的数据集可以从每一个算例上获取,最终的训练集为。

作者在每个分支节点上运行,然后收集0-1分类标签值,以及数据特征向量。如果在节点找到了一个可行解,否则为0。但是如果在节点找到了一个更好的可行解,那么有可能会影响到在之后的节点的值。这样收集的数据是有问题的。

因此作者采取的数据收集策略是:在每个节点运行,但是找到的可行解并不替换当前的可行解,这样从分支定界的角度看,就相当于每个节点都不运行了。其次,收集的数据时,其他的启发式算法都采用默认设置(一个solver在求解过程中会调用多种heuristic)。

5 实验

作者修改了开源的SCIP规划求解器,并使用CPLEX作为SCIP的LP solver。机器学习采用框架scikit-learn,使用logistic regression (LR)来学习一个二进制的分类模型。

作者选取了SCIP中10个Heuristic算法进行训练,每个算法训练了一个模型,运行时10个模型都加载进去,策略是Run-When-Successful,即oracle说能成功的时候就运行该heuristic,否则不运行。其他启发式算法则采用默认设置。所提出的框架在MIPLIB2010 Benchmark上的对比结果如下(DEF表示使用SCIP默认设置,ML采用提出的oracle):

640.png

其中Primal integral为评判搜索过程中算法好坏的,粗略的介绍如下图,总之就是该指标越小越好:

640.png

可以看到,相比默认设置,作者提出的结合oracle在各项指标上均取得不错的效果。其实从训练的结果来看,准确率是非常低的,但是默认的设置下准确率(能找到可行解的比例)更低。因此这个oracle还是有一定的价值的。

参考文献

[1] Khalil E B , Dilkina B , Nemhauser G L , et al. Learning to Run Heuristics in Tree Search[C]// Twenty-sixth International Joint Conference on Artificial Intelligence. 2017.

相关文章
|
5天前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
1天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
9天前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
15 2
|
2月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
2月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
21天前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
32 9
|
2月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
22 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
2月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
146 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
2月前
|
Kubernetes 算法 调度
在k8S中,Scheduler使用哪两种算法将Pod绑定到worker节点?
在k8S中,Scheduler使用哪两种算法将Pod绑定到worker节点?
|
2月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
下一篇
无影云桌面