深度宽度优先搜索_第1页
深度宽度优先搜索_第2页
深度宽度优先搜索_第3页
深度宽度优先搜索_第4页
深度宽度优先搜索_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、八数码问题具体思路:宽度优先算法实现过程(1)把起始节点放到OPEN表中;(2)如果OPEN是个空表,则没有解,失败退出;否则继续;(3)把第一个节点从OPEN表中移除,并把它放入CLOSED的扩展节点表中;(4)扩展节点n。如果没有后继节点,则转向(2)(5)把n的所有后继结点放到OPEN表末端,并提供从这些后继结点回到n的指针;(6)如果n的任意一个后继结点是目标节点,则找到一个解答,成功退出,否则转向(2)。深度优先实现过程(1)把起始节点S放入未扩展节点OPEN表中。如果此节点为一目标节点,则得到一个解;(2)如果OPEN为一空表,则失败退出;(3)把第一个节点从OPEN表移到CLOS

2、ED表;(4)如果节点n的深度等于最大深度,则转向(2);(5)扩展节点n,产生其全部后裔,并把它们放入OPEN表的前头。如果没有后裔,则转向(2);(6)如果后继结点中有任一个目标节点,则得到一个解,成功退出,否则转向(2)。方法:用C语言实现#include #include #includetypedef long UINT64;typedef struct(char x; 位置x和位置y上的数字换位char y; 其中x是0所在的位置 EP_MOVE;#define SIZE 3 /8数码问题,理论上本程序也可解决15数码问题,#define NUM SIZE * SIZE /但mov

3、e_gen需要做很多修改,输入初始和结束状态的部分和check_input也要修改#define MAX_NODE 1000000#define MAX_DEP 100#define XCHG(a, b) ( a=a + b; b=a - b; a=a - b; #define TRANS(a, b)/*( long iii; (b)=0; for(iii=0; iii NUM; iii+) (b) = (b) = 0; iii-) ( biii=ttt & 0 xf; ttt=4; /将一个64位整数a转换为数组b/typedef struct EP_NODE_Tag( UINT64 v;

