启发式方法的核心在于通过经验规则或局部优化策略高效求解复杂问题。 构筑法(如贪婪算法、插入法)通过逐步添加成分从零构建解,适用于快速生成初始可行解,但可能陷入局部最优; 改进法(如局部搜索、模拟退火)则通过在已有解的邻域内迭代优化来提升解质量,其中局部搜索是改进法的典型代表,依赖邻域结构进行精细化调整。两者常结合使用——先用构筑法生成初始解,再通过改进法进行优化,形成"构造-优化"的完整求解框架,兼顾效率与解的质量。
一、改进法(Improvement Methods)
改进法(Improvement Methods) 在已有解的基础上进行优化,逐步提升解的质量。
1.1 局部搜索(Local Search)
局部搜索是改进法的一种具体实现方式,通过在当前解的“邻域”内寻找更优解,逐步迭代优化。 依赖邻域结构,可能陷入局部最优。
- 广义概念:包含所有通过邻域改进解的方法,爬山算法是其中一种特例。
- 核心思想:定义解的“邻域”(如交换两个城市、翻转一段路径),并在邻域内寻找更优解。
- 特点:
- 灵活性:可自定义邻域结构和移动策略(如允许暂时接受更差解,如模拟退火)。
- 不限于贪婪:可能包含跳出局部最优的机制(如禁忌搜索的“禁忌表”)。
- 常见类型:模拟退火、禁忌搜索、迭代局部搜索等。
1.2 Local Search代表性方法
爬山算法(Hill Climbing)
- 核心思想:从当前解出发,不断向邻域中更优的解移动,直到无法改进为止(达到局部最优)。
- 特点:
- 单点搜索:每次只保留当前解,不保留历史路径。
- 贪婪性:只接受比当前解更好的邻域解。
- 易陷入局部最优:无法逃脱局部极值。
- 变体:随机重启爬山(通过多次随机初始点避免局部最优)。
模拟退火(Simulated Annealing, SA)
以一定概率接受劣解(概率随“温度”降低而减小),避免陷入局部最优。
禁忌搜索(Tabu Search, TS)
通过禁忌表记录近期移动,禁止重复操作,强制探索新区域。
迭代局部搜索(Iterated Local Search, ILS)
- 原理:在局部最优解上施加扰动,重新启动局部搜索,保留历史最优解。
- 步骤:
- 用基础方法(如爬山)找到局部最优。
- 扰动当前解(如随机交换部分元素)。
- 重新局部搜索,更新全局最优。
变邻域搜索(Variable Neighborhood Search, VNS)
- 原理:动态切换多种邻域结构,扩大搜索范围。
- 步骤:
- 在当前邻域找不到改进时,切换到更大/不同的邻域。
- 交替使用“抖动”(随机扰动)和局部搜索。
- 优势:避免单一邻域的局限性。
大邻域搜索(Large Neighborhood Search, LNS)
通过破坏-修复策略生成大范围邻域(如移除并重新插入路径中的多个节点)。
1.3 LS常见方法总结
方法 | 核心机制 | 优点 | 典型应用 |
---|---|---|---|
爬山算法 | 贪心接受更优解 | 简单快速 | 连续优化、简单问题 |
模拟退火 | 概率接受劣解 | 能逃离局部最优 | TSP、物理系统建模 |
禁忌搜索 | 禁忌表避免循环 | 长期记忆,高效探索 | 调度、路径优化 |
迭代局部搜索 | 扰动+重启 | 平衡深度与广度 | TSP、大规模组合问题 |
变邻域搜索 | 多邻域切换 | 灵活适应问题结构 | 图优化、物流 |
引导式局部搜索 | 动态惩罚劣解特征 | 自适应引导搜索 | 约束优化、VRP |
1.4 局部搜索与邻域搜索的区别
邻域搜索(Neighborhood Search)和局部搜索(Local Search)是优化算法中密切相关的两个概念,但它们的定义和侧重点有所不同。以下是它们的核心区别和联系:
维度 | 邻域搜索 | 局部搜索 |
---|---|---|
定位 | 邻域解的生成方法 | 完整的迭代优化算法框架 |
目标 | 如何定义和遍历解的邻域 | 如何通过邻域改进找到更优解 |
是否包含策略 | 仅生成候选解,无接受准则 | 包含邻域生成+解接受策略(如贪婪、退火) |
示例 | 2-opt邻域(TSP中交换两条边) | 模拟退火(基于邻域搜索+概率接受) |
-
邻域搜索是局部搜索的基础:
任何局部搜索算法都需要依赖邻域搜索来生成候选解。例如:- 在爬山算法中,邻域搜索生成所有可能的邻域解,然后选择第一个更优解。
- 在禁忌搜索中,邻域搜索生成解后,再通过禁忌表筛选可接受的移动。
-
局部搜索扩展了邻域搜索:
局部搜索不仅包含邻域生成,还引入了策略来指导搜索方向(如避免循环、跳出局部最优)。 -
总结
- 邻域搜索:解决“如何生成候选解”的问题(技术细节)。
- 局部搜索:解决“如何通过候选解找到更优解”的问题(算法策略)。
- 关系:邻域搜索是局部搜索的“引擎”,局部搜索是邻域搜索的“控制器”。
二、构筑法(Constructive Methods)
构筑法是一类通过逐步构建解的优化算法,其核心思想是从零开始,每次添加一个部分解(如一个决策变量、路径中的节点等),直到形成一个完整的可行解。与邻域搜索或局部搜索(通过改进现有解)不同,构筑法属于“生成式”方法,适用于组合优化、路径规划、调度等问题。其核心特点为:
- 构造性(增量构建):从空解或初始部分解开始,逐步添加成分(如TSP中逐个选择城市)。逐步构建解(如路径、集合),而非改进现有解。
- 无邻域概念:直接基于问题规则做选择(如Dijkstra算法选最短边)。
- 无回溯:大多数构筑法一旦选择某一步骤,就不再撤销(除非结合回溯或启发式修正)。
- 贪婪性:常基于启发式规则(如最短边优先)即时决策,可能陷入局部最优。
- 高效但次优:速度快,但解的质量可能不如改进型算法(如局部搜索)。
2.1 常见算法示例
(1) 贪婪算法(Greedy Algorithm)
- 步骤:每一步选择当前最优的局部决策。
- 例子:
- Prim算法(最小生成树):每次选择连接树的最短边。
- Dijkstra算法(最短路径):逐步扩展距离最近的节点。
(2) 最近邻法(Nearest Neighbor, TSP)
- 步骤:从起点出发,每次选择距离当前城市最近的未访问城市。
- 缺点:可能生成明显劣质解(尤其是对称性差的问题)。
(3) 插入法(Insertion Heuristics)
- 步骤:初始部分解(如2个城市),逐步插入剩余节点到最优位置。
- 例子:最远插入法(Farthest Insertion)优先插入距离当前路径最远的节点。
(4) 渐进式构造(如蚁群算法)
- 步骤:通过概率模型(如信息素)逐步构建解(如蚂蚁选择路径)。
三、改进法vs构筑法
维度 | 构筑法 | 改进法(如局部搜索) |
---|---|---|
起点 | 空解或部分解 | 完整初始解(可能随机生成) |
过程 | 增量添加成分 | 迭代修改现有解(如交换、删除) |
解质量 | 可能较低(依赖启发式) | 通常更高(可通过多次迭代优化) |
速度 | 快(单次构建) | 慢(需多次邻域搜索) |
典型应用 | 初始解生成、实时决策 | 解的精化、全局优化 |