- 剪枝原则:正确、准确、高效;
-
一般说来,设计好剪枝判断方法之后,我们对搜索树的每个枝条都要执行一次判断操作。然而,由于是利用出解的“必要条件”进行判断,所以,必然有很多不含正解的枝条没有被剪枝。这些情况下的剪枝判断操作,对于程序的效率的提高无疑是具有副作用的。为了尽量减少剪枝判断的副作用,我们除了要下功夫改善判断的准确性外,经常还需要提高判断操作本身的时间效率。
然而这就带来了一个矛盾:我们为了加强优化的效果,就必须提高剪枝判断的准确性,因此,常常不得不提高判断操作的复杂度,也就同时降低了剪枝判断的时间效率;但是,如果剪枝判断的时间消耗过多,就有可能减小、甚至完全抵消提高判断准确性所能带来的优化效果,这恐怕也是得不偿失。很多情况下,能否较好的解决这个矛盾,往往成为搜索算法优化的关键。
3.剪枝判断大致分成以下两类:
1. 可行性剪枝。
一般说来,可行性剪枝多用于路径搜索类的问题。如Prime Circle (ACM Asian Regional 96)等问题,也都可以使用这种剪枝方法。
在应用可行性剪枝的时候,首先要多角度全面分析问题的特点(本题就是从微观和宏观两个角度设计剪枝方法),找到尽可能多的可以剪枝的情况;同时,还必须注意提高剪枝的时间效率,所以我们使用了“局部判断”的方法,特别是在处理第二个剪枝条件时,更是通过局部判断来体现整体性质,这一技巧不仅在设计剪枝方法的时候能够发挥作用,在其他方面也有着极为广泛的应用。
2.最优化剪枝在我们平时遇到的问题中,有一大类是所谓最优化问题,即所要求的结果是最优解。如果我们使用搜索方法来解决这类问题,那么,最优性剪枝是一定要考虑到的。
为了表述的统一,首先要作一些说明:我们知道,解的优劣一般是通过一个评价函数来评判的。这里定义一个抽象的评价函数——“优度”,它的值越大,对应的解也就越优(对于具体的问题,我们可以认为“优度”代表正的收益或负的代价等)。
然后,我们再来回顾一下搜索最优解的过程:一般情况下,我们需要保存一个“当前最优解”,实际上就是保存解的优度的一个下界。在遍历到搜索树的叶子节点的时候,我们就能得到一个新的解,当然也就得到了它的评价函数值,与保存的优度的下界作比较,如果新解的优度值更大,则这个优度值就成为新的下界。搜索结束后,所保存的解就是最优解。
那么,最优性剪枝又是如何进行的呢?当我们处在搜索树的枝条上时,可以通过某种方法估算出该枝条上的所有解的评价函数的上界,即所谓估价函数。显然,大于当前保存的优度的下界,是该枝条上存在最优解的必要条件,否则就一定可以剪枝。所以,最优性剪枝也可以称为“上下界剪枝”。同时,我们也可以看到,最优性剪枝的核心问题就是估价函数的建立。
搜索方法,因其在时间效率方面“先天不足”,所以人们才有针对性的研究出了很多优化技巧。本文所论述的“剪枝”就是最常见的优化方法之一,几乎可以说,只要想使用搜索算法来解决问题,就必须考虑到剪枝优化。
另外需要说明的是,本文所介绍的可行性和最优性两种剪枝判断,其分类只是依据其不同的应用对象,而前面阐述的剪枝方法的三个原则——正确、准确和高效,才是贯穿于始终的灵魂。
本文还介绍了一些剪枝中的常用技巧,如“局部分析”、“逐步细化”等。恰当的使用它们,也能够使程序的效率(主要是时间效率)得到相当的提高。
但是,剪枝方法无论多么巧妙,都不能从本质上降低搜索算法的时间复杂度,这是不争的事实。因此,我们在动手设计一个搜索算法之前,不妨先考虑一下是否存在着更为有效的方法。
而且,在信息学竞赛中,还有一个编程复杂度的问题。我们对一个搜索算法使用了很多优化技巧,虽然可能使程序的时间效率得到一定的提高,但却往往要消耗大量的编程时间,很容易造成“拣了芝麻,丢了西瓜”的结果。
总之,我们在实际设计程序的过程中,不能钻牛角尖,而更应当充分发挥思维的灵活性,坚持“具体问题具体分析”的思想方法。
搜索的剪枝优化
最新推荐文章于 2024-07-14 19:56:17 发布