搜索算法在经典问题中的运用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
搜索算法在经典问题中的运用

搜索算法在经典问题中的运用 搜索方式 经典问题 深度优先搜索(Deep First Search) 求割顶和割边 求有向图中的强连通分量 求欧拉回路 Hanoi塔等递归求解问题 广度优先搜索(Broad First Search) 求单源最短路径(迭代的思想) 特别的,当任两点间的权值都相等时,广度优先搜索的时间复杂度为O(n + e),优于传统的Dijkstra算法。 求网络流问题中的增广轨 表中所列大部分都是图论中的基础问题,很多题目都以其为基本模型而出。可见,搜索算法早已成为选手必须掌握的基本功,而它广泛的灵活性和实用性则是以下我们所要探讨的关键。 3.1.2常用的搜索算法 一 迭代加深搜索 先限定搜索树的最大深度axDeep再搜索。如果加大axDeep继续搜。虽然这样进行了很多重复工作,但是搜索的工作量与深度成指数关系,因此上一次(重复的)工作量比起当前的搜索量是较小的。这种方法宽深但可行解的题目一般的深度优先可能陷入很深又没有解的,广度优先空间又… + 1/an n 不妨设a1 < a2 < … < an。 剪枝手段 —— 定分母的上下界 设限定的搜索层数为D ,当前搜到第C层,当前正要枚举分母ak ,还需枚举总和为x/y的分数。answer[D]表示当前最优解中的第D个分母,如果还没有得到解则表示正无穷。则必然有: Max( (y / x( ,ak-1) + 1 ≤ ak ≤ Min ( ((D-C+1) * y / x( ,(Maxlongint / x( ,answer[D]-1 ) 枚举的初值容易得出,但终值的确定则要用到我们一开始对分母有序性的假设了。 值得注意的是,直接限界避免了搜索过程中屡次使用可行性剪枝,一定程度上提 高了程序的运行速度。 实际上本题还有一种剪枝手段 —— 借助动态规划预见后续搜索是否有意义。这一点将在下一节“搜索的基本优化手段”中的“最优性和可行性剪枝”一栏的例题“彩票问题”中得到详尽的分析。 至此,本题已得到较好的解决。在编程过程中我们可以发现,迭代加深搜索具有以下特点: 空间耗费小 这是它最大的优点。 时间效率不低 虽然它确实做了一些重复的工作,但是正如前面所分析的那样,之前的搜索量与当前的搜索量比起来是“小巫见大巫”的。 便于剪枝 实现方便,易于调试 也正是基于以上优点,迭代加深的思想才被广泛应用于各类模型当中。 二 记忆化搜索 记忆化搜索可以说是动态规划的搜索实现方式。基于有些动态规划的规划方程不好用简单的式子描述,记忆化搜索就以其简洁清晰省事的语言,代替了传统的规划模式。虽然说记忆化搜索的本质是动态规划 —— 目标明确没有重复,但是与后者相比,它还是存在占用栈空间过多、时间效率较低的缺点。因此高级选手不到万不得已是很少使用记忆化搜索的。 [例一] 选课问题(经典问题) 有N(N≤1000)门功课,第i门功课有Si个学分,每门功课可能有一门直接选修课(即必须选完它的直接选修课才能选这门功课),求选M门功课所得的最大学分。 分析 这是一道树形结构的动态规划试题,我们可以用循环实现,也可以用递归实现。后者称之为记忆化搜索,本题中相对于前者可读性更高。下面我们来介绍它的实现方式。 建模 增设虚课程γ为所有无直接选修课程的功课的直接选修课,其学分为0。 本题的模型是一棵多叉树,为了降低规划方程的维数,先用儿子~兄弟法将其 转化成二叉树。 设F[i,j]表示在以节点i为根节点的子树中选j个节点所能得到的最大分数, 其中节点i必选。lc为i的左儿子节点,rc为i的右儿子节点,mark[i]为第i 门功课的学分。则: F[i,j] = Max ( F[lc,k] + F[rc,j-k-1] ) + mark[i] 2 实现 从根节点开始递归求解,直至找到叶子节点后回溯,自底向上依次求得F函数 值。在求某节点的F函数值时,若它的儿子节点的F函数值已经求出,则直接运 算,不再深入递归。 从这道题目可以看出,记忆化搜索的思路的确非常清晰,编起来也很容易。但是由于牵涉到递归,在时间上多少会有些损失,这在较复杂或者规划方程本身时间复杂度较高的题目中体现的越发明显。而空间上的开销也是一个不可回避的问题。 三 产生式系统 产生式系统是用来

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档