搜索是什么?
1.问题全状态空间
2.搜索空间
3.解路径
分类
一,盲目搜索(只是搜索的顺序不同)
1.深度优先搜索
2.宽度优先搜索
二,启发式搜索
A*算法
分类来讲
1.深度优先搜索
例题:皇后问题
存在的问题:1.深度问题,2.死循环问题
解决办法:1.对搜索深度加以限制
2.记录从初始状态到当前状态的路径
性质:一般不能保证找到最优解
当深度现在不合理时,可能找不到解,可以将算法改为可变深度限制
最坏的情况,搜索空间相当于穷举
是一个通用的与问题无关的方法
节省内存,只存储从初始节点到当前节点的路径
2.宽度优先搜索
优先扩展深度浅的节点
通常用一个队列来实现
例题:八数码
性质:当问题有解时,一定能找到解
当问题为单位耗散值,且问题有解时,一定能找到最优解
方法与问题无关,具有通用性
效率较低
存储量比较大
【对比】
深搜 | 广搜 |
不保证最优解,除非枚举所有情况 | 每步代价相同时,一定能找到最优解 |
空间消耗低 | 空间消耗高 |
具有通用性 | |
效率低 |
迭代加深搜索(dbfs)
解决宽搜内存大和深搜不能保证最优解的问题
解决方案:枚举最大的代价,用深搜判断是否有解--》卡时间
3.启发式搜索(A*搜索)
关键在于对当前局面作出预估,判断当前局面到目的的局面至少还需要多少步
估价函数决定了A*算法的优劣
练习题:1.01迷宫
2.高手去散步
3.血色先锋队