2.四皇后问题 在一个4×4的国际象棋棋盘上,一次一个地摆布四枚皇后棋子,摆好后要满足每行、每列和对角线上只允许出现一枚棋子,即棋子间不许相互俘获。图2.2给出棋盘的几个势态,其中a,b满足目标条件,c,d,e为不合法状态,即不可能构成满足目标条件的中间势态。 图2.2四皇后问题棋盘的几个势态 综合数据库:DATA=L(表),L的元素。DATA非空时,其表元素表示棋子所在的行和列。因只有4个棋子,故表元素个数最多为4。 图2.3 固定排序搜索树 在回溯策略中,也可以通过引入一些与问题有关的信息来加快搜索到解的速度。对于皇后问题来说,由于每一行、每一列和每一个对角线,都只能放一个皇后,当一个皇后放到棋盘上后,不管它放在棋盘的什么位置,它所影响的行和列方向上的棋盘位置数是固定的,因此在行、列方面没有什么信息可以利用。但在不同的位置,在对角线方向所影响的棋盘位置数则是不同的,可以想象,如果当把一个皇后放在棋盘的某个位置后,它所影响的棋盘位置数少,那么给以后放皇后留有的余地就大,找到解的可能行也大;反之留有的余地就小,找到解的可能行也小。如下图所示,(a)图皇后所影响的最长对角线是3,而(b)图皇后所影响的最长对角线是2,显然在(b)图位置放置皇后找到解的可能性大于(a)图位置。利用这样的信息对可应用规则集进行动态排序,可以加快找到解的速度。比较图2.3和图2.4,可以说明这种方法对于加快找到解的速度是很有效的。 对四皇后问题,如果要利用问题有关信息对规则进行动态排序,则可定义一个对角线函数diag(i,j)。该函数可计算出过棋盘上ij单元的最长的对角线长度,通过比较不同单元的diag(i,j)函数值来决定的排序。如diag(i,k)<diag(i,j),则为(,),即对角线短的单元,相应的规则排在前面;若diag(i,k)=diag(i,j),则仍为(,)。由此可计算得规则序列为,这样所得搜索示意图如图2.4所示,利用这样的规则排序方法后,只回溯2次就找到了目标。 图 2.4 动态排序搜索树
|