一、 问题介绍
输入:皇后的数目,例4
输出:第1行至第N行皇后对应的列号,例(2,4,1,3)
1. 采用递归策略实现N皇后问题,测试能够在短时间内找到解的最大N;
2. 采用宽度优先算法实现N皇后问题,测试能够在短时间内找到解的最大N;
3. 采用深度优先算法实现N皇后问题,测试能够在短时间内找到解的最大N。
4. 利用位运算算法实现N皇后问题,测试能够在短时间内找到解的最大N。
5. 采用爬山法实现N皇后问题,测试能够在短时间内找到解的最大N。
二、 程序设计与算法分析
(一) 采用递归算法的实现思路为:
Backtrack(Data)
Data:当前状态
回溯搜索算法 返回值:从当前状态到目标状态的路径(以规则表的形式表示)
或Fail。
1. If Term(Data) ReturnNil;
2. If Deadend(Data)Return Fail;
3. Rules:=Apprules(Data);
4. Loop: If Null(Rules)Return Fail;
5. R:=First(Rules);
6. Rules:=Tail(Rules);
7. RData:=Gen(R, Data);
8. Path:=Backtrack(RData);
9. If Path=Fail Go Loop;
10. Return Cons(R, Path);
(二) 一般图的搜索方法的实现思路:
1. G=G0 (G0=s),Open:=(s);
2. Closed:=( );
3. Loop: If Open=( )Then Exit(Fail);
4. n:=First(Open),Remove(n, Open), Add(n, Closed);
5. If Goal(n),ThenExit(Success);
6. Expand(n)→{mi}, G:=Add(mi, G);
7. 标记和修改指针: Add(mj,Open), 并标记mj到n的指针; 计算是否要修改mk、ml到n的指针; 计算是否要修改ml到其后继节点的指针;
8.对Open中的节点按某种原则重新排序;
9.Go Loop;
这是对于一般图搜索的普适算法。不同的图搜,例如宽度优先算法和深度优先算法的区别主要体现在该算法中的第8条原则,依据不同的原则对open表中的数据进行排序。其中深度优先的排序方式为每次将待扩展节点插入open表的头部,而宽度优先搜索每次将待扩展的节点放到open表的尾部。
也就是深度优先搜索方法:
1. G := G0(G0=s), Open:= (s), Closed := ( );
2. Loop: If Open = ( )Then Exit (Fail);
3. n := First(Open);
4. If Goal(n) Then Exit(Success);
5. Remove(n, Open),Add(n, Closed);
6. If Depth(n) ≥ Dm Go Loop;
7. Expand(n) →{mi}, G := Add(mi,G);
8. If 目标在{mi}中 ThenExit(Success);
9. Add(mj, Open), 并标记mj到n的指针;
10. Go Loop;
深度优先搜索特点:
l 若存在多个目标状态,一般不能保证找到最优解
l 当深度限制不合理时,可能找不到解,可以将算法改为可变深度限制
l 最坏情况时,搜索空间等同于穷举
l 与回溯法的差别:图搜索
l 是一个通用的与问题无关的方法
宽度优先搜索方法的实现思路:
1. G :=