回溯法讲义.ppt

  1. 1、本文档共134页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
回溯法讲义

该问题的解空间可以组织成一棵树,从树的根结点到任一 结点的路径定义了图G的一条周游路线 1 . 回溯法 求问题所有解:要回溯到根,且根结点的所有子树都已被搜索遍才结束。 求任一解:只要搜索到问题的一个解就可结束。 1 . 回溯算法设计过程 step1 确定问题的解空间; step2 确定结点的扩展规则; step3 搜索解空间。 2 回溯法应用-例8.1 八皇后问题 n皇后问题 要在n*n的国际象棋棋盘中放n个皇后,使任意两个皇后都不能互相吃掉。规则:皇后能吃掉同一行、同一列、同一对角线的任意棋子。求所有的解。 n=8 2 回溯法应用-例8.1 八皇后问题 设八个皇后为xi,分别在第i行(i=1,2,3,4……,8); 问题的解状态:可以用(1,x1),(2,x2),……,(8,x8)表示8个皇后的位置; 由于行号固定,可简单记为:(x1,x2,x3,x4,x5,x6,x7,x8); 问题的解空间:(x1,x2,x3,x4,x5,x6,x7,x8),1≤xi≤8(i=1,2,3,4……,8),共88个状态; 约束条件:八个(1,x1),(2,x2) ,(3,x3),(4,x4) ,(5,x5), (6,x6) , (7,x7), (8,x8)不在同一行、同一列和同一对角线上。 2 回溯法应用-例8.1 a 盲目的枚举算法 a 盲目的枚举算法 通过8重循环模拟搜索空间中的88个状态; 按枚举思想,以DFS的方式,从第1个皇后在第1列开始搜索,枚举出所有的“解状态”: 从中找出满足约束条件的“答案状态”。 2 例8.1 a 盲目的枚举算法 2 回溯法应用-例8.1 b加约束的枚举算法 如果能够排除那些没有前途的状态,会节约时间; 2. 回溯法应用-例8.1 b加约束的枚举算法 2 例8.1 b加约束的枚举算法 此算法可读性很好,体现了“回溯”。但它只能解决八皇后问题,而不能解决任意的n皇后问题。 2 回溯法应用-例8.1 c递归回溯算法 2 回溯法应用-例8.1 d非递归回溯算法 2 回溯法应用-例8.1-算法说明 八皇后问题中的核心代码: 遍历过程函数; check函数。 2 回溯法应用-例8.2 n皇后问题 设n个皇后为xi,分别在第i行(i=1,2,…,n); 问题的解状态:可以用(1,x1),(2,x2),……,(n,xn)表示n个皇后的位置; 由于行号固定,可简单记为:(x1,x2,…,xn); 问题的解空间:(x1,x2,…,xn),1≤xi≤n(i=1,2,…,n),共nn个状态; 约束条件:n个(1,x1),(2,x2) ,… ,(n,xn)不在同一行、同一列和同一对角线上。 2 回溯法应用-例8.2 n皇后问题 2 回溯法应用-例8.2 n皇后问题 介绍过的方法: c递归回溯算法; d非递归回溯算法; 2 回溯法应用-算法框架-非递归回溯框架 int a[n],i; 初始化数组a[ ]; i=1; While (i0(有路可走)) and (未达到目标) //还未回溯到头 { if (i=n) 搜索到一个解,输出; //搜索到叶结点 else //正在处理第i个元素 {a[i]第一个可能的值; while (a[i]不满足约束条件且在搜索空间内) a[i]下一个可能的值; if (a[i]在搜索空间内) {标识占用的资源; i=i+1;} //扩展下一个结点 else {清理所占的状态空间;i=i-1;} //回溯 } } 2 回溯法应用-算法框架-递归算法框架 int a[n]; try(int i) { if (in) 输出结果; else for(j=下界 ; j=上界; j++) //枚举i所有可能的路径 { if ( check(j)=1) //满足限界函数和约束条件 { a[i]=j; …… //其它操作 try(i+ 1);} 回溯前的清理工作(如:a[i]置空值); } } 2.1 再说递归-函数调用 调用、返回 谁调用,返回谁; 返回后,执行下一句代码; 参数传递 传值、传址; 2.1再说递归- hanoi塔程序 2.1再说递归- hanoi(2,a,b,c)的递归树 void hanoi(int n, char a,char b, char c) { if (n0)

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档