深度优先(Depth-First)
栈(Stack),后进先出,每次扩展当前节点的子节点,直至没有子节点回溯
1. 构造一个由根构成的单元素栈S;
2. If Top(S)是目标节点 3. Then 输出解,停止;
4. ELSE T=Top(S), Pop(S);
5. 把T的所有子节点压入栈顶;
6. If S空 Then 无解;
7. Else goto 2.
广度优先(Bread-thFirst)
队列(Queue),先进先出,每次对当前元素进行扩展,扩展后的节点添加到队列里面
1. 构造仅由根组成的队列Q;
2. IF Q的第一个元素x是目标节点 3. Then 输出解,停止;
4. ELSE 从Q中删除x,把x的所有子节点加入Q的末尾;
5. IF Q空 Then 无解
6. Else goto 2.
爬山法(Hill Climbing)
在深度优先搜索过程中, 我们经常遇到多个节点可以扩展的情况, 首先扩展节点的选取很重要
- 爬山策略使用贪心方法确定搜索的方向, 是优化的深度优先搜索策略
- 爬山策略使用启发式测度来排序节点扩展的顺序
1. 构造由根组成的单元素栈S;
2. If Top(S)是目标节点 Then 停止;
3. Pop(S);
4. S的子节点按照其启发测度由大到小的顺序压入S;
5. If S空 Then 失败 Else goto 2.
最佳优先(Best-First)
- 结合深度优先和广度优先的优点于一个方法
- 根据一个评价函数, 在目前产生的所有节点中选择具有最小评价函数值的节点进行扩展.
- 具有全局优化观念, 而爬山策略仅具有局部优化观念.
1. 使用评价函数构造一个堆H, 首先构造由根组成的单元素堆;
2. If H的根r是目标节点 Then 停止;
3. 从H中删除r, 把r的子节点插入H;
4. If H空 Then 失败 Else goto 2.