湘潭大学算法设计与分析第五章回溯法.ppt

湘潭大学算法设计与分析第五章回溯法.ppt

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

计算机算法设计与分析 第五章 回溯法 用计算机求解问题 计算机求解的过程 在状态空间寻找机内解可以看成是从初始状态出发搜索目标状态(解所在的状态)的过程。 求解是状态空间的搜索 求解的过程可以描述为对状态空间的搜索 几种搜索方法 三种搜索的优劣之处 一般来说,三种搜索方法各有优劣之处: 广度优先搜索的优点是一定能找到解;缺点是空间复杂性和时间复杂性都大。 深度优先搜索的优点是空间复杂性和时间复杂性较小;缺点是不一定能找到解。 启发式搜索是最好优先的搜索,优点是一般来说能较快地找到解,即其时间复杂性更小;缺点是需要设计一个评价函数,并且评价函数的优劣决定了启发式搜索的优劣。 树搜索的一般形式 SearchTree(Space T)//表L用来存放待考察的结点 {unfinish = true; L = T.initial; // unfinish表示搜索未结束,先将初始状态放入L while (unfinish || L≠Φ) { a = L.first; //从L中取出第一个元素 if (a is goal) unfinish = false //若a是终态则结束 else Control-put-in(L, Sons(a)); } //否则,将a的儿子们以某种控制方式放入L中 三种搜索的不同之处 其中,深度优先搜索就是回溯法。 回溯法的形式化描述 假设能够用n元组(x1,x2,…,xn)表示一个给定的问题P的解,其中xi∈集合Si;n元组的子组( x1,x2,…,xi )(in),如果它满足一定的约束条件,则称为部分解。 如果它已经是满足约束条件的部分解,则添加xi+1∈Si+1形成新的子组( x1,x2,…,xi ,xi+1 )并检查它是否满足约束条件,若满足则继续添加xi+2∈Si+2,并以此类推。如果所有的xi+1∈Si+1都不满足约束条件,那么去掉xi+1,回溯到xi的位置,并去掉当前的xi,另选一个xi’∈Si,组成新的子组( x1,x2,…,xi’ )并判断其是否满足约束条件。 如此反复下去,直到得到解或者证明无解为止。 递归回溯法的一般形式 Try(s){ 做挑选候选者的准备; while (未成功且还有候选者) { 挑选下一个候选者next; if (next可接受) { 记录next; if (满足成功条件) {成功并输出结果} else Try(s+1); if (不成功) 删去next的记录; }} return 成功与否} 迭代回溯法的一般形式 先让我们回顾解空间搜索的一般形式: 如何判断最后一个儿子? 若只要遍历解空间树上的结点,那么将各个结点按栈的方式控制便可实现深度为主的搜索。 但是在求解问题时,需要记录解的路径,在回溯时还需要删除结点和修改相应的信息。 栈中的结点是分层次的,而现在没有区分它们的层次。这就增加了回溯判断和操作的困难。 用末尾标记的迭代回溯 Backtrack(Tree T) { unfinish = true; L.Push(T.root); while (unfinish || L≠Φ) { a = L.Pop( ); if (a is the last mark) backastep( ); else if (a is good) {record(a); if (a is goal) {unfinish = false; output( );} else if (a has sons) L.Push-Sons(a) else move-off(a);}}} 不可接受的结点 破坏了解的相容条件的结点 超出了状态空间的范围,或者说不满足约束条件的结点; 评价值很差的结点,即已经知道不可能获得解的结点; 已经存在于被考察的路径之中的结点,这种结点会造成搜索的死循环。 数的全排列问题 对于指定的n个数字,输出它所有可能的排列。 容易知道n个数字恰有n!个排列。 它有一个隐含的约束条件:每个数字用且只能用一次。 全排列问题的解空间树 设n=4,而需要排列的4个数字分别为:1,2,3,4。回顾我们手工对这四个数字的排列过程: (1 2 3 4) (1 2 4 3) (1 3 2 4) (……………) (4 3 2 1) 全排列问题中的数据表示 数组rec[n+1]记录当前搜索路径上的每个结点所放置的数字; 数组used[n+1]记录当前搜索路径上已经被使用过的数字; 用递归回溯法求N数全排列问题 Try(s){ 做挑选候选者

文档评论(0)

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

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

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档