搜索
1. 启动发式搜索:A*
例题:八数码难题
什么是A*呢?举个例子,怎么算从长沙到北京的最短路。
假设有两个点
也就是,计算一个估计值。在A*中,我们称作
A*有一个很重要的等式:
但估计值不能乱写,必须满足“估计值
A*实现很简单,就是简单的BFS。难在怎么设计估值函数。
估值函数中,
例如八数码难题中,我们可以设计与目标状态不同的位置总数为
代码实现如下:
int h(string s)
{
int ans=0;
for(int i=1;i<=9;i++)
if(s[i]!=End[i])
ans++;
return ans;
}
实际上,如果想要速度更快,可以将估值函数改成:
后记:
Q:为什么
k 越大,会出现错误答案?A:原因有二:
- 因为这是启动式搜索,
k 大会炸掉(可莉:?)。
2. 双向广搜
也称双向BFS。
什么意思呢?每次从起点和终点开始搜索。为了平衡,可以从状态数少的一边搜索。
3. 迭代加深搜索
Q:DFS有缺点吗?
A:有,可能出现一去不复返的情况。
什么意思呢?就是说,搜啊搜,搜不完。
解决方法就是迭代加深搜索
先来回顾一般的DFS:
int dfs(int x)
迭代加深的DFS是
int dfs(int x,int t)