搜索问题
在状态空间中,如何利用知识,通过一些搜索方式(盲目搜索或者启发式搜索)尽可能有效地找到问题的解,即找到最优解的问题。比如地图路径问题,华容道问题等。
盲目搜索
盲目搜索一般分为两类,深度优先搜索和广度优先搜索。
深度优先搜索
深度优先搜索的性质:
- 一般不能保证找到最优解
- 深度限制不合理时,可能找不到解,可以将算法改为可变深度限制
- 最坏情况,搜索空间等同于穷举
- 节省内存,之存储从初始节点到当前节点的路径
广度优先搜索
- 当问题有解时,一定能找到解
- 当问题为单位耗散值,且问题有解时,一定能找到最优解
- 方法与问题无关,具有通用性
- 效率较低
- 存储量比较大
启发式图搜索
优先扩展“最佳”节点
利用知识来引导搜索,达到减少搜索范围,降低问题复杂度的目的。
启发信息的强度
强:降低搜索工作量,但可能导致找不到最优解
弱:一般导致工作量加大,极限情况下变为盲目搜索,但可能可以找到最优解。
启发式搜索算法A/A*算法
定义评价函数
从开始节点s到n的最短路径的消耗值。是的估计值
启发函数。从指定区域n到目的地g的最短路径消耗值。是的估计值
评价函数.从起点s经过n到目的地g的最短路径消耗值。是对的估计值
用对扩展节点进行评价
open list:从节点s开始,先把它加入到待计算的表(open list).c从出发点起,与它相接的所有可以达到的节点,也加入到open表中
closed list:封闭列表。起点s从closed list中移除。上一步的节点和不可行的节点,在close表中。
最佳图搜索算法算法
在A算法中,如果满足条件:
则A算法称为算法
A算法步骤的总结(Summary of the A Method)
- 把起点加入 open list 。
- 重复如下过程:
a. 遍历 open list ,查找 F 值最小的节点,把它作为当前要处理的节点。
b. 把这个节点移到 close list 。
c. 对当前方格的 8 个相邻方格的每一个方格?
◆ 如果它是不可抵达的或者它在 close list 中,忽略它。否则,做如下操作。
◆ 如果它不在 open list 中,把它加入 open list ,并且把当前方格设置为它的父亲,记录该方格的 F , G 和 H 值。
◆ 如果它已经在 open list 中,检查这条路径 ( 即经由当前方格到达它那里 ) 是否更好,用 G 值作参考。更小的 G 值表示这是更好的路径。如果是这样,把它的父亲设置为当前方格,并重新计算它的 G 和 F 值。如果你的 open list 是按 F 值排序的话,改变后你可能需要重新排序。
d. 停止,当你
◆ 把终点加入到了 open list 中,此时路径已经找到了,或者
◆ 查找终点失败,并且 open list 是空的,此时没有路径。 - 保存路径。从终点开始,每个方格沿着父节点移动直至起点,这就是你的路径。
上述步骤来自 Colin丶 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/hitwhylz/article/details/23089415?utm_source=copy
对启发函数的评价方法
平均分叉数
设共扩展了d层节点,共搜索了N个节点,则:
越小,说明评价函数效果越好。实验表明,是一个比较稳定的常数,同一个问题基本不随问题规模发生变化。
随机搜索算法
动态规划算法
对于任何的n,当时,A*算法就成为了动态规划算法。
参考:清华大学计算机系马少平老师《人工智能》课程PPT课件