4、保存状态,每个数字占4个二进制位,可解决16数码问题struct EP_NODE_Tag *prev; /父节点struct EP_NODE_Tag *small, *big; EP_NODE;EP_NODE m_arMAX_NODE;EP_NODE *m_root;long m_depth; 搜索深度EP_NODE m_outMAX_DEP; 输出路径/long move_gen(EP_NODE *node, EP_MOVE *move)(long pz; /0 的位置UINT64 t=0 xf;for(pz=NUM - 1; pz = 0; pz-)(if(node-v & t) = 0)

5、 (break; /找到0的位置tv, ss);XCHG(ssmv-x, ssmv-y);TRANS(ss, n2-v);return 0;long add_node(EP_NODE *node, long r)(EP_NODE *p=m_root;EP_NODE *q;while(p)( q=p;if(p-v = node-v) return 0;else if(node-v p-v) p=p-big;else if(node-v v) p=p-small;m_arr.v=node-v;m_arr.prev=node-prev;m_arr.small=NULL;m_arr.big=NULL;

6、if(node-v q-v)( q-big= &m_arr;else if(node-v v)( q-small= &m_arr;return 1;/*得到节点所在深度*/long get_node_depth(EP_NODE *node)( long d=0;while(node-prev)( d+;node二node-prev;return d;/*返回值:成功一返回搜索节点数,节点数不够一(-1),无解一(-2)*/long bfs_search(char *begin, char *end)( long h=0, r=1, c, i, j;EP_NODE l_end, node, *p

7、node;EP_MOVE mv4; /每个局面最多4种走法TRANS(begin, m_ar0.v);TRANS(end, l_end.v);m_ar0.prev二NULL;m_root=m_ar;m_root-small=NULL;m_root-big=NULL;while(h r) & (r MAX_NODE - 4)( c=move_gen(&m_arh, mv);for(i=0; i prev)( m_outj=*pnode;j+;pnode二pnode-prev; m_depth=j;return r;if(add_node(&node, r) r+; 只能对历史节点中没有的新节点搜

8、索,否则会出现环h+;printf(rSearch.%9d/%d %d, h, r, get_node_depth(&m_arh);if(h = r)( return -2; else(return -1; long check_input(char *s, char a, long r)( long i;for(i=0; i r; i+)(if(si = a - 0 x30) return 0; return 1;long check_possible(char *begin, char *end)( char fs;long f1=0, f2=0;long i, j;for(i=0; i

9、NUM; i+)( fs=0;for(j=0; j i; j+)(if(begini != 0) & (beginj != 0) & (beginj begini) fs+;f1+=fs;fs=0;for(j=0; j i; j+)( if(endi != 0) & (endj != 0) & (endj = 0; i-)( RTRANS(m_outi.v, ss);for(j=0; j SIZE; j+) ( for(k=0; k SIZE; k+)( printf(%2d, ssSIZE * j + k);printf(n);printf(n);int main(void)( char s

10、1NUM;char s2NUM;long r;char a;printf(请输入开始状态:);r=0;while(r = 0 x30 & a 0 x39 & check_input(s1, a, r)( s1r+=a - 0 x30;printf(%c, a);printf(n请输入结束状态:);while(r = 0 x30 & a = 0)( printf(查找深度二%d,所有的方式二%ldn”, m_depth, r);output();else if(r = -1) printf(没有找到路径.n);else if(r = -2)(printf(-这种状态变换没有路径到达.n);els

11、e printf(不确定的错误.n);else printf(不允许这样移动!n);return 0;方法二:用MATLAB实现program 8no_bfs;八数码的宽度优先搜索算法ConstDir : array1.4,1.2of integer 四种移动方向,对应产生式规则=(1,0),(-1,0),(0,1),(0,-1);n=10000;TypeT8no = array1.3,1.3of integer;TList = recordFather : integer;父指针dep : byte;深度X0,Y0 : byte;0 的位置State : T8no;棋盘状态end;VarSo

12、urce,Target : T8no;Closed,open,Best : integer( Best表示最优移动次数Answer : integer;记录解Found : Boolean;解标志procedure GetInfo;读入初始和目标节点读入初始和目标节点var i,j : integer;beginfor i:=1 to 3dofor j:=1 to 3 do read(Sourcei,j);for j:=1 to3 dofor i:=1 to 3dofor j:=1 to 3 do read(Targeti,j);for j:=1 to3 doend;procedure Ini

13、tialize;初始化List : array0.10000 of TList; 综合数据库var x,y : integer;beginFound:=false;Closed:=0;open:=1;with List1 do beginState:二Source;dep:=0;Father:=0;For x:=1 to 3 doFor y:=1 to 3 doif Statex,y=0 then Begin x0:=x;y0:=y; End;end;Function Same(A,B : T8no):Boolean; 判断 A,B 状态是否相等Var i,j : integer;BeginS

14、ame:=false;For i:=1 to 3 do for j: = 1 to 3 do if Ai,jBi,j then exit;Same:=true;End;Function not_Appear(new : tList):boolean; 判断 new 是否在 List 中出现 var i : integer;beginnot_Appear:二false;for i:=1 to open do if Same(new.State,Listi.State) then exit;not_Appear:二true;end;procedure Move(n : tList;d : inte

15、ger;var ok : boolean;var new : tList);将第d条规则作用于n得到new,OK是new是否可行的标志var x,y : integer;beginX := n.x0 + Dird,1;Y := n.y0 + Dird,2;判断new的可行性if not (X 0) and ( X 0 ) and ( Y =open) or Found;if Found then GetOutInfoelse Writeln(no answer);end;BeginAssign(Input,input.txt);ReSet(Input);Assign(Output,Output.txt);ReWrite(Output);GetInfo;Initialize;Main;Close(Input);Close(Output);End.五、实验结果六、实验总结通过实验问题的求解过程就是搜索的过程,采用适合的搜索算法是关键 的,因为对求解过程的效率有很大的影响,包括各种规则、过程和算法等推理 技术。八数码问题中,将牌的移动来描述规则,是一种相对较简单的方法。用广度优先算法实现八数码

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论