人工智能课程设计报告(八皇后问题与罗马尼亚问题).docVIP

人工智能课程设计报告(八皇后问题与罗马尼亚问题).doc

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
人工智能课程设计报告 目录 1.N皇后问题…………………………………………………………1 需求分析,设计…………………………………………………1 设计表示…………………………………………………………1 运行结果…………………………………………………………2 用户手册即测试数据……………………………………………2 结论………………………………………………………………5 主要算法代码……………………………………………………5 2罗马尼亚问题…………………………………………………………9 需求分析,设计…………………………………………………9 设计表示,详细设计……………………………………………9 用户手册…………………………………………………………11 运行结果…………………………………………………………11 主要算法代码……………………………………………………12 3.实习心得………………………………………………………………………21 1 N皇后问题 1.问题描述、需求分析 在N*N 的棋盘上分布N个皇后,其中N个皇后不能在同一行同一列,也不能出现在同一对角线上,此时N个皇后不会相互攻击。 程序需能手动输入皇后个数,并分别采用回溯法、爬山法、遗传法得出皇后的分布情况,输出皇后的位置即棋盘。 2.设计思想 2.1 形式化 N个皇后的位置可用一个N维数组表示,如921543……,意思是第一个皇后在第一列的第9行。 2.2 程序模块 CreatIndividual( )函数用于产生一组表示皇后不在同一行也不再同一列的的一位数组,即产生一组互不相等的0~N之间的整数,便于快速求解。 IsLegal( )函数用于判断新放置的皇后是否合法,在回溯法中用到。 AttackQueenNum( )用于计算整个棋盘的攻击皇后个数,相当于一个评价函数,在爬山法和遗传法中用到; Find( )回溯法求解函数 ClimbHill( )爬山法求解函数; GA( )遗传算法求解函数; (1)函数调用关系图如下: (2)函数接口规格说明:下图中的箭头指向表示为被指向函数所用 2.3 详细设计 a: CreatIndividual(int *A,int QueenNum):以当时时间为种子循环产生随机数,为了使得产生的随机数都不想等,设计集合S[N]并初始化为0,表示还没有产生一个皇后,当产生的皇后不在S[N]中即S[N]!=1时将S[n]置为1,接着产生下一个皇后,如此循环便产生一组互不相等的值。 b: IsLegal(int *A,int t)此函数用于判断第t列的皇后是否合法,即有没有皇后在同一行、同一列,同一对角线上,并返回true或者false。 c: AttackQueenNum(int *A,int QueenNum)循环调用IsLegal()函数对攻击数进行累加并返回其值,此函数作为棋盘的评价函数。 d: Find(int *A,int k,int QueenNum,long beginTime)回溯法求解,因为回溯法的每一层都是for循环,所以不能单纯的用break语句进行控制,因为即使当前层循环停止了,程序还会继续执行上一层的循环,所以将起始时间作为参数进行传递,以便求出算法执行时间,然后用exit(0)语句终止程序,所以要将回溯法放在其它两个算法的后面执行。 e: ClimbHill(int *A,int QueenNum):由于在产生一个棋盘个体的时候所有的皇后就不在同一行同一列,所以在爬山法中只对棋盘的列进行交换,这样即使再怎么交换所有的皇后还是不在同一行同一列,但在交换的时候需要调用AttackQueenNum( )函数进行棋盘的评价,如果交换前的攻击数大于交换后的攻击数则进行交换,否则与下一列进行交换比较,如此循环直到找出解。 f: GA( ) 3.用户手册 运行程序,输入皇后个数N,各种算法得到的皇后分布情况、耗时自动显示; 4.测试数据及测试结果 分别测试4,20,30,50皇后,测试结果如下: 程序运行结果: 4皇后运行结果 20皇后运行结果如下 30皇后运行结果如下: 50皇后运行结果如下 由于50皇后的棋盘稍大,这里只给出运行时间 结论:根据输入皇后个数递增的运行结果可以看出爬山法的速度是相当快的,在皇后个数比较少时回溯法的速度要快于遗传算法,而当皇后个数比较多时,回溯法的深度搜索明显慢于遗传算法。 主要算法程序代码: 1:bool IsLegal(int *A,int t) //判断第t列的皇后位置是否合法 { int i; for (i=0;it;i

文档评论(0)

li455504605 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档