【技术文档】《算法设计与分析导论》R.C.T.Lee等·第5章 树搜索策略
来源:互联网 发布:js百度地图api 定位 编辑:程序博客网 时间:2024/06/06 00:10
计算机中许多问题的解空间可以用一棵树来表示,最优解就在树中的一个分支上,因此,我们在解这类问题时可以采用树搜索策略,最经典的问题包括0/1背包问题、旅行商问题、哈密顿回路问题,还有8数码问题(就是我们小时候常玩的方格拼图游戏)。
在建立这颗树(解空间)时,我们用到的方法根据搜索的次序不同可以分为广度优先搜索、深度优先搜索和最佳优先搜索。打个比方来说明一下它们之间的不同。我准备找王二麻子办点事,怎么找到他呢?如果是广度优先搜索,我会先找我所有的朋友,如果这些朋友当中没有王二麻子这个人,再找我所有朋友的朋友,如果还没有,再找我所有朋友的朋友的朋友……直至找到为止;如果是深度优先搜索,也是先找我所有的朋友,如果这些朋友当中没有王二麻子这个人,再找我的一个朋友的所有朋友,如果还没有,再找我这个朋友的一个朋友的所有朋友……直至找到为止;如果是最佳优先搜索,还是先找我所有的朋友,如果这些朋友当中没有王二麻子这个人,从我的朋友当中选出人脉最广的那个人,找他的所有朋友,如果还没找到,从当前找到的人中选出人脉最广的那个人(排除已选出的人),接着找他的所有朋友……直至找到为止。
在最佳优先搜索中有“选出人脉最广的人”这一步,抽象成一般就是建立一个评价函数,如果将评价函数运用到深度优先搜索中的“我的一个朋友”的选择上,就得到了深度优先搜索的变形——爬山法。算法不同也体现在数据结构上,广度优先搜索、深度优先搜索、最佳优先搜索对应的数据结构分别为:队列、栈、堆,其中的妙趣读者自己去体会吧。
我们在计算机中遇到的问题往往是很庞大的,建立一个完整的解空间(树)是很困难的,也是没有必要的,我们利用分支限界策略能大大减小树的分支,使问题在计算机中更容易解决。
书中在分支限界策略这节有这么一段:“我们使用树搜索技术解决了许多问题,这些问题都不是优化问题,使读者感兴趣的是注意到上面的方法都没有用于解决任何优化问题,在本节中,将介绍分支限界策略,这也许是解决一大类组合问题的最有效策略之一”。如果此处“优化问题”是指“求最优解”,那我觉得这段描述有不妥之处。树搜索策略能将所有的解表示出来,那从中找出最优解应该不是难事,而书中这段却说树搜索策略”不能解决任何优化问题“。我对树搜索策略和分支限界策略的理解是:分支限界策略是树搜索策略的补充,前者使后者能更有效的找到最优解。言归正传,分支限界策略是在广度(深度、最佳)优先搜索的基础上加上一个界限,这个“界限以至于能终止许多分支”,大大提高算法的效率,所以分支限界策略的重点是在界限的设置上,比如用分支限界策略解决人员分配问题、旅行商问题时采用了简化代价矩阵等。
接下来,让我们学习一下A*算法。由于A*算法比较难理解(至少在我看来是这样的),我将这部分的内容分成了三个部分:预备知识,A*算法规则,规则真确性的证明。
预备知识。A*算法通常用于解决优化问题,下面我们就用它来解决平面中最短路径问题,先给出两个等式:
f*(n)=g(n)+h*(n),其中f*(n)表示节点n的代价,g(n)表示从开始节点到节点n的代价,h*(n)表示节点n到目标节点的最小代价;
f(n)=g(n)+h(n),其中f(n)表示节点n的估计代价,g(n)表示从开始节点到节点n的代价,h(n)表示节点n到目标节点的估计最小代价。
A*算法规则。理解了上面的两个等式,A*算法的规则就很简单了:
- 选择代价函数f(n)最小的点作为扩展点
- 若被选择的节点就是目标节点,则算法终止,最优解即为该点的代价函数值;否则,返回到第一步继续执行
规则真确性的证明。下面我们用数学语言来证明A*算法规则能最终保证结果就是最优解。
已知:t为被选中作为下一个做扩展的节点,也是目标节点,n为已扩展过的节点
求证:g(t)即为最优解
证明:
其实,对于其中“f*(n)之一必为最优解”我是没有想通的,如果哪位读者明白其中的道理不妨告诉我,万分感激!
已经学习了三大算法:贪心法、分治策略、树搜索策略,但头脑中还是没有形成清晰的脉路:什么问题用什么策略?在接下来的学习当中,需要多加分析、总结,这样才能在头脑中形成问题类型与解决策略的对应关系。
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第5章 树搜索策略
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第4章 分治策略
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第6章 剪枝搜索方法
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第3章 贪心法
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划
- 算法导论 第12章 二叉搜索树 C++实现
- 二叉搜索树(算法导论第12章)
- 算法导论第12章-二叉搜索树
- 算法导论-第12章-二叉搜索(查找)树
- 算法导论-第12章-二叉搜索树-12.2-1
- 《算法导论》第12章 二叉搜索树 个人笔记
- 【技术文档】《编程珠玑》Jon Bentley·第8章 算法设计技术
- 算法导论第17章 摊还分析
- 算法导论 第22章, 广度优先搜索算法
- 算法导论读书笔记 第4章 分治策略
- 《算法导论》第4章 分治策略 个人笔记
- 算法导论-第5章
- 《算法导论》笔记 第22章 22.2 广度优先搜索
- 电气设备常用文字符号新旧对照表
- Jrebel5.3.1 intellIj 12 破解方法
- 管理点滴
- 转载:PostgreSQL 查看数据库,索引,表,表空间大小
- 链表的顺序实现 重新编
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第5章 树搜索策略
- 如何高效使用SQLITE .NET
- 开关电源电路组成及常见各模块电路分析
- Sql Server使用正则表达式
- 有用的jquery搜集
- 電路圖知識
- ubuntu任务栏|右键菜单|窗口透明
- android笔记【三】
- iOS下uiview和uiscrollview设置背景图片的源码