回溯法在问题的解空间树中.pptVIP

  • 370
  • 0
  • 约3.48千字
  • 约 14页
  • 2017-09-02 发布于天津
  • 举报
回溯法在问题的解空间树中

问题的解空间 回溯法的基本思想 (1)针对所给问题,定义问题的解空间; (2)确定易于搜索的解空间结构; (3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。 常用剪枝函数: 用约束函数在扩展结点处剪去不满足约束的子树; 用限界函数剪去得不到最优解的子树。 n后问题 在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。 算法设计 用n元组x[1:n]表示n后问题的解。其中,x[i]表示皇后i放在棋盘上的第i行的第x[i]列。 n后问题满足的基本条件:不允许将两个皇后放在同一行、同一列、同一对角线. 如果将n*n格的棋盘看做二维方阵,其行号从上到下,列号从左到右依次编号为1,2。。。n,从棋盘左上角到右上角的主对角线及其平行线(即斜率为-1的各斜线)上,2个下标值的和(行号+列号)值相等。因此,若将2个皇后放置的位置分别为(i,j)和(k,l),且i-j=k-l或i+j=k+l,则说明这2个皇后处于同一斜线。以上两个方程分别等价于i-k=j-l和i-k=l-j。由此可知,只要|i-k|=|j-l|成立,就表明2个皇后在同一条斜线上。 可行性约束Place剪去不满足行、列、斜线约束的子树 1)不同列:x[j]?x[k] 2)不处于同一正、反对角线:|j-k|?|x[j]-x[k]| Place(int k) { for (int j=1;jk;j++)//j表示行数,k为当前所放的第k个皇后 if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false; return true;//如果与前面的i个皇后在同一斜线或同一 列上,返回false,否则返回true } 解n后问题的非递归迭代回溯法可描述如下: void Queen::Backtrack(void) { x[1]=0; int k=1,method=1,j=1;//method表示第几种方案 int result[n+1][n+1]; for(int i=1;i=n;i++) { for(int j=1;j=n;j++) result[i][j]=0; } while(k0){ x[k]+=1;//选择下一列 while((x[k]=n)!(Place(k))) x[k]+=1;//在第x[k]列成功放置 if(x[k]=n) if(k==n) { sum++;//n个皇后成功放置,记录可行方案数 for(int i=1;i=n;i++) { result[method][i]=x[i]; } method++; } 实验结果 回溯法之n后问题 信计2班 邢晶晶 20111002203 贺译冉 20111002206 梁 琴 20111002225 回溯法 有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。 回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。 问题的解向量:回溯法希望一个问题的解能够表示成一个n元式(x1,x2,…,xn)的形式。 显约束:对分量xi的取值限定。 隐约束:为满足问题的解而对不同分量之间施加的约束。 解空间:对于问题的一个实例,解向量满足显式约束条件的所有多元组,构成了该实例的一个解空间。 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 Q Q Q Q Q Q Q Q else{ k++;//放置下一个皇后 x[k]=0; } else k--;//放置不成功,返回上一行 } coutn皇后有sum种方案:endl; for(int m=1;mmethod;m++) { for(int i=1;i=n;i

文档评论(0)

1亿VIP精品文档

相关文档