Chap10 局部搜索
返回:0400 算法设计与分析总目录 · 上一章:0409 Chap9 近似算法 · 下一章:0411 Chap11 随机算法
1、学习目标
局部搜索不从全局一次性构造答案,而是从一个可行解出发,通过局部修改不断改进。它适合解空间巨大、精确算法困难、但局部改进容易定义的问题。
| 模块 | 要掌握的内容 |
|---|---|
| 解空间 | 可行解、邻域、目标函数 |
| 局部最优 | 邻域内无法继续改进 |
| 最大割 | 翻转顶点、改进割边数 |
| 终止性 | 目标函数单调改善 |
| 博弈连接 | Nash 均衡、稳定性代价 |
2、局部搜索框架
1 | 从任意可行解 S 开始 |
要定义三件事:
| 项目 | 含义 |
|---|---|
| 可行解 | 什么样的解合法 |
| 邻域 | 一步可以改成哪些解 |
| 改进规则 | 什么叫更好 |
局部搜索的优点是简单、通用;缺点是可能停在局部最优,而不是全局最优。
3、优化地形
可以把所有可行解想象成山地地形:
1 | 点 = 一个可行解 |
最大化问题中,局部搜索像爬山:只要附近有更高的点就走过去。最后停在一个周围都不更高的位置。
局部最优不一定全局最优:
1 | 附近没有更好解,不代表远处没有更好解。 |
4、最大割问题
给定无向图,把顶点分成两组,使跨组边数量最大。
局部搜索策略:
- 初始随机或任意划分。
- 若存在某个顶点,翻转它所在组能增加割边数,就翻转。
- 直到没有顶点能改善。
1 | while exists v with gain(v) > 0: |
每次翻转至少让割边数增加 1,因此在无权图中一定终止。
5、最大割的近似保证
当局部搜索停止时,每个顶点跨组边数不少于同组边数。否则翻转它会增加割。
把所有顶点的不等式加起来:
1 | 跨组贡献 >= 同组贡献 |
因此当前割边数至少占总边数一半。
最优割最多是所有边,所以局部最优解至少是最优值的 1/2:
1 | cut >= OPT / 2 |
这是一个简单的 2-近似。
6、局部搜索的终止问题
局部搜索未必总是快。即使每次都改善,改善次数也可能很多。
常见处理:
| 方法 | 作用 |
|---|---|
| 限制迭代次数 | 工程上防止跑太久 |
| 随机重启 | 跳出坏的局部区域 |
| 模拟退火 | 允许偶尔接受更差解 |
| 改进阈值 | 小收益不再移动 |
| 更大邻域 | 一次做更复杂的局部修改 |
7、Nash 均衡
在博弈中,Nash 均衡指每个参与者在其他人策略不变时,都没有动力单方面改变策略。
这和局部最优很像:
1 | 局部最优:没有一个局部改动能改善目标函数 |
很多系统行为可以看成“个体局部优化”产生的稳定状态。
8、稳定性代价
稳定性代价关注:
1 | 最好的 Nash 均衡 / 全局最优 |
无政府代价关注:
1 | 最坏的 Nash 均衡 / 全局最优 |
它们衡量个体理性和整体效率之间的差距。比如交通路由中,每个人选自己最快路线,整体可能比统一调度更拥堵。
9、局部搜索适用场景
| 场景 | 说明 |
|---|---|
| 解空间巨大 | 全枚举不可行 |
| 可行解容易构造 | 任意初始解即可 |
| 邻域容易计算 | 能快速判断局部改进 |
| 接受近似解 | 不强求全局最优 |
| 工程优化 | 排班、聚类、布局、参数搜索 |
10、易错点
| 易错点 | 修正 |
|---|---|
| 局部最优当全局最优 | 局部搜索通常不能保证全局最优 |
| 没定义邻域 | 邻域决定算法行为 |
| 忘记证明终止 | 需要目标函数单调改善且有界 |
| 最大割翻转条件写反 | 翻转后跨边增加才移动 |
| Nash 均衡理解成社会最优 | 均衡只是个体无动力改变 |
11、复盘清单
| 检查项 | 状态 |
|---|---|
| 能写出局部搜索三要素 | 待复盘 |
| 能解释局部最优和全局最优区别 | 待复盘 |
| 能手动模拟最大割翻转过程 | 待复盘 |
能证明最大割局部搜索的 1/2 保证 |
待复盘 |
| 能说明随机重启和模拟退火的作用 | 待复盘 |
| 能用局部最优类比 Nash 均衡 | 待复盘 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ruiqy~!







