在使用启发式算法的时候,一个常见的问题是融入陷入局部最优,导致很长时间内算法的解难以得到改进,现总结一下几种常见的元启发式如何跳出局部最优。
一、跟算法内部设计无关: 使用多个初始解搜索;
二、跟算法内部设计有关:接受较差的解/扰动/交叉变异
【启发式|元启发式如何跳出局部最优()】SA: 若新解优于原解,接受,否,以一定概率/接受标准 exp((sol.Cost-newsol.Cost)/ck)接受较差解。
VND:纯静态算法,邻域只有一个的话,跟爬山无异;跟爬山相比多了邻域的个数。
VNS:shake策略,扰动初始解,shaking本质上来说也是邻域搜索的一种,但需要注意的是,shake强度不能太小,不然很容易被局部搜索拉回,且shake对解的扰动程度比local search要强;同时shake的强度不能太大,不然与random search无异。
GA:通过交叉/变异跳出局部最优;
- 交叉:需要两个父代的基因进行互换产生新的个体,改动程度比较大,类似于VNS当中的扰动,常见算子(OX、PMX、CX)
- 变异:针对单个个体按照一定概率对某些基因进行swap、insert等操作得到新的个体,类似于local search中的邻域算子;
Tabu:通过禁忌列表的设置保证跳出局部最优。
推荐阅读
- 算法|【整数规划算法】列生成(理论分析+Python代码实现)
- 算法|AAAI2021(面向交通流预测的时空融合图神经网络)
- 算法|图神经网络(01)-图与图学习(上)
- 神经网络|干货!图神经网络及其自监督学习
- 数据结构|数据结构学习笔记(第六章 图)
- C数据结构|C数据结构(哈夫曼树算法实现与应用)
- 数据结构|数据结构(图(Graph)【详解】)
- 数据结构|数据结构(树(Tree)【详解】)
- DHU-----OJ|邻接表(顶点u的下一个邻接点)