🎯 本章灵魂拷问:“当你不知道自己在哪、世界还爱跟你开玩笑时,该怎么找路?”
一、局部搜索:别管怎么来的,告诉我终点在哪!
🔍 核心思想转变
- 第3章:“我怎么从A到B?”(关心路径);
- 第4章:“我要最好的B!”(只关心最终状态);
就像找对象:第3章是规划追人步骤,第4章是直接刷约会APP照片,看到心动的就右滑。
🎮 四大“登山”算法(找最高点)
1. 愣头青爬山法
def 爬山():
当前位置 = 随便找个地方站着
while True:
邻居们 = 上下左右走一步看看
最高邻居 = 找最陡的上坡路
if 最高邻居 <= 当前位置:
return "我到顶了!" # 可能是小山包
else:
当前位置 = 最高邻居 # 继续爬
致命伤:
- 局部最高点陷阱:爬到个小土坡就以为登顶珠峰;
- 高原迷茫症:四周都一样高,不知道该往哪走;
- 山脊困局:得同时往两个方向走,但一次只能走一步;
2. 爱冒险的随机爬山法
- 策略:不是总选最陡的,而是“看起来不错就试试”;
- 优点:能探索更广,可能找到更高峰;
- 缺点:慢得像在景区闲逛;
3. 大聪明首选爬山法
- 改进:不是看“谁最高”,而是“先看到谁不错就选谁”;
- 结果:比愣头青快,但本质上还是可能困在小山包;
4. 开挂的随机重启爬山法
def 随机重启爬山():
历史最佳 = -∞
for _ in range(100): # 重开100次
本次结果 = 爬山()
if 本次结果 > 历史最佳:
历史最佳 = 本次结果
return 历史最佳
精髓:“如果一次爬不到珠峰,我就传送到世界不同地方重爬100次,总有一次在珠峰脚下开始!”
二、模拟退火:物理学家的浪漫
🔥 核心比喻:打铁与爱情
铁匠打铁时:
- 高温阶段:使劲锤,允许犯错(让铁变形);
- 降温阶段:慢慢来,精雕细琢;
- 最终成型:一把好剑;
算法版:
def 模拟退火():
当前状态 = 随便开始
温度 = 1000度 # 开始时很“狂热”
while 温度 > 0.01度: # 慢慢“冷静下来”
随机邻居 = 随便选个方向走走
高度差 = 邻居高度 - 当前高度
if 高度差 > 0: # 邻居更高,肯定去!
当前状态 = 随机邻居
else: # 邻居更低,但有概率去
接受概率 = exp(高度差 / 温度)
if random() < 接受概率: # 赌一把!
当前状态 = 随机邻居
温度 = 温度 × 0.99 # 降温,越来越理智
为什么有效:
- 开始时:允许“犯错”下坡,探索更多区域;
- 结束时:几乎只上坡,稳固在高峰;
- 数学魔法:理论上能找到全局最优(只要降温够慢);
三、束搜索与进化算法:群众的力量
👥 束搜索(局部束搜索)
def 束搜索(k=3):
人群 = [随机起点] * k # k个人一起爬山
while not 所有人到顶:
所有后代 = []
for 人 in 人群:
后代.extend(人的所有邻居)
# 精英主义:只留最好的k个后代
人群 = 排序(所有后代)[:k] # 优胜劣汰
问题:可能k个人全挤在同一个山沟里 → 变成“k倍慢的爬山法”。
🧬 进化算法(生物模拟版)
def 进化算法():
种群 = [随机个体] * N # 一群生物
for 世代 in range(1000):
# 1. 交配重组
后代们 = []
for i in range(N):
爸 = 轮盘赌选择(种群) # 适应度越高越可能被选
妈 = 轮盘赌选择(种群)
孩子 = 基因混合(爸, 妈) # 各取一半基因
后代们.append(孩子)
# 2. 偶尔突变
for 孩子 in 后代们:
if random() < 突变率:
孩子.基因[随机位置] = 随机值
# 3. 自然选择
种群 = 排序(后代们)[:N] # 保留最好的N个
生物学术语翻译表:
| 算法术语 | 生物意义 | 实际意义 |
|---|---|---|
| 个体 | 一只生物 | 一个候选解 |
| 基因 | DNA编码 | 解的表示(如二进制串) |
| 适应度 | 生存能力 | 目标函数值 |
| 选择 | 适者生存 | 保留好解 |
| 重组 | 有性繁殖 | 混合两个解 |
| 突变 | 基因突变 | 随机微调解 |
四、连续空间搜索:微积分上场了
📏 问题:机场建在哪?
“要在罗马尼亚建3个机场,让所有城市到最近机场的距离平方和最小”。
挑战:
- 每个机场有(x,y)坐标 → 6维连续空间;
- 无限多个可能位置;
- 传统“走一步看看”失效;
三大武器
1. 网格离散化法
把地图画成格子:
原来:机场可以建在(47.123, 28.456)
现在:只能建在(47,28)、(47,29)...
- 优点:变回离散问题,能用老方法;
- 缺点:精度低,网格太细则点太多;
2. 梯度上升法(最陡爬坡)
def 梯度上升():
当前位置 = (x1,y1,x2,y2,x3,y3)
while True:
梯度 = 计算最陡方向() # 微积分求导
if 梯度几乎为0:
break # 到顶了!
当前位置 += 学习率 × 梯度 # 朝着最陡方向走一步
物理意义:就像在山坡上倒一桶水,看水流向哪,就往哪走。
3. 牛顿法(开天眼)
- 普通梯度:只知道“这个方向最陡”;
- 牛顿法:知道“顶峰大概在那边,一步跳过去”;
- 数学:用二阶导数(曲率)预测最优位置;
- 风险:可能跳过头或跳到坑里;
五、非确定性环境:当世界爱开玩笑
🤪 新敌人:不稳定的吸尘器
- 正常吸尘器:吸→干净(确定)
- 抽风吸尘器:
- 70%概率:吸→干净
- 20%概率:吸→左右都干净
- 10%概率:吸→反而弄脏了
🌳 与或搜索树:准备Plan B
现在我是谁? → 我能做什么? → 世界会怎么反应? → 每种情况我该怎么办?
OR节点 OR节点 AND节点 OR节点
(我的选择) (我的动作) (世界的反应) (我的应对)
示例:抽风吸尘器的应变计划
如果我在[脏,脏]位置:
选择:吸尘
结果1(70%):[干净,脏] → 去右边再吸
结果2(20%):[干净,干净] → 胜利!
结果3(10%):[脏,脏](没变化)→ 再吸一次
关键:每个“世界可能反应”的分支都必须有应对方案!
六、部分可观测环境:我在哪?我是谁?
🕶️ 新挑战:蒙眼寻路
- 你只知道:“我可能在北京、上海或广州”;
- 每个动作后,根据有限感知更新“可能在哪”;
信念状态:我的可能性清单
时刻0信念:{北京,上海,广州} # 可能性3选1
动作:坐高铁2小时
时刻1信念:{北京→天津,上海→南京,广州→长沙}
感知:听到“煎饼果子”叫卖声
时刻2信念:{天津} # 只有天津有煎饼果子!
信念状态搜索
搜索的不是具体状态,而是信念状态的转换:
{可能性集合1} → 动作A → {可能性集合2} → 感知P → {可能性集合3}
核心困难:信念状态数量 = 2^(实际状态数) → 指数爆炸!
七、在线搜索:一边走一边学
🧭 现实场景
- 你被空投到陌生森林
- 没地图,GPS没信号
- 天黑前必须找到营地
在线 vs 离线
| 离线搜索(第3章) | 在线搜索(本章) |
|---|---|
| 先规划完整路线再出发 | 走一步看一步 |
| 像用地图APP规划全程 | 像在迷宫摸墙走 |
| “闭着眼睛”执行计划 | 眼睛一直睁着 |
关键技术
- 爬山:在当前位置找看起来最好的方向
- 随机游走:防止困在局部
- 学习启发式:走过的路记住代价,更新地图
- 安全探索:留条返回已知区域的后路
🎪 第4章总结
| 环境类型 | 搜索算法 | 好比... |
|---|---|---|
| 连续空间 | 梯度上升 | 蒙眼摸象,靠手感找最高点 |
| 多峰值地形 | 模拟退火 | 开始允许跳崖,慢慢变稳重 |
| 群体优化 | 进化算法 | 生物进化:交配+突变+自然选择 |
| 非确定性 | 与或树 | 制定带“如果...就...”的应变计划 |
| 部分可观测 | 信念状态搜索 | 玩“猜猜我在哪”游戏,不断排除选项 |
| 未知环境 | 在线搜索 | 探险家:探索+记录+学习 |
💡 生存法则金句
- 当世界确定时:用第3章,规划完整路线;
- 当世界抽风时:准备Plan B、Plan C...;
- 当你在迷雾中时:记录所有可能性,用感知排除;
- 当地图空白时:走一步记一步,慢慢填图;
- 当寻找最佳状态时:允许暂时后退,为了最终更高;
- 当一个人不够时:组队搜索,信息共享;
终极智慧:没有万能算法!根据环境的“调皮程度”选择合适的生存策略。
复杂环境中搜索算法解析
883

被折叠的 条评论
为什么被折叠?



