从皇后问题到图搜索

本文详细介绍了皇后问题的解决方法,包括递归、宽度优先、深度优先和位运算算法,并探讨了爬山法在解决皇后问题中的应用。通过算法分析,指出不同算法在解决规模上的优势和效率,如递归和深度优先适用于33规模,位运算适用于34规模,宽度优先适用于14规模,而爬山法则具有较高的效率。

一、  问题介绍

输入:皇后的数目,例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.&n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值