禁忌搜索算法

TS算法通过引入一个灵活的存储结构和相应的禁忌准则来避免迂回搜索,并通过藐视准则来赦免一些被禁忌的优良状态,进而保证多样化的有效探索以最终实 现全局优化。相对于模拟退火和遗传算法,TS是又一种搜索特点不同的 meta-heuristic算法。
禁忌搜索是人工智能的一种体现,是局部领域搜索的一种扩展。禁忌搜索最重要的思想是标记对应已搜索的局部最优解的一些对 象,并在进一步的迭代搜索中尽量避 开这些对象(而不是绝对禁止循环),从而保证对不同的有效搜索途径的探索。禁忌搜索涉及到领域(neighborhood)、禁忌表(tabu list)、禁忌长度(tabu 1ength)、候选解(candidate)、藐视准则(candidate)等概念。
简单TS算法的基本思想是:给定一个当前解(初始解)和一种邻域,然后在当前解的邻域中确定若干 候选解;若最佳候选解对应的目标值优于“best so far”状态,则忽视其禁忌特性,用其替代当前解和“best so far”状态,并将相应的对象加入禁忌表,同时修改禁忌表中各对象的任期;若不存在上述候选解,则选择在候选解中选择非禁忌的最佳状态为新的当前解,而无 视它与当前解的优劣,同时将相应的对象加入禁忌表,并修改禁忌表中各对象的任期;如此重复上述迭代搜索过程,直至满足停止准则。
条理化些,则简单禁忌搜索的算法步骤可描述如下:
(1)给定算法参数,随机产生初始解x,置禁忌表为空。
(2)判断算法终止条件是否满足?若是,则结束算法并输出优化结果;否则,继续以下步骤。
(3)利用当前解工的邻域函数产生其所有(或若干)邻域解,并从中确定若干候选解。
(4)对候选解判断藐视准则是否满足?若成立,则用满足藐视准则的最佳状态y替代x成为新的当前解,即x=y,并用与y对应的禁忌对象替换最早进入禁忌表的禁忌对象,同时用y替换“best so far”状态,然后转步骤6;否则,继续以下步骤。
(5)判断候选解对应的各对象的禁忌属性,选择候选解集中非禁忌对象对应的最佳状态为新的当前解,同时用与之对应的禁忌对象替换最早进入禁忌表的禁忌对象元素。
(6)转步骤(2)。
 
同时,与传统的优化算法相比,TS算法的主要特点是:
(1)在搜索过程中可以接受劣解,因此具有较强的“爬山”能力;
(2) 新解不是在当前解的邻域中随机产生,而或是优于“best so far”的解,或是非禁忌的最佳解,因此选取优良解的概率远远大于其他解。由于TS算法具有灵活的记忆功能和藐视准则,并且在搜索过程中可以接受劣解,所 以具有较强的“爬山”能力,搜索时能够跳出局部最优解,转向解空间的其他区域,从而增强获得更好的全局最优解的概率,所以TS算法是一种局部搜索能力很强 的全局迭代寻优算法。 
 
 为了找到“全局最优解”,就不应该执着于某一个特定的区域。局部搜索的缺点就是太贪婪地对某一个局部区域以及其邻域搜索,导致一叶障目,不见泰山。禁忌搜 索就是对于找到的一部分局部最优解,有意识地避开它(但不是完全隔绝),从而获得更多的搜索区间。兔子们找到了泰山,它们之中的一只就会留守在这里,其他 的再去别的地方寻找。就这样,一大圈后,把找到的几个山峰一比较,珠穆朗玛峰脱颖而出。 

当兔子们再寻找的时候,一般地会有意识地避开泰山,因为他们知道,这里已经找过,并且有一只兔子在那里看着了。这就是禁忌搜索中“禁忌表(tabu list)”的含义。那只留在泰山的兔子一般不会就安家在那里了,它会在一定时间后重新回到找最高峰的大军,因为这个时候已经有了许多新的消息,泰山毕竟 也有一个不错的高度,需要重新考虑,这个归队时间,在禁忌搜索里面叫做“禁忌长度(tabu length)”;如果在搜索的过程中,留守泰山的兔子还没有归队,但是找到的地方全是华北平原等比较低的地方,兔子们就不得不再次考虑选中泰山,也就是 说,当一个有兔子留守的地方优越性太突出,超过了“best to far”的状态,就可以不顾及有没有兔子留守,都把这个地方考虑进来,这就叫“特赦准则(aspiration criterion)”。这三个概念是禁忌搜索和一般搜索准则最不同的地方,算法的优化也关键在这里。  
 以上程序中有关键的几点: 
