zoukankan      html  css  js  c++  java
  • 禁忌搜索(Tabu Search)

    1.禁忌搜索的一个通俗的例子
     
    在组合优化问题的求解中,禁忌搜索(tabu search, TS)是众多元启发式算法中最为常用和有效的方法之一。我们以“寻找中国最高的山”作为例子,解释禁忌搜索的核心思路。


    这个比喻中有几个核心的喻体和它们对应的本体:

    山——solution
    山的高度——objective value
    山的轮廓——featuring attributes
    小范围内的最高峰——local optimum
    全中国最高的山——best solution (with largest objective value)
    爬到一座山顶后,四下张望,可以看到附近的紧邻的其他山——neighbors/neighborhood

    首先,我们的徐霞客同志在地图上随意指一个土坡,作为他搜索旅程的开端(initial solution)。我们用传送门把徐霞客传送到这个点,然后他就开始一个土坡、一个土坡地搜索了。每一步,他都尽量找一个比当前土坡更高的山坡,就这样他一步步地找到了海拔1400米的庐山,四下看去,附近几百公里已经没有更高的山了,即庐山是附近区域内的局部最高峰(local optimum)。但它很可能并不是全中国的最高峰,因此想要不被困在庐山附近的山脉(trapped in local optima),徐霞客需要先去往海拔低的山(inferior solution),然后才能到达下一个更高的山峰——这里出现了TS的第一个核心特征:允许搜索过程中的解出现劣化,不一定每一步都要更好。

    就这样,徐霞客先走下坡路、再走上坡路,找到了1900米的黄山,已经有进步了,但同样的,稍作停留,徐霞客继续出发了,再接再厉地又找到了2000米的恒山和3000米的峨嵋山。徐霞客携带测高仪(用来计算目标函数),所以不用真的爬上山顶。徐霞客主要忙碌的是:不停的被传送,然后从某一个点出发寻找附近的山(开始local search),一个区域可能有成千上万座山。

    现在问题来了,徐霞客从峨嵋山出发,再往下找,很可能不知不觉地又走到了黄山、庐山这些他已经去过的山,费了很大的工夫爬到山顶,发现都是“故地重游”。于是,徐霞客决定去过的山在短期内就不再去了。这个时候,有两个问题需要解决:1.怎么在爬山之前确定这座山有没有爬过呢(当然,徐霞客是没有地图或者GPS的)?徐霞客的办法是,每去一座山就把它的轮廓画下来。以后遇到一座山的时候,先拿出手里的画对比一下,如果与手中某张画的轮廓很相似,就不用再爬了,因为这座山很有可能是来过的,爬到山顶也不会有新的收获。事实上,要判断两座山是否完全一致,需要对比它们的每一块石头、每一棵树,但这样效率显然太低了,于是就简化为对比两座山的轮廓——这里的轮廓,其实就是对山的一种抽象,我们称之为解的特征点(featuring attributes)。如果两个解的特征点一致,我们就当作它们是同一个解(当然,这种抽象的方法也是有弊端的,稍后我们会谈到);2.是否去过的山就永远不再去了呢?其实从地质学的角度来看,一座高山的附近很可能有另一座高山,所以即使眼前这座山爬过了,通过它可能可以间接抵达附近的另一座没有去过的高山。所以并不是说回头草就一定不能吃,长远来看可能还是有价值的。
     
    结合上面两个问题,徐霞客改进了他的搜索策略:每爬完一座山就把它的轮廓画下来,接下来每到达一座山的时候先判断是否有相似轮廓的,如果有就直接绕过去。同时,手里只保留固定数量的几张图纸(这里的“张数”就是tabu list length,禁忌名单的长度越长,允许重新爬一座山的间隔就越长),新加进来一张图纸,就必须舍弃掉手中现有的最早的那张图纸。因此,即使某一座山已经爬过了,但由于是发生很早以前的、图纸已经丢掉了,是允许再爬一次的。


    在这种策略的指导下,徐霞客明显提升了搜索的效率,大量的重复的山被成功地跳过了。但是,随之而来还有一个问题:轮廓相似的两座山,就一定是同一座山么?显然不是的。因为把实体的“山”抽象到“山的轮廓”这个步骤,丢失了大量的细节,因此同一个轮廓是有可能对应不止一座山的。那么,假设现在徐霞客来到一座山的山脚下,抬头一看它的轮廓和手里的黄山很像。但是测了一下高度,有4700米(黄山才1900米),那显然就不是黄山了,而是昆仑!——这种情况下,即使这座山和黄山的轮廓是一样的,也一定是座新的山,即使它还在“禁忌列表”中,但它被“特赦”了(activates aspiration criteria)。那么,昆仑山附近可能有另一座没有去过的高山。

    这么一来,徐霞客又对自己的搜索方法做了改进:除了禁忌列表(tabu list),他又建了一个特赦列表(aspiration list),针对每一种轮廓,记录了一个截至目前长得像这个轮廓的最高高度。那么未来即使碰到同一个轮廓的山,如果高度超过了这个轮廓下的历史记录,很容易就可以确定它是新的,那么就不用顾虑tabu list了,特赦之。

    到这里还没完,徐霞客渐渐意识到,平原地区很可能连绵几百公里都没有收获,而高原地区可能一座山连着一座山,发现新的高峰的概率大得多。也就是说,高山和高山很可能是挨得比较近的,与其在九百六十万平方公里的土地上均匀地投入力气搜索,不如对某些区域多倾注一些精力。因此,徐霞客每找到一座打破记录的最高峰,就把它的位置详细记录下来,这样他手里就握着第三个列表(回忆一下,第一个是tabu list,第二个aspiration list),现在这第三个列表就叫做elite list,顾名思义,这些都是找到过的“精英”,都是宝。当徐霞客连续几个月没有找到更高的山了,他就会从这个elite list中选择一座山,重新回到那里,试试其他的路,看看有没有可能有突破,同时这次尝试之后,这座山也会被从elite list中删掉,也就是说每座高山只当一次精英,这就是TS中常用的elite strategy(精英策略)。
     
    2.实际例子
        现有一架飞机,从A点出发,需要经过B,C,D,E,F之后返回A点,且每个点只能经过一次,最后返回A点,求最短路径。

    该问题是一个Hamilton回路问题,其中起点和终点已经固定,因此我们可以将解形式记为,例如【A,D,C,F,E,A】,每次只需变换中间两个元素即可,现在我们将禁忌长度设置为2,候选集合长度定义为4,迭代次数为100,通过以下步骤能使读者更清洗的了解TS算法的步骤。

    给定任意初始解 x1=【A,D,C,F,E,A】f(x1)=10,历史最优为10
             候选集合                             禁忌表
    【A,C,D,F,E,A】 f=15     
    【A,D,C,E,F,A】 f=20     
    【A,D,F,C,E,A】 f=8     
    【A,E,C,F,D,A】 f=6     

    我们发现对x1交换D和E时,f最优,此时x2=【A,E,C,F,D,A】 f(x2)=6,历史最优为6,将D-E放入禁忌表中
             候选集合            禁忌表
    【A,E,F,C,D,A】 f=9          D-E
    【A,F,C,E,D,A】 f=15     
    【A,C,E,F,D,A】 f=6     
    【A,E,D,F,C,A】 f=5     

    我们发现对x2交换C和D时,f最优,此时x3=【A,E,D,F,C,A】 f(x3)=5,历史最优为5,将D-C放入禁忌表中
                候选集合       禁忌表
    【A,E,C,F,D,A】 f=8        D-E
    【A,E,F,D,C,A】 f=10      D-C
    【A,E,D,C,F,A】 f=14     
    【A,C,D,F,E,A】 f=16     

    此时我们发现对x3交换D和C时最优,但是由于D-C已经在禁忌表中,因此我们退而求其次,对x3交换F和D,此时x4=【A,E,F,D,C,A】 f(x4)=10,历史最优为5,将F-D放入禁忌表中,由于禁忌长度为2,因此将最先放入禁忌表中的D-E移除禁忌表
               候选集合       禁忌表
    【A,E,F,C,D,A】 f=4       D-C
    【A,E,C,D,F,A】 f=5       F-D
    【A,F,E,D,C,A】 f=7     
    【A,C,F,D,C,A】 f=10     

    此时我们发现对x4交换D和C时最优,虽然D-C已经在禁忌表中,但是f(D-C)<历史最优5,因此满足特赦规则,现在将D-C移除禁忌表,此时x5=【A,E,F,C,D,A】 f(x5)=4,历史最优为4,然后再将D-C放入禁忌表
             候选集合       禁忌表
    【A,C,F,E,D,A】 f=5     D-F
    【A,E,C,F,D,A】 f=7     C-D
    【A,D,F,C,E,A】 f=9     
    【A,F,E,C,D,A】 f=29     

    依次迭代下去,当迭代次数超过100时停止迭代,历史最优值即为输出解。

    详细内容:http://blog.sina.com.cn/s/blog_3f6976a90102yjot.html 
                  https://blog.csdn.net/adkjb/article/details/81712969
  • 相关阅读:
    pat00-自测5. Shuffling Machine (20)
    Spiral Matrix
    Search in Rotated Sorted Array II
    Search in Rotated Sorted Array
    Best Time to Buy and Sell Stock II
    4Sum
    3Sum Closest
    3Sum
    MySQL存储过程、函数和游标
    Word Ladder
  • 原文地址:https://www.cnblogs.com/Franky-ln/p/13151844.html
Copyright © 2011-2022 走看看