先解释下什么是8皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。在不考虑翻转和旋转等价的情况下,8皇后问题共有96个不同的解。

而n皇后问题就是将8*8的棋盘换为n*n的棋盘,同时摆放n个皇后使之不能相互攻击。

常用的解法是回溯法,通过不断递归的尝试来一个一个放置棋子,这种方法其实规避了很多不成立的情况,所以控制了一些解空间的范围,但是这种方法试图在一段程序当中将所有解求出来,随着n的变大,解空间在急速变大,递归的巨大空间开销会让求解变得很困难,效率会下降很多。

遗传算法也可以用来解决n皇后问题,但是遗传算法的本质是根据适应值来选择和制造更多的靠近目标情况的解,所以不一定能得到所有的解,同时也不能知道对于确定的n皇后问题的解的个数。在这种情况下的遗传算法有一些暴力破解的因素在其中。

下面谈一谈几个关键问题的解决(以8皇后问题为例)。

1、编码问题

我采用的是整数编码,染色体长度(基因位的个数)等于8,每一位为一个整数(该整数≥0,<8*8),且不能相同,每一个基因位表示的就是一个棋子摆放的位置。

2、适应值的计算问题

适应值的评价标准为发生冲突的个数n的倒数,即冲突越多,适应值越低,不发生冲突时适应值为1(1/1),但是这种评价也存在一定的问题,就是随着冲突的增多,适应值的减小会变的没那么明显(比如说不冲突适应值为1,冲突一个为0.5,冲突2个为0.333,冲突三个为0.25,冲突四个为0.2),所以选择的力度会相对较弱。可以考虑改为其他的方式进行评价。

3、选择问题

采用的是线性排名选择方式,因为上述原因,采用线性排名选择策略会一定程度上抵消掉适应值计算的问题。

4、突变问题

突变采用的是自适应性变异,即越收敛搜索范围越小的方法。

网友评论