人工智能与专家系统设计汇总.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
目录 设计任务 1.1 设计题目 1.2设计要求 1.3设计任务 2.方案设计 2.1原理 2.2 具体设计方法 3.系统实施 3.1 系统开发环境 3.2系统主要功能介绍 3.3处理流程图 3.4 核心源程序 3.5系统运行结果 4.开发心得 4.1设计存在的问题 4.2进一步改进提高的设想 4.3经验和体会 5.参考文献 1. 设计任务 1.1 设计题目 在一个3*3的方棋盘上放置着1,2,3,4,5,6,7,8八个数码,每个数码占一格,且有一个空格。这些数码可以在棋盘上移动,该问题称八数码难题或者重排九宫问题。 1.2 设计要求 其移动规则是:与空格相邻的数码方格可以移入空格。现在的问题是:对于指定的初始棋局和目标棋局,给出数码的移动序列。 1.3 设计任务 利用人工智能的图搜索技术进行搜索,解决八数码问题来提高在推理中的水平,同时进行新方法的探讨。 2. 方案设计 2.1 原理 八数码问题是个典型的状态图搜索问题。搜索方式有两种基本的方式,即树式搜索和线式搜索。搜索策略大体有盲目搜索和启发式搜索两大类。盲目搜索就是无“向导”的搜索,启发式搜索就是有“向导”的搜索。 2.2 具体设计方法 启发式搜索 由于时间和空间资源的限制,穷举法只能解决一些状态空间很小的简单问题,而对于那些大状态空间的问题,穷举法就不能胜任,往往会导致“组合爆炸”。所以引入启发式搜索策略。启发式搜索就是利用启发性信息进行制导的搜索。它有利于快速找到问题的解。 由八数码问题的部分状态图可以看出,从初始节点开始,在通向目标节点的路径上,各节点的数码格局同目标节点相比较,其数码不同的位置个数在逐渐减少,最后为零。所以,这个数码不同的位置个数便是标志一个节点到目标节点距离远近的一个启发性信息,利用这个信息就可以指导搜索。即可以利用启发信息来扩展节点的选择,减少搜索范围,提高搜索速度。 ? 启发函数设定。对于八数码问题,可以利用棋局差距作为一个度量。搜索过程中,差距会逐渐减少,最终为零,为零即搜索完成,得到目标棋局。 3. 系统实施 3.1 系统开发环境 Windows操作系统、SQL Server 200X 3.2 系统主要功能介绍 该搜索为一个搜索树。为了简化问题,搜索树节点设计如下: struct Chess//棋盘 { int cell[N][N];//数码数组 ?????? int Value;//评估值 ?????? Direction BelockDirec;//所屏蔽方向 ?????? struct Chess * Parent;//父节点}; int cell[N][N];??? 数码数组:记录棋局数码摆放状态。 int Value;??????? 评估值:记录与目标棋局差距的度量值。 Direction BelockDirec; 所屏蔽方向:一个屏蔽方向,防止回推。 Direction :enum Direction{None,Up,Down,Left,Right};//方向枚举 struct Chess * Parent;? 父节点:指向父亲节点。 下一步可以通过启发搜索算法构造搜索树。搜索采用广度搜索方式,利用待处理队列辅助,逐层搜索(跳过劣质节点)。搜索过程如下: ? (1)、把原棋盘压入队列; ? (2)、从棋盘取出一个节点; ? (3)、判断棋盘估价值,为零则表示搜索完成,退出搜索; ? (4)、扩展子节点,即从上下左右四个方向移动棋盘,生成相应子棋盘; (5)、对子节点作评估,是否为优越节点(子节点估价值小于或等于父节点则为优越节点),是则把子棋盘压入队列,否则抛弃; ? (6)、跳到步骤(2); 3.3 处理流程图 3.4 核心源程序 #include stdio.h #include stdlib.h #include time.h #include string.h #include queue #include stack using namespace std; const int N=3;//3*3棋盘 const int Max_Step=30;//最大搜索深度 enum Direction{None,Up,Down,Left,Right};//方向 struct Chess//棋盘 { ??? int cell[N][N];//数码数组 ??? int Value;//评估值 ??? Direction BelockDirec;//所屏蔽方向 ??? struct Chess * Parent;//父节点 }; //打印棋盘 void PrintChess(struct Chess *TheChess) { ??? printf(---------------------

文档评论(0)

5201394 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档