(1)禁忌对象:可以选取当前的值(cur)作为禁忌对象放进tabu list,也可以把和当前值在同一“等高线”上的都放进tabu list。 
(2)为了降低计算量,禁忌长度和禁忌表的集合不宜太大,但是禁忌长度太小容易循环搜索,禁忌表太小容易陷入“局部极优解”。 
(3)上述程序段中对best_to_far的操作是直接赋值为最优的“解禁候选解”,但是有时候会出现没有大于best_to_far的,候选解也全部被禁的“死锁”状态,这个时候,就应该对候选解中最佳的进行解禁,以能够继续下去。 
(4)终止准则:和模拟退火,遗传算法差不多,常用的有:给定一个迭代步数;设定与估计的最优解的距离小于某个范围时,就终止搜索;当与最优解的距离连续若干步保持不变时,终止搜索; 
禁忌搜索是对人类思维过程本身的一种模拟,它通过对一些局部最优解的禁忌(也可以说是记忆)达到接纳一部分较差解,从而跳出局部搜索的目的. 
 
禁忌搜索算法是局部搜索算法的变形。应该注意到禁忌搜索算法计算中的关键点:禁忌对象、长度和候选集成为算法的主要特征。环绕这些特征需要考虑下列因素。
(1)是否有其他形式的候选集?
(2)禁忌的长度如何确定?如果在算法中记忆下搜索到的当前最优解,极端的两种情况是:一是将所有的对换个数作为禁忌长度,此时等价于将候选集中的所有的对换遍历;另外则取为1,这等价于局部搜索算法。
(3)是否有评价值的其他替代形式?有时计算目标值的工作量较大,或无法接受计算目标值所花费的时间,于是需要其他的方法。
(4)被禁的对换能否再一次解禁?有这样的直观现象,当搜索到一个局部最优解后,它邻域中的其他状态都被禁,我们是否解禁一些状态以便跳出局部最优?解禁的功能就是为了获得更大的搜索范围,以免陷入局部最优。
(5)如何利用更多的信息?在禁忌搜索算法中,还可记录其他一些信息。如一个被禁对象(交换)被禁的次数,评价值变化的大小等。
(6)终止原则,即一个算法停止的条件,怎样给出?
禁忌长度是被禁对象不允许选取的迭代次数。一般是给被禁对象x一个数(禁忌长度)t,要求对象x在t步迭代内被禁,在禁忌表中采用 tabu(x)=t记忆,每迭代一步,该项指标做运算tabu(x)=t-1,直到tabu(x)=0时解禁。于是,我们可将所有元素分成两类,被禁元素 和自由元素。有关禁忌长度t的选取,可以归纳为下面几种情况:
(1)t为常数,如t=10,t=n的开方,其中n为邻居的个数。这种规则容易在算法中实现。
(2)t属于[tmin,tmax]。此时t是可以变化的数,它的变化是依据被禁对象的目标值和邻域的结构。此时tmin,tmax是确定的。确定 tmin,tmax的常用方法是根据问题的规模T,限定变化区间,也可以用邻域中邻居的个数n确定变化区间。当给定了变化区间,确定t的大小主要依据实际 问题、实验和设计者的经验。当函数值下降较大时,可能谷较深,欲跳出局部最优,希望被禁的长度较大。
(3)tmin,tmax的动态选取。有的情况下,用tmin,tmax的变化能表达到更好的解。
    禁忌长度的选取同实际问题、实验和设计者的经验有紧密的联系,同时它决定了计算的复杂性。过短会造成循环的出现。如 f(1)=1,f(2)=3.5,f(3)=2.5,f(4)=2,f(5)=3,f(6)=6,,极端情况禁忌长度是1,邻域为相距不超过1的整数点, 一旦陷入局部最优点x=4,则出现循环而无法跳出局部最优。过长又造成计算时间较长。
