- 1、本文档共95页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机算法设计与分析 第五章回溯法 计算机求解的过程 求解过程可看成在状态空间从初始状态出发搜索目标状态(解所在状态)的过程。 求解是状态空间的搜索 求解的过程可以描述为对状态空间的搜索 几种搜索方法 状态空间的搜索实际上是一种树/DAG的搜索,常用的方法有: 三种搜索的比较 理论上广度优先搜索与深度优先搜索的时间复杂性都是指数级。但在实际上深度优先搜索的时间复杂性要低,在空间复杂性更要低得多。 广度优先搜索是一定能找到解;而深度优先搜索在理论上存在找不到解的可能。 启发式搜索是最好优先的搜索,若评价函数设计得好则能较快地找到解,降低时间复杂性;因而评价函数的优劣决定了启发式搜索的优劣。另外评价函数本身的开销也是很重要的。 树搜索的一般形式 SearchTree(Space T) {ok = 0; L = T.initial; while (!ok || L≠?) { a = L.first; if (a is goal) ok = 1 else Control-put-in(L, Sons(a)); } 三种搜索的不同之处 其中,深度优先搜索就是回溯法。 递归回溯法的一般形式 Try(s){ 做挑选候选者的准备; while (未成功且还有候选者) { 挑选下一个候选者next; if (next可接受) { 记录next; if (满足成功条件) {成功并输出结果} else Try(s+1); if (不成功) 删去next的记录; }} return 成功与否} 迭代回溯法的一般形式 先让我们回顾解空间搜索的一般形式: 迭代回溯法的一般形式 先让我们回顾解空间搜索的一般形式: 迭代回溯法的一般形式 先让我们回顾解空间搜索的一般形式: 如何判断最后一个儿子? 若只要遍历解空间树的结点,那么将各结点按栈方式控制便可实现深度为主搜索。 在求解问题时,需要记录解的路径,在回溯时还需要删除结点和修改相应信息。 栈中结点应该分层次,而却没有区分其层次。这就增加了回溯判断和操作的困难。 如何判断最后一个儿子? 若只要遍历解空间树的结点,那么将各结点按栈方式控制便可实现深度为主搜索。 在求解问题时,需要记录解的路径,在回溯时还需要删除结点和修改相应信息。 栈中结点应该分层次,而却没有区分其层次。这就增加了回溯判断和操作的困难。 用末尾标记的迭代回溯 Backtrack(Tree T) { Ok = 0; L.Push(T.root); while (!Ok|| L≠?) { a = L.Pop( ); if (a is the last mark) Backastep( ); else if (a is good) {Record(a); if (a is goal) {Ok = 1; Output( )} else if (a has sons) L.Push-Sons(a) else Move-off(a);}}} 用末尾标记的迭代回溯 Backtrack(Tree T) { Ok = 0; L.Push(T.root); while (!Ok|| L≠?) { a = L.Pop( ); if (a is the last mark) Backastep( ); else if (a is good) {Record(a); if (a is goal) {Ok = 1; Output( )} else if (a has sons) L.Push-Sons(a) else Move-off(a);}}} 用末尾标记的迭代回溯 Backtrack(Tree T) { Ok = 0; L.Push(T.root); while (!Ok|| L≠?) { a = L.Pop( ); if (a is the last mark) Backastep( ); else if (a is good) {Record(a); if (a is goal) {Ok = 1; Output( )} else if (a has sons) L.Push-Sons(a) else Move-off(a);}}} 用末尾标记的迭代回溯 Backtrack(Tree T) { Ok = 0; L.Push(T.root); while (!Ok||
文档评论(0)