收藏 分享(赏)

数据结构与算法设计PPT (20).pdf

上传人:职教中心 文档编号:13704902 上传时间:2022-10-11 格式:PDF 页数:25 大小:908.20KB
下载 相关 举报
数据结构与算法设计PPT (20).pdf_第1页
第1页 / 共25页
数据结构与算法设计PPT (20).pdf_第2页
第2页 / 共25页
数据结构与算法设计PPT (20).pdf_第3页
第3页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、第5章递归5.3回溯法算法设计技术回溯 通过搜索状态空间树来求问题的可行解或者最优解的过程 可行解:满足约束条件 最优解:目标函数取得最大或者最小值 使用约束函数或界限函数来压缩实际生成的状态空间树的结点个数 通常回溯法是未了找出满足约束条件的所有可行解问题的解空间 回溯法要求问题的解向量具有n元组(x0,x1,xn-1)形式 显示约束:对每个Xi取值的约束 隐式约束:给出一个判定候选解是不是可行解的条件状态空间树 描述问题解空间的是树型结构 树中每一个结点都是一个问题的状态 若从根到树中某个状态的路径代表一个候选解的元组,则称该状态为解状态 若从根到树中某个状态的路径代表一个可行解的元组,则

2、称该状态为答案状态回溯法 在求解的过程中,以深度优先方式逐个生成状态空间树中的结点,求问题的可行解或最优解 为提高搜索效率,在搜索过程中用约束函数和界 函数 不 要的搜索 树, 问题求解 要 生成的状态空间树结点数, 效搜索 回溯法对解空间 深度优先搜索, 在一 用递归方法 回溯八皇后问题八皇后问题 一个 的 个 得的currency1个间“不fi fl的currency1个不可 行 求出一 方法,或求出 有 方法QQQQQQQQ123456781 2 3 4 5 6 7 888 chessboard解向量 解向量(x0,x1,xn-1)其中xi表 i 的 所 的行 , (6,4,7,1,8,

3、2,5,3) 约束 i 0,1, 行 约束 不 一 解空间 n QQQQQQQQ123456781 2 3 4 5 6 7 8四皇后问题解空间状态树 结点序号是深度优先遍历过程访问的顺序 边上标号是每一列皇后的选择行号 候选解是从根到叶子结点的路径12 503418 X1=115121o75 17 31 33282623211383292419 454035 6156511411964 16 30 32272522202 34 X2=2 3 4 1 3 41 241 23X3=311 43 42 32 43 44 3 4 2 3 2 4 3 4 1 3 x4=11结点到5结点路径上(1,2,3

4、,4)是一个候选解四皇后问题解空间状态树12 503418 X1=115121o75 17 31 33282623211383292419 454035 6156511411964 16 30 32272522202 34 X2=2 3 4 1 3 41 241 23X3=311 43 42 32 43 44 3 4 2 3 2 4 3 4 1 3 x4=11结点到5结点路径上(1,2,3,4)是一个候选解第2列上的皇后,符合显示约束状态空间树的遍历方法 搜索解 案 是 状态空间树 结点状态 结点:”的结点, 有 点 点: 有 点的点 点:一个结点,在搜索 的 点递归回溯算法框架由于回溯是对解

5、空间进行深度优先搜索所以一般情况下会采用递归方法 in in 每一个x 得x 是状态 的一个 结点 x 1 ,x x 约束函数为 i (x 1 ,x x )是一个可行解 出x 1 ,x x ;n ( 1) i 状态 有 结点“不是 状态, 回 一用 非递归回溯算法框架也可以采用迭代算法求解效率更高 in in in 0 i 0 i 的x 得x 是状态 的一个 结点 x 1 ,x x 约束函数为 i (x 1 ,x x )是一个可行解 出x 1 ,x x ; - 剪枝的重要性 8 有过281,474,976,711,000候选解 currency1 可行的候选解, 是到所有选“都fifl 解是可

