1、人工智能论文遗传算法实现八皇后问题南京理 工大学人工智能大论文题 目遗传算法实现八皇后问题 姓 名:XXXX 学 号: XXXXXXXXXXXXXX 专 业:XXXXXXXXXX 院 系: XXXXXXXXXXXXXXXX 老 师: XXXXXX日 期:2015年12月20日摘要 3一、实验背景 41.1N 皇后问题描述 41.2遗传算法 4二、实验目的 5三、实验内容 5四、实验步骤 54.1编码方案 54.2初始化种群 64.3适应度的计算 74.4遗传算子 84.4.1选择算子 84.4.2交叉方法 84.4.3变异方法 84.5局部搜索 104.6终止策略 104.7实现描述 10五、
2、实验结果和分析 11六、总结与思考 12摘要众所周知的八皇后问题是一个非常古老的问题,具体描述如下:在 8*8 的国际象 棋棋盘上放置了八个皇后,要求没有一个皇后能吃掉另一个皇后,即任意两个皇后都 不处于棋盘的同一行、同一列或同一对角线上。本实验要求设计并实现解决八皇后问 题的遗传算法。能够给定任意一个初始状态,使用遗传算法搜索最优解,程序能显示 优化的计算过程。独立运行 20 次以上,统计遗传算法的寻优指标(包括是否找到最 优解、平均迭代次数等) 。本次设计旨在学习各种算法,训练对基础知识和基本方法的综合运用及变通能 力,增强对算法的理解能力,提高软件设计能力,在实践中培养独立分析问题和解决
3、 问题的作风和能力。通过本实验的设计与编程实现让学生掌握基于状态空间知识表示 的局部搜索策略,对遗传算法中的编码方法以及选择、复制、交叉、变异等基本算子 有深入的理解,熟练运用C+,编写一个遗传算法解决八皇后问题的应用程序。关键词: 八皇后;遗传算法 ;C+、实验背景1.1 N皇后问题描述N皇后问题描述如下:在n n格棋盘上放置彼此不受攻击的 N个皇后。按国际 象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 N皇后问题等价于在以下三个约束条件:任何 2个皇后不放在同一行;任何2个皇后不放在同 一列;任何2个皇后不放在同斜线。我们把n n的棋盘看作二维方阵,其行号从上到下列号
4、从左到右依次编号为 0,1,,7。设任意两个皇后,皇后1和皇后2的坐标分别是(i,)和(k, I),贝U如 果这两个皇后在从棋盘左上角到右下角的主对角线及其平行线(斜率为 -1的线)上,有i- j = k- I ;如果这两个皇后在斜率为+ 1的每一斜线上,有i+j = k+l ;以上两个方程分别等价于i- k= j- I和i- k= I- j因此任两皇后的在同一斜线上的 充要条件是|i- k|= j- l|。满足两个皇后不在同一斜线上的条件表示为:|i - k|? |j l|两皇后不在同一行用式表示为:i 1 k两皇后不在同一列用式表示为:j 1 I 1.2遗传算法遗传算法(Genetic A
5、lgorithm )是模拟达尔文生物进化论的自然选择和遗传学机理 的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。遗传 算法是从代表问题可能潜在的解集的一个种群(populatio n)开始的,而一个种群则由 经过基因(gene)编码的一定数目的个体(individual)组成。每个个体实际上是染色体 (chromosome带有特征的实体。染色体作为遗传物质的主要载体, 即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头 发的特征是由染色体中控制这一特征的某种基因组合决定的。因此,在一开始需要实 现从表现型到基因型的映射即编码工作
6、。由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐 代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应 度(fitness)大小选择(selection)个体,并借助于自然遗传学的遗传算子( geneticoperators)进行组合交叉(crossove)和变异(mutation),产生出代表新的解集的种 群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代 种群中的最优个体经过解码(decoding),可以作为问题近似最优解。二、 实验目的N皇后问题是经典的益智游戏,通
7、过本实验的设计与编程实现让学生掌握基于状 态空间知识表示的局部搜索策略,对遗传算法中的编码方法以及选择、复制、交叉、 变异等基本算子有深入的理解。本次设计旨在学习各种算法,训练对基础知识和基本方法的综合运用及变通能 力,增强对算法的理解能力,提高软件设计能力,在实践中培养独立分析问题和解决 问题的作风和能力。熟练运用 C+语言,独立编程,实现一个遗传算法解决八皇后问 题的应用程序。三、 实验内容本实验要求设计并实现解决八皇后问题的遗传算法。能够给定任意一个初始状态,使用遗传算法搜索最优解,程序能显示优化的计算过程。独立运行 20次以上,统计遗传算法的寻优指标(包括是否找到最优解、平均迭代次数等
8、) 。因为我的学号末尾为0,按照老师要求,则应该实现n= 8,即八皇后问题。四、 实验步骤现在我们把任意n个皇后的任意一种放置办法当作一个个体 (染色体),把其中的任意一个皇后当作一个基因,用遗传算法来解决该问题。4.1编码方案对于此冋题有三种编码方案:排列编码、二进制编码、矩阵编码,在这里,米用第一重编码方案,即排列编码,具体描述如下:用一维n元数组x0,1,n- 1来表示一个个体,其中xi?0,1,n 1 ,xi表示皇后 i 放在棋盘的第 i 行第 xi 列,即第 i 行第 xi 列放置一个皇后。例如, x0 = 0表示棋盘的第 0 行第 0 列放一个皇后。数组第 i 个元素表示第 i 行
9、的放置情 况,可以看作一个基因。这种编码可以自然的解决了某一行只能放一个皇后的约束, 如果数组的每一个元素xi都不重复,可以看成o n-1的一种排列,就自然保证每一 列只能放一个皇后。因此在交叉变异和产生个体时必须注意 xi的唯一性。4.2 初始化种群初始化种群的主要工作为:确定种群的大小及产生初始种群 .种群的大小能够对遗传算法的收敛性产生很大的影响, 种群较小算法收敛速度较快, 但它的搜索面不够广, 容易导致局部收敛;而种群较大算法收敛全局最优的概率也大,但是算法的收敛速度 较慢。因此根据N皇后问题的特点,本文将种群大小设为 N(皇后数)。初始化种群的方法为:首先为每个体的染色体的基因位从
10、 1到N,然后随机交换两个基因位的值,对每个个体共交换 N/2 次,对种群中所有个体做上述操作。双亲遗传时候的初始化种 群实现如下:void CreateMultiStartPopulatio n ()int loop, i, j ;int tmpMAX_QUEENS ;for (loop = o ; loop m_size ; loop +)for (i = o ; i n ; i+)tmpi = i ;for (i = o ; i n ; i+)j = rand() % (n - i) ;m_populationloop.queeni = tmpj ;tmpj = tmpn - i - 1
11、 ;UpdateFitnessScore(&m_populationloop) ;4.3适应度的计算皇后i和j的攻击度:卩 |xixj| = i_ja.= un itFit ness = 0 ;for (i = 0 ; i eachFit nessi = 0 ;for (j = 0 ; j eachFit nessi += Aggressive(p, i, j);p-unitFitness += p-eachFitnessi ; /个体的适应度为所有的基因的适应度的总和4.4遗传算子4.4.1选择算子目前常用的选择算子有二种:轮盘赌选择算子和二进制锦标赛选择算子。轮盘赌 选择算子的缺点在于容易
12、产生出超级个体,易导致算法局部收敛。但为了实现简单, 我选择轮盘赌选择算子,即被选到的概率与适应度呈正比 (越是优越的个体基因越容易被保留下来),具体试下如下:int RouletteWheelSelectio n()int select ion = 0;int i ;double slice = (double)ra nd() / RAND_MAX;double addFit ness = 0;for(i = 0; i slice)selectio n = i; break;retur n select ion;4.4.2交叉方法交叉方法可用的交叉方法有以下几种。设 p1,p2是要交叉的两个
13、父染色体,c1,c2是子代,是交叉的结果,n是编码长度。单点交叉:先随机生成交叉位置m(0 m : n -1),把p10:m与p20:m部分互换分 别得到c1,c2。443变异方法采用随机变异方法。随机生成变异数目 m,随机选择m个皇后把它去掉,然后再随机选择m个位置放上皇后。单亲遗传:通过随机交换适应度最低的基因与其他基因的位置,产生新的子代具体性实现如下:/ 单亲遗传 父代变异函数void SimpleMutate ()int i, j, swap ;int worst ;Population baby ;worst = 0 ;for (i = 0 ; i n ; i+)if (s_pop
14、ulation.eachFitnessi s_population.unitFitness| (double)rand() / RAND_MAX Critical) s_population = baby ; 双亲遗传中的变异算子,对种群中的最优两个个体保留,并局部变异看是否可以 达到结果,具体代码如下:/ 单亲遗传 父代变异函数void MultiMutate (Population* p)int i, j, swap ;int worst ;Population baby ;worst = 0 ;for (i = 0 ; i eachFitnessi eachFitnessworst)wo
15、rst = i ;baby = *p ;for (i = 0 ; i p-unitFitness | (double)rand() / RAND_MAX M_Critical)*p = baby ;break ;4.5局部搜索在实验中,发现遗传算法在求解 N 皇后问题时,前期算法收敛非常快,而到了算 法运行的后期算法收敛就比较慢, 特别是当适应度为 1 时.就是因为遗传算法的全局搜 索能力较强,而局部搜索却较弱。局部搜索算法的基本思想为:依次交换染色体的基因位,当发现得到的新个体的 适应值小于交换前的个体的适应值时, 停止局部搜索 .该局部搜索算法实际上改良了当 前代的最优个体的染色体。由于局
16、部搜索的时间耗费较多,为了提高算法的效率,我 们只对当前种群中的最好的个体的进行局部搜索操作 .4.6终止策略本文采用的终止策略为:当群体中的最优个体的适应值为 0 时,即表示算法搜索 到了一个有效解。4.7实现描述A、双亲遗传算法。1.产生初始种群。2.从当前种群中选择两个个体。3.把选中的两个父个体杂交生成中间个体。4.重复2和3的(选择和杂交)操作直至中间个体生成完毕。5.对杂交后的中间个体根据变异概率进行变异,生成新种群。6.检验停止准则,如果有解则停止,否则转到 2重复执行。B、单亲遗传算法。1.产生初始种群。2.对当前种群根据变异概率进行变异,生成新种群。3.检验停止准则,如果有解
17、则停止,否则转到 2重复执行。五、实验结果和分析选择8个皇后作为测试用例。实验使用内存为 512M的PC机进行测试,操作系统为WINDOWS,7开发软件为VC+6.0,开发语言为C+程序经过执行后,输入8,则得到一个优化解,如下图:8社塑: Mon 结東:Mon 翟蛊丈小为8 运障用了苴中一个解为DecDec21 15:11:Q4 201521 15:11:04 2015秒.Un匚k次迭代次数为:91由结果可得:程序的开始时间与结束时间,因而得出运算所用时间,这里运算时 间非常小,因而为0秒。还可以看到八皇后的一个优化解,与本次迭代的次数。继续输入 8,又可以得到八皇后的一个解与相应的迭代的次
18、数,连续输入 20 次,则得到的迭代次数为: 91,1317 ,165,233,359,30,11,40,216,127,195,639,13,200,90,177,219,274,1072,2691 。算得平均迭代次数为: 408 次。六、总结与思考就编写的程序而言,虽然能达到预期的结果,但总体结构还不够简洁,不太容易 去理解。许多问题还需要继续研究,许多技术还需要更多的改进。去图书馆借了不少 书,也去网上看了些资料, 只是对大概的知识有了点了解, 但还是很难着手于写代码, 后来就按照老师说的,先搞清楚原理,再考虑如何去实现!后来又去上网查看相关资 料,又到图书馆借了很多书看,总算有头绪了。
19、但在调试过程中,还是遇到了很多困 难,后来通过了室友的帮助才把问题解决了。在编写代码时,我希望能随机选择一数 X(192)后,能输出该种情况所对应的八 个皇后的摆放方式和每个皇后所在的位置,但想了好久,就是无法实现。而且,当 92 种情况都输出时,前面的几十种情况无法看到,要想让摆放皇后的图形和所在具体的 位置一起输出,就得修改程序让使她们一个一个地输出,这样显然比较麻烦。针对八皇后这个课题,也许表层只局限于对八个皇后的摆放,但还可以对更多的 情况进行探讨分析,比如九皇后,十皇后等等。但也许随着皇后个数的增多,程序运 行的时间将变得长,考虑能否将运行的时间继续缩短。总之,通过这次的程序设计,我从中得到了许多。从这个八皇后问题设计以及分 析中,本人从中理解到了算法与数据结构对于计算机软件设计的重要性。它的使用, 可以改变一个软件的运行周期,也可以将软件的思路从繁化简,并且都能够通过数据 结构的相关引导,将本身以前编程思想进行扩充。在这个阶段,我也明白了,好的思 想,不能提留于字面上的认知,还需要的是平时多练多写一些相关的程序,并且通过 修改,加入新的算法去尝试改变自己的一些编程思想。只有多练多做,才能拥有新思 维、新想法,只有多练多做,才能写出效率高的程序。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1