论文--浅谈部分搜索+高效算法在搜索问题中的应用.docVIP

论文--浅谈部分搜索+高效算法在搜索问题中的应用.doc

  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文档。上传文档
查看更多
第 PAGE 1 页 共 NUMPAGES 12 页 第 PAGE 12 页 共 NUMPAGES 1 页 PAGE 8 浅谈部分搜索+高效算法在搜索问题中的应用 摘要: 本文从有位置限制的匹配问题的搜索谈起,通过对题目Milk Bottle Data的分析,提出了深度优先搜索的一种非常规搜索——部分搜索+高效算法。然后通过部分搜索在Triangle Construction和智破连环阵两题中的应用,探讨了部分搜索方法通用的主要优化方法,并从此方法本质分析其高效的原因所在和应用需要满足的要求和限制。 关键字:   部分搜索、高效算法 正文: 很多题目,如果我们可以建立数学模型,应该尽量用解析法来处理,因为简单的模型更清晰地反映了事物之间的关系。 但是,并不是所有的题目都可以建立简单的数学模型。我们这时必须使用搜索的方法,也就是枚举所有可能情况来寻找可行解或最优解。 由于搜索建立在枚举之上,所以搜索常常和低效是分不开的。有时搜索的运算量实在太大,实在是一件痛苦的事情。 于是我们需要利用很多技巧来提高效率,可行性剪枝,最优性剪枝和调整搜索顺序等方法都很有用,在它们的帮助下,我们可以大大提高搜索的效率。 而有些题目,这些常规的优化方法很难有用武之地。这是我们必须使用一些非常规的搜索方法。本文中我们将讨论非常规搜索中的一种——部分搜索+高效算法。 引题: N个物品与N个位置,给定每个物品的可能放的位置集合,要求寻找一一对应的关系,但还给出物品位置之间的限制(例如:如果1放在3则2不能放在1),求一组可行解,或给每一种对应关系一个权,求满足条件的最优解。 由于事物之间的限制关系非常复杂,很难建立简单的二分图关系,或者用网络流来解决。 面对这一系列类似的问题,我们一般只有搜索,如何搜索又如何优化呢? 简单分析: 如果我们枚举每一个物品的位置,然后判断,这样的时间复杂度为O(N!)。好像似乎也只能这样。 进一步分析: 我们看一个例子,N=6: 其它限制有4条(a,b,c,d)表示如果a放在b则c不能放在d 1 3 5 6 2 2 5 3 3 1 4 1 3 2 6 2 后来我们发现,如果我们一旦确定了3和5的位置,其它4个物品的位置之间已经没有限制关系了,这样其它4个物品的位置可以通过匹配来解决。 这时我们可以发现一个新的搜索模式:部分搜索。 部分搜索:搜索一部分变量,使得余下的变量之间的关系简化,然后通过一些高效算法(一般有匹配、解方程、贪心、动态规划等)完成余下问题。 就本题而言:先搜索一定数量(而不是全部)的物品的位置,使问题内物品的关系简化为二分图关系,用二分图匹配来解决余下的物品。 本质: 其实,例如上面的例子,如果我们先知道了3和5的位置后,不用匹配,其实我们是在用搜索来求匹配,效率当然不会高。 通过部分搜索为其它高效算法提供条件(例如上面的例子创造二分图关系),而其它高效算法代替搜索,高效地完成余下的任务。 部分搜索的方法充分发挥了搜索和其它高效算法的优势。搜索的优势在于应用性广,可以克服复杂的情况,其他高效算法的优势在于效率高。两者相互促进,同时也弥补对方的不足。这也是这个方法的成功的关键。 部分搜索+其它高效算法已经在很多题目中得到了应用。我们通过几个例子来探讨这种搜索方法的应用和优化技巧。 先看一个应用的例子。 Milk Bottle Data (ACM/ICPC Asia Regional Shanghai 1996) 【问题描述】 一个被分为N*N个网格的盒子,每一格有可能包含一瓶牛奶或者什么都没有。史密斯先生对每行从左到右记下牛奶的情况,同样对每列从上到下记下牛奶的情况。每一条记录包含N的数字,0表示没有牛奶,1表示有牛奶。不幸的是,2*N条记录的顺序被打乱了,有些数字也模糊不清。 现在史密斯先生请你恢复原来盒子的牛奶情况。 输入: 第一行:一个整数N,然后的2N行,每行有N个数字,0表示一定没有牛奶,1表示一定有牛奶,2表示不能确定。 样例: input 5 01210 21120 21001 12110 12101 12101 00011 22222 11001 10010 output ???9 8 6 2 7 4 1 0 1 1 0 10?1?0?0?1?0 1 0?1?1?1?0 3 0?1?0?0?1 5?1?1?1?0?1 数据范围:1=N=10 初步分析: 行列之间的限制关系非常复杂,很难找到多项式算法。(网络流!?) 可以用(2N)!的深度优先搜索,依次枚举每行和每列的记录编号,然后判断是否产生了矛盾。 判断方法: 设:第i条记录的第j个数字为A[i,j]。 如果第a行选择第x条记录,第b列选择第y条记录,那么矛盾的条件就是: ((A[x,b]2) and (A[y,a]2) and (A

文档评论(0)

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

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

1亿VIP精品文档

相关文档