摘要
八皇后问题是回溯算法的典型案例,在回溯法中,常常是盲目搜索,耗费过多的搜索时间。在本次实验中,使用了启发式搜索,搜索时不是任取一个分支,而是选择最佳的分支往下搜索。通过定义状态空间、操作规则、搜索策略,我们可以清晰快速地得到原问题的一个解。
导言
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。通过计算机编程,我们可以快速地求出问题的解。
实验过程
状态空间
(i,C[i]), i = 0,1,…,7;
(i,C[i])表示第i行的皇后放置在第C[i]列。
初始状态为C[i] = -1, i = 0,1,…,7;表示所有行都不放置皇后。
目标状态为C[i] != -1, i = 0,1,…,7;表示所有行都已经放置了皇后。
操作规则
第一个皇后放在第一行;
第二个皇后放在第二行且不与第一个皇后在同一列或对角线的空格上;
……
第i个皇后放在第i行且不与前面i-1个皇后在同一列或对角线的空格上。
搜索策略
由于在某一步放置某个皇后时,可能有多个空格可以使用,所以定义启发式函数:
fx = 剩下未放行中能够用来放皇后的空格数
如果第i行的皇后放在第j列合法,计算启发式函数的值fx(i,j)。计算出第