6、行 的8 状态树 约有16,000个候选解 12个解( 称,则为92个)8皇后求解策略(a) 前5个女王不能互相攻击,但第6列所有位置安放第6个皇后都会受,然后再次考虑第5到攻击;(b) 所以需要回溯到第5列,为第5个皇后尝试另一个位置;(c) 第5个皇后尝试失败,继续回溯到第4列尝试为女王做另一个选择列皇后的安放8皇后问题:- 8皇后放在棋盘上,以使任何皇后都不能攻击其他皇后。- 显示约束:每一列皇后不在一行- 隐式约束:不在一个正反对角线上Q8皇后问题const int BOARD_SIZE = 8; / squares per row or columnclass EightQueens

7、 public:EightQuens();/ Sets all squarestoEMPTY.voidclearBoard(); / Sets all squarestoEMPTY.voiddisplayBoard(); / Displays theboard.boolplaceQueens(intcurColumn);/ Places queens in columns of the board beginning at column specified./ Precondition: Queens are placed correctly in columns 1 through/curr

8、Column-1 and no Queens are placed in columns currColumn through/ BOARD_SIZE./ Postcondition: If a solution is found, each column of board contains one/ queen and the function returns true otherwise returns false (no solution/ exists for a queen anywhere in column currColumn).8皇后问题类的定义与实现private:intb

9、oardBOARD_SIZE; / row-position per column, (zero=no queen)/ NOTE: board is zero-indexed for columnsvoidsetQueen(introw, intcolumn);/ Places a queen in a given row and column. / Postcondition: There is exactly one queen in the given column.voidremoveQuen(introw, intcolumn);/ Removes a queen from a gi

10、ven row and column. / Postcondition: There is no queen in the given column.boolisUnderAttack(introw, intcolumn);/ Determines whether the square on the board at a given row and columnis under attack by any queen in any column./ Precondition: Queens are placed correctly, i.e. 0=boardi=8 for 0=i BOARD_

11、SIZE) return true; / base caseelse bool queenPlaced= false;int row = 1; / number of square in columnwhile ( !queenPlaced& (row = BOARD_SIZE) ) / if square can be attackedif (isUnderAttack(row, curColumn)+row; / then consider next square in currColumnelse / else place queen and consider next columnse

12、tQuen(row, curColumn);queenPlaced= placeQueens(curColumn+1); / if no queen is possible in next column, /backtrack: remove queen placed earlier and try next square in column if (!queenPlaced) removeQuen(row, curColumn);+row;/ end of while return queenPlaced;/ end placeQueens迷宫问题 示的 每一个 - - 出发出 的 采用回溯

13、法解决问题入口出口入口出口1,(1,1),32,(1,2),33,(1,3),4入口出口迷宫问题的算法思想/初始化工作栈,迷宫入口坐标和”E”方向首先进栈。/初始化mark为0,markij=0,表示该位置未走/过。每当一个位置走过,markij=1。防止走2次。while ( 栈非空) ( i, j, dir) = 从栈顶退出的坐标和方向;while( 还有移动) (g, h) = 下一移动的坐标;if ( g = m & h = p ) 迷宫(!Mazegh & !markgh)搜索成功; /出口if /合法的移动markgh = 1;dir= 下一次将要移动的方向;(i, j , dir

14、) 进栈;i= g; j = h; dir= N; i p in m, in p m 1 1 1 / 1, 1 是 S i m m p /设 工作栈i m mp mp.x 1 mp.y 1 mp.i E . Pu mp i ! .I Emp y mp .P p in i mp.x in j mp.y in mp.i i in g i m . in j m .bif ( g = = m & h = = p )cout st;cout i “” j endl;cout m “” p endl;return;if ( !Mazegh & !markgh ) markgh = 1;tmp.x = i; tmp.y = j; tmp.dir = d + 1;st. Push( tmp );i = g; j = h; d = 0;else d +;cout “No path in Maze” endl;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报