




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
八数码问题具体思路:宽度优先算法实现过程(1)把起始节点放到OPEN表中;(2)如果OPEN是个空表,则没有解,失败退出;否则继续;(3)把第一个节点从OPEN表中移除,并把它放入CLOSED的扩展节点表中;(4)扩展节点n。如果没有后继节点,则转向(2)(5)把n的所有后继结点放到OPEN表末端,并提供从这些后继结点回到n的指针;(6)如果n的任意一个后继结点是目标节点,则找到一个解答,成功退出,否则转向(2)。开始把S放入OPEN表OPEN表为空失败把第一个节点n从把S放入OPEN表移除,放到CLOSED表中移除扩展n,把它的后继节点放入OPEN表的末端,提供回到n的指针是否任何节点为目标节点成功深度优先实现过程(1)把起始节点S放入未扩展节点OPEN表中。如果此节点为一目标节点,则得到一个解;(2)如果OPEN为一空表,则失败退出;(3)把第一个节点从OPEN表移到CLOSED表;(4)如果节点n的深度等于最大深度,则转向(2);(5)扩展节点n,产生其全部后裔,并把它们放入OPEN表的前头。如果没有后裔,则转向(2);(6)如果后继结点中有任一个目标节点,则得到一个解,成功退出,否则转向(2)。开始把S放入OPEN表S是否为目标节点成功把第一个节点n从把S放入OPEN表移除,放到CLOSED表中移除节点n的深度是否等于最深界限OPEN表为空失败扩展n,把它的后继放入OPEN表的前头,提供回到n的指针是否有任何后继节点为目标节点成功方法一:用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 /但move_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 & 0xf; ttt=4; /将一个64位整数a转换为数组b/typedef struct EP_NODE_Tag UINT64 v; /保存状态,每个数字占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=0xf;for(pz=NUM - 1; pz = 0; pz-)if(node-v & t) = 0) 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;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, *pnode;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+; /只能对历史节点中没有的新节点搜索,否则会出现环h+;printf(rSearch.%9d/%d %d, h, r, get_node_depth(&m_arh);if(h = r) return -2; elsereturn -1; long check_input(char *s, char a, long r) long i;for(i=0; i r; i+) if(si = a - 0x30) 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 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 s1NUM;char s2NUM;long r;char a;printf(请输入开始状态:);r=0;while(r = 0x30 & a 0x39 & check_input(s1, a, r) s1r+=a - 0x30;printf(%c, a);printf(n请输入结束状态:);r=0;while(r = 0x30 & a = 0) printf(查找深度=%d,所有的方式=%ldn, m_depth, r);output();else if(r = -1) printf(没有找到路径.n);else if(r = -2)printf(这种状态变换没有路径到达.n);elseprintf(不确定的错误.n);else printf(不允许这样移动!n);return 0;方法二:用MATLAB实现program 8no_bfs; 八数码的宽度优先搜索算法Const Dir : array1.4,1.2of integer 四种移动方向,对应产生式规则 = (1,0),(-1,0),(0,1),(0,-1); n=10000;Type T8no = array1.3,1.3of integer; TList = record Father : integer;父指针 dep : byte; 深度 X0,Y0 : byte; 0的位置 State : T8no; 棋盘状态 end;Var Source,Target : T8no; List : array0.10000 of TList; 综合数据库 Closed,open,Best : integer Best表示最优移动次数 Answer : integer; 记录解 Found : Boolean; 解标志 procedure GetInfo; 读入初始和目标节点 var i,j : integer; begin for i:=1 to 3 do for j:=1 to 3 do read(Sourcei,j); for i:=1 to 3 do for j:=1 to 3 do read(Targeti,j); end;procedure Initialize; 初始化 var x,y : integer; begin Found:=false; Closed:=0;open:=1; with List1 do begin State:=Source;dep:=0;Father:=0; For x:=1 to 3 do For y:=1 to 3 do if Statex,y=0 then Begin x0:=x;y0:=y; End; end; end;Function Same(A,B : T8no):Boolean; 判断A,B状态是否相等 Var i,j : integer; Begin Same:=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; begin not_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 : integer;var ok : boolean;var new : tList); 将第d条规则作用于n得到new,OK是new是否可行的标志 var x,y : integer; begin X := 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 GetOutInfo 存在解 else Writeln(no answer); 无解 end;Begin Assign(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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学汉字课标解读课件
- 血细胞直方图
- 小学生药品安全认知教育
- 信息技术键盘操作
- 小脑肿瘤手术配合
- 小细胞肺癌的诊治共识
- 导尿管相关尿路感染防控标准
- 小学实习汇报总结
- 细胞治疗展厅设计
- 销售季度业绩汇报
- GB/T 3098.15-2023紧固件机械性能不锈钢螺母
- 兰花花叙事曲二胡曲谱
- 调解协议书电子版5篇(可下载)
- 材料性能学(第2版)付华课件1-弹性变形
- GB/T 4909.4-2009裸电线试验方法第4部分:扭转试验
- PDCA质量持续改进案例一:降低ICU非计划拔管发生率
- 2023年烟台蓝天投资开发集团有限公司招聘笔试题库及答案解析
- 企业标准编写模板
- 初中道德与法治 九年级(维护祖国统一)初中道德与法治九年级作业设计样例
- 幼儿园绘本故事:《骄傲的大公鸡》 课件
- 江西省赣州市于都县2022-2023学年九年级化学第一学期期中监测试题含解析
评论
0/150
提交评论