将评价函数分为基于目标函数和其他方法两类。
1、基于目标函数的评价函数
   这一类主要包含以目标函数的运算所得到的评价方法。如记评价函数为p(x),目标函数为f(x),则评价函数可以用目标函数
                                        p(x)=f(x);
目标函数值与xnow目标值的差值
                                     p(x)=f(x)-f(xnow),
其中xnow是上一次迭代计算的解;目标函数值与当前最优解xbest目标值的差值
                                      p(x)=f(x)-f(xbest),
其中xbest是目前计算中的最好解。
    基于目标函数的评价函数的形成主要通过对目标函数进行简单的运算,它的变形很多。
2、其他方法
    有时计算目标值比较复杂或耗时较多,解决这一问题的方法之一是采用替代的评价函数。替代的评价函数还应该反应原目标函数的一些特性,如原目标函数对应的最优点还应该是替代函数的最优点。构造替代函数的目标是减少计算的复杂性。具体问题的替代函数构造依问题而定。
     一下罗列三种常用的特赦规则,在下面的讨论中,认为评价值越小越好。
(1) 基于评价值的规则。在整个计算过程中,记忆已出现的最好解xbest。当候选集中出现一个解xnow,其评价值(可能是目标值)满足c(xbest)>c(xnow)时,虽说从xbest达到xnow的变化是被禁忌的,此时,解禁xnow使其自由。直观理解,我们得到一个更好的解。
(2) 基于最小错误的规则。当候选集中所有的对象都被禁忌时,而(1)的规则又无法是程序继续下去。为了得到更好的解,从候选集的所有元素中选一个评价值最小的状态解禁。
(3)基于影响力的规则。有些对象的变化对目标值的影响很大,而有的变化对目标值的变化较小,我们应该关注影响大的变化。从这个角度理解,如果一个影响大 的变化成为被禁对象,我们应该使其自由,这样才能得到问题的一个更好的解。需要注意的是,我们不能理解为:对象的变化对目标影响大就一定使得目标(或是评 价值)变小,它只是一个影响力指标。这一规则应结合禁忌长度和评价函数值使用。如在候选集中目标值都不及当前的最好解,而一个禁忌对象的影响指标很高且很快将被解禁时,我们可以通过解禁这个状态以期望得到更好的解。
  在计算的过程中,记忆一些信息对解决问题是有利的。如一个最好的目标值出现的频率很高,这使我们有理由推测:现有参数的算法可能无法再得到更好的解,因为重复的次数过高,使我们认为可能出现了多次循环。根据解决问题的需要,我们可以记忆解集合、有序被禁对象组、目标值集合等的出现频率。一般可以根据状态的变化将频率信息分为两类:静态和动态。
    静态的频率信息主要是某些变化,诸如解、对换或目标值在计算中出现的频率。求解它们的频率相对比较简单。如可以记录它们在计算中出现的次数,出现的次数与 总的跌代数的比率,从一个状态出发再回到该状态的迭代次数等。这些信息有助于我们了解一些解、对换或目标值的重要性,是否出现循环和循环的次数。在禁忌搜 索中,为了更充分的利用信息,一定要记忆目前最优解。
    动态的频率信息主要是从一个解、对换或目标值到另一个解、对换或目标值的变化趋势,如记忆一个解序列的变化,或即一个解序列变化的若干个点等。由于记录比较复杂,因此它提供的信息量也较大。在计算动态频率时,通常采用的方法为:
(1)一个序列的长度,即序列中元素个数。在记录若干个关键点的序列中,按这些关键点的序列长度的变化进行计算;
(2)从序列中的一个元素出发,再回到该序列该元素的迭代次数;
(3)一个序列的平均目标(平均)值,从序列中一个元素到另一个元素目标(平均)值的变化情况;
(4)该序列出现的频率。

猜你喜欢

转载自www.cnblogs.com/driverLin/p/9098833.html