• 学习总结:局部搜索(转)


    通常考察一个算法的性能通常用局部搜索能力和全局收敛能力这两个指标。局部搜索是指能够无穷接近最优解的能力,而全局收敛能力是指找到全局最优解所在大致位置的能力。局部搜索能力和全局搜索能力,缺一不可。向最优解的导向,对于任何智能算法的性能都是很重要的。 

        局部最优问题(或叫局部峰值局部陷井):现实问题中,f在D上往往有多个局部的极值点。一般的局部搜索算法一旦陷入局部极值点,算法就在该点处结束,这时得到的可能是一个糟糕的结果。解决的方法就,目标函数差的点,被选中的概率小。考虑归一化问题,使得邻域内所有点被选中的概率和为1。总的来说,局部搜索的方法,就是依赖于对解空间进行按邻域搜索。

        起始点问题:一般的局部搜索算法是否能找到全局最优解,与初始点的位置有很大的依赖关系。解决的方法就是随机生成一些初始点,从每个初始点出发进行搜索,找到各自的最优解。再从这些最优解中选择一个最好的结果作为最终的结果。

        学习的重要性:
            1、直接用于无约束的实际问题;
            2、其基本思想和逻辑结构可以推广到约束问题;
            3、约束问题可以转化成无约束问题求解。

        方法分类:
            1、间接法:对简单问题,求解必要条件或充分条件;
            2、迭代算法:
                     零阶法:只需计算函数值 f(x) (直接法)
                     一阶法:需计算 ▽f(x)       (梯度法)
                     二阶法:需计算 ▽2f(x)      (梯度法)

        直接搜索法优点:计算不太复杂;易于实施与快速调试;所需的准备时间较少
    一、单纯形搜索法:

    1962年由Spendley, Hext和Himsworth提出,80年代得到证明。单纯形搜索法是一种无约束最优化的直接方法。单纯形法是求解非线性多元函数、无约束最小化问题的有效方法之一。在许多技术领域内,都取得了有效的成果。

    所谓的单纯形是指n维空间E^n中具有n+1个顶点的凸多面体。比如一维空间中的线段,二维空间中的三角形,三维空间中的四面体等,均为相应空间中的单纯形。单纯形搜索法与其它直接方法相比,基本思想有所不同,在这种方法中,给定维空间E^n中一个单纯形后,求出n+1个顶点上的函数值,确定出有最大函数值的点(称为最高点)和最小函数值的点(称为最低点),然后通过反射、扩展、压缩等方法(几种方法不一定同时使用)求出一个较好点,用它取代最高点,构成新的单纯形,或者通过向最低点收缩形成新的单纯形,用这样的方法逼近极小点。
        单纯形搜索法的基本思想是:先找出一个基本可行解,对它进行鉴别,看是否是最优解;若不是,则按照一定法则转换到另一改进的基本可行解,再鉴别;若仍不是,则再转换,按此重复进行。因基本可行解的个数有限,故经有限次转换必能得出问题的最优解。

    一般解题步骤可归纳如下:

    ①把线性规划问题的约束方程组表达成典范型方程组,找出基本可行解作为初始基本可行解。

    ②若基本可行解不存在,即约束条件有矛盾,则问题无解。

    ③若基本可行解存在,从初始基本可行解作为起点,根据最优性条件和可行性条件,引入非基变量取代某一基变量,找出目标函数值更优的另一基本可行解。

    ④按步骤3进行迭代,直到对应检验数满足最优性条件(这时目标函数值不能再改善),即得到问题的最优解。

    ⑤若迭代过程中发现问题的目标函数值无界,则终止迭代。 

    二、Powell共轭方向法(方向加速法)

    1964年由Powell提出,后经Zangwoll(1967年)和Brent(1973年)改进。该算法有效地利用了迭代过程中的历史信息,建立起能加速收敛的方向。

    理论基础:以二次对称函数为模型进行研究。

    在非线性目标函数中,最简单的是二次函数,故任何对一般函数有效的方法首先应对二次函数有效;在最优点附近,非线性函数可用一个二次函数作近似,故对二次函数使用良好的方法,通常对一般函数也有效;很多实际问题的目标函数是二次函数。

    设A是n×n阶对称正定矩阵,p(0), p(1)为两个n维向量,若 成立p(0)T A p(1) = 0,则称向量p(0)与p(1)为A共轭或A正交,称该两向量的方向为A共轭方向。 

    特点:Powell法本质上是以正定二次函数为背景,以共轭方向为基础的一种方法。不同于其他的直接法, Powell法有一套完整的理论体系,故其计算效率高于其他直接法。若每次迭代的前n 个搜索方向都线性无关时,则原始Powell法具有二次终止性 Powell法使用一维搜索,而不是跳跃的探测步。Powell法的搜索方向不一定为下降方向。

    不足:在原始Powell法中,必须保持每次迭代中前n个搜索方向线性无关,否则将永远得不到问题的最优解。

    为了避免出现搜索方向组线性相关的现象,Powell及其他人对原始Powell法进行修正:

    三、梯度法

        又名最速下降法,求解无约束多元函数极值的数值方法,早在1847年就已由柯西(Cauchy))提出。它是导出其他更为实用、更为有效的优化方法的理论基础。因此,梯度法是无约束优化方法中最基本的方法之一。该方法选取搜索方向Pκ的出发点是:怎样选取Pk可使ƒ(X)下降得最快?或者说使ƒ(Xκ+λΡκ)-ƒ(Χκ)<0且不等式左式的绝对值尽量大。 

    目标:求出平稳点(满足Ñf(x)=0的x * )。对给定的解,按负梯度方向搜索其邻域解,若邻域中有更优的解(根据给定的评估函数评定),则移动至该邻域解,继续寻找,直至找不到为止。此时,就找到了局部最优解。方法非常简单,但是缺陷也很明显,即陷入到局部最优解之后无法跳出。

    注意:最速下降法的搜索路径呈直角锯齿形,相邻两个搜索方向是正交的。

     

    1、优点:计算简单,需记忆的容量小;对初始点要求低,稳定性高;远离极小点时收敛快,常作为其它方法的第一步。

    2、缺点:收敛速度较慢(线性或不高于线性),原因是最速下降方向只有在该点附近有意义。直线搜索可能会产生一些问题,可能会“之字型”地下降。尤其当目标函数等值面是很扁的椭圆、椭球或类似图形时,收敛更慢。

    四、Newton法

    由最速下降法可知,从全局角度来看,负梯度方向一般不是一个特别好的方向,有没有更好的方向?

    基本思想:利用目标函数f(x)在x(k)处的二阶Taylor展开式去近似目标函数,用二次函数的极小点去逼近目标函数的极小点。

       或  

    1、Newton法的最大优点是:Newton法是局部收敛的,当初始点选得合适时收敛很快,具有二阶收敛速度,是目前算法中最快的一种。 对初始点要求高,一般要求初始点离极小点较近,否则不收敛。有时即使是收敛的,但因初始点离极大点或鞍点较近,会收敛于极大点或鞍点。

    2、Newton法的搜索方向-H (x)-1 g(x),称为Newton方向,是一个好方向,对二次函数此方向直指平稳点。如果H(x(k))是正定的,则H(x(k))-1必存在,从而算法是可行的,并且保证求得的平稳点是极小点。但在迭代过程中要求H(x(k))是正定的这一条件不一定能保证,因而它不一定是下降方向。一般在极小点附近的Hesse矩阵容易为正定的。所以基本Newton法在极小点附近才比较有效。

    五、共轭梯度法

    共轭梯度法最早是又Hestenes和Stiefle(1952)提出来的,用于解正定系数矩阵的线性方程组,在这个基础上,Fletcher和Reeves (1964)首先提出了解非线性最优化问题的共轭梯度法。由于共轭梯度法不需要矩阵存储,且有较快的收敛速度和二次终止性等优点,现在共轭梯度法已经广泛地应用与实际问题中。

    共轭梯度法(Conjugate Gradient)是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 

    共轭梯度法是一个典型的共轭方向法,它的每一个搜索方向是互相共轭的,而这些搜索方向d仅仅是负梯度方向与上一次迭代的搜索方向的组合。在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。

    1、共轭梯度法不需要预先估计任何参数就可以计算,每次迭代所需的计算,主要是向量之间的运算,便于并行化。程序简单,对大规模问题很有吸引力。对一般函数为超线性收敛。

    2、共轭梯度法的收敛速度比最速下降法要快得多,同时也避免了要求海塞矩阵的计算。收敛速度依赖于一维搜索的精确性及Hesse矩阵的特征值的分布。

     

     

     

     

        局部领域搜索是基于贪婪思想持续地在当前解的领域中进行搜索,虽然算法通用易实现,且容易理解,但其搜索性能完全依赖于领域结构和初解,尤其窥陷入局部极小而无法保证全局优化性。针对局部领域搜索,为了实现全局优化,可尝试的途径有:以可控性概率接受劣解来逃逸局部极小,如模拟退火算法;确定性的局部极小突跳策略,如禁忌策略;扩大领域搜索结构,如TSP的2opt扩展到k-opt;多点并行搜索,如进化计算;变结构领域搜索( Mladenovic et al,1997)等等。

    一、爬山法(Hill-Climbing)

    爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如下图所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解。

    爬山法是向值增加的方向持续移动到简单循环过程,算法在到达一个“峰顶”时终止,此时相邻状态中没有比该“峰顶”更高的值。爬山法不维护搜索树,当前节点只需要记录当前状态及其目标函数值;爬山法不会前瞻与当前状态不直接相邻的状态的值——“就像健忘的人在大雾中试图登顶珠峰一样”。爬山法从来不会“下山”,只会向值比当前节点好的方向搜索,因而肯定不完备,很容易停留在局部极值上。
    function HillClimbing(problem) return 一个局部最优状态
        输入:problem
        局部变量:current, 一个节点
                  neighbor,一个节点
        current= MakeNode(Initial-State(problem));
        loop do
            neighbor= a highest-valued successor of current ;
            if VALUE[neighbor] <= VALUE[current] then return STATE[current];
            current= neighbor ;
        爬山法又称贪婪局部搜索,只是选择相邻状态中最好的一个。尽管贪婪是七宗罪之一,但是贪婪算法往往能够获得很好的效果。当然,爬山法会遇到以下问题:

    (1)局部极值

    (2)山脊:造成一系列的局部极值

    (3)高原:平坦的局部极值区域——解决办法:继续侧向移动
        随机爬山法:在上山移动中,随机选择下一步,选择的概率随着上山移动到陡峭程度而变化。

    首选爬山法:随机地生成后继节点直到生成一个优于当前节点的后继。

    随机重新开始的爬山法:“如果一开始没有成功,那么尝试,继续尝试”算法通过随机生成的初始状态来进行一系列的爬山法搜索,找到目标时停止搜索。该算法以概率1接近于完备:因为算法最终会生成一个目标状态作为初始状态。如果每次爬山搜索成功的概率为p,则需要重新开始搜索的期望次数为 1/p。

    二、模拟退火算法(Simulated Annealing)

    “模拟退火”算法是源于对热力学中退火过程的模拟,在某一给定初温下,通过缓慢下降温度参数,使算法能够在多项式时间内给出一个近似最优解。

        爬山法是完完全全的贪心法,每次都鼠目寸光的选择一个当前最优解,因此只能搜索到局部的最优值。模拟退火其实也是一种贪心算法,但是它的搜索过程引入了随机因素。模拟退火算法与爬山法类似,但是它没有选择最佳的移动,而是选择随机的移动。如果该移动使情况得到改善,那么接受该移动;否则,算法以某个概率接受该移动。因此有可能会跳出这个局部的最优解,达到全局的最优解。以上图为例,模拟退火算法在搜索到局部最优解A后,会以一定的概率接受到E的移动。也许经过几次这样的不是局部最优的移动后会到达D点,于是就跳出了局部最大值A。

    模拟退火的原理:我们将热力学的理论套用到统计学上,将搜寻空间内每一点想像成空气内的分子;分子的能量,就是它本身的动能;而搜寻空间内的每一点,也像空气分子一样带有“能量”,以表示该点对命题的合适程度。算法先以搜寻空间内一个任意点作起始:每一步先选择一个“邻居”,然后再计算从现有位置到达“邻居”的概率。可以证明,模拟退火算法所得解依概率收敛到全局最优解。

    当陷入局部最优之后,模拟退火算法要求概率根据算法进行过程中,逐步降低(逐渐降低才能趋向稳定)其跳出局部最优的概率,使其越来越趋于稳定。这一特性增加也同样存在缺陷,即对于全局最优解,也存在一定概率跳出,从而使得求解过程不稳定。

    随着邻域的范围的增大,跳出局部极小区域,最终进入全局极小区域的概率越来越大,但是代价是总的迭代次数增加。但是随着邻域范围的增大,会出现所谓的在极值附近来回”振荡”而无法落入极值点的现象。可以推测,随着邻域范围的进一步增大及其随机特性,模拟退火算法将退化到随机寻找极值并进行记录极值的算法。当然这种算法也存在问题,即对于某些情况下,也不易达到全局最优。例如,解空间中仅有两个局部最优,其中一个是全局最优,那么模拟退火似乎并不一定总能进入到全局最优解当中。

    Create initial solution S

    repeat

    for i=1 to iteration-length do

    Generate a random transition from S to Si

    If ( C(S) <= C(Si) ) then

    S=Si

    else if( exp(C(S)-C(Si))/kt > random[0,1) ) then

    S=Si

    Reduce Temperature t

    until ( no change in C(S) )

    C(S): Cost or Loss function of Solution S.

    1、在其他参数合适的情况下,初始解的位置与邻域结构是2个重要因素。

    2、初始解的位置与邻域结构的设计之间对于找到最优解的问题而言存在依赖关系。随着邻域的范围的增大,跳出局部极小区域,最终进入全局极小区域的概率越来越大,同时也可能会产生振荡,无法落入极值区域。

    3、模拟退火本质上也是一种 暴力搜索,只不过是利用随机的性质和局部极值区域连续(也取决于求解问题中邻域的结构)的特性避免了大量计算,进而在较短时间内从某种概率上逼近局部最优值和全局最优值。

    三、禁忌搜索(Tabu Search或Taboo Search,TS)

    禁忌搜索(Tabu Search或Taboo Search,简称TS)的思想最早由Glover(1986)提出,它是对局部领域搜索的一种扩展,是一种全局逐步寻优算法,是对人类智力过程的一种模拟。TS算法通过引入一个灵活的存储结构和相应的禁忌准则来避免迂回搜索,并通过藐视准则来赦免一些被禁忌的优良状态,进而保证多样化的有效探索以最终实现全局优化。相对于模拟退火和遗传算法,TS是又一种搜索特点不同的meta-heuristic算法。

    禁忌搜索是人工智能的一种体现,是局部领域搜索的一种扩展。禁忌搜索最重要的思想是标记对应已搜索的局部最优解的一些对象,并在进一步的迭代搜索中尽量避开这些对象(而不是绝对禁止循环),从而保证对不同的有效搜索途径的探索。禁忌搜索涉及到领域(neighborhood)、禁忌表(tabu list)、禁忌长度(tabu 1ength)、候选解(candidate)、藐视准则(candidate)等概念。

    简单TS算法的基本思想描述如下:

    (1)给定算法参数,随机产生初始解x,置禁忌表为空。

    (2)判断算法终止条件是否满足?若是,则结束算法并输出优化结果;否则,继续以下步骤。

    (3)利用当前解的邻域函数产生其所有(或若干)邻域解,并从中确定若干候选解。

    (4)对候选解判断特赦准则是否满足?若成立,则用满足特赦准则的最佳状态y替代x成为新的当前解,即x=y,并用与y对应的禁忌对象替换最早进入禁忌表的禁忌对象,同时用y替换“best so far”状态,然后转步骤6;否则,继续以下步骤。

    (5)判断候选解对应的各对象的禁忌属性,选择候选解集中非禁忌对象对应的最佳状态为新的当前解,同时用与之对应的禁忌对象替换最早进入禁忌表的禁忌对象元素。

    (6)转步骤(2)。

     

     

    局部搜索,模拟退火,遗传算法,禁忌搜索的形象比喻:为了找出地球上最高的山,一群有志气的兔子们开始想办法。
        1、兔子朝着比现在高的地方跳去。他们找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是局部搜索,它不能保证局部最优值就是全局最优值。
        2、兔子喝醉了。他随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,他渐渐清醒了并朝最高方向跳去。这就是模拟退火。
        3、兔子们吃了失忆药片,并被发射到太空,然后随机落到了地球上的某些地方。他们不知道自己的使命是什么。但是,如果你过几年就杀死一部分海拔低的兔子,多产的兔子们自己就会找到珠穆朗玛峰。这就是遗传算法。
        4、兔子们知道一个兔的力量是渺小的。他们互相转告着,哪里的山已经找过,并且找过的每一座山他们都留下一只兔子做记号。他们制定了下一步去哪里寻找的策略。这就是禁忌搜索。 

     

     

     

     



    http://blog.sciencenet.cn/blog-628137-497041.html 

  • 相关阅读:
    缓存清理
    机器学习在电商领域三大应用,推荐,搜索,广告中商品排序
    并发和并行
    拷贝控制
    gitk
    git GUI Clients
    new delete
    Windows 安装 gcc
    C++ 运算符优先级
    iostream 操作符
  • 原文地址:https://www.cnblogs.com/shuly/p/9257850.html
Copyright © 2020-2023  润新知