禁忌搜索算法
2009210042 李同玲 运筹学与控制论
搜索是人工智能的一个基本问题,一个问题的求解过程就是搜索。人工智能在各应用领域中,被广泛的使用。现在,搜索技术渗透在各种人工智能系统中,可以说没有哪一种人工智能的应用不用搜索方法。
禁忌搜索算法(Tabu Search或Taboo Search,简称TS)的思想最早由Glover (美国工程院院士,科罗拉多大学教授)在1977年提出,它是对局部邻域搜索的一种扩展,是一种全局邻域搜索算法,是人工智能的一种体现,是一种全局逐步寻优算法,是对人类智力过程的一种模拟。TS算法通过引入一个灵活的存储结构和相应的禁忌准则来避免迂回搜索,并通过藐视准则来赦免一些被禁忌的优良状态,进而保证多样化的有效探索以最终实现全局优化。迄今为止,TS算法在组合优化、生产调度、机器学习、电路设计和神经网络等领域取得了很大的成功,近年来又在函数全局优化方面得到较多的研究,并大有发展的趋势。
1.1引言
1.1.1局部邻域搜索
局部邻域搜索是基于贪婪思想持续地在当前的邻域中进行搜索,虽然算法通用易实现,且容易理解,但其搜索性能完全依赖于邻域结构和初始解,尤其容易陷入局部极小而无法保证全局优化性。
局部搜索的算法可以描述为: 1、 选定一个初始可行解:0x;记录当前最优解0bestxx,()bestTNx;
2、 当\bestTx时,或满足其他停止运算准则时,输出计算结果,停止运算;否则,从T中选一集合S,得到S中的最好解nowx;若()()nowbestfxfx,则bestnowxx,()bestTNx;否则,\TTS;重复2,继续搜索
这种邻域搜索方法容易实现理解,容易实现,而且具有很好的通用性,但是搜索结果完全依赖于初始解和邻域的结构,而且只能搜索到局部最优解。为了实现全局搜索,禁忌搜索采用允许接受劣解来逃离局部最优解。针对局部领域搜索,为了实现全局优化,可尝试的途径有:以可控性概率接受劣解来逃逸局部极小,如模拟退火算法;扩大领域搜索结构,如TSP的2-opt扩展到k-opt;多点并行搜索,如进化计算;变结构领域搜索( Mladenovic et al,1997);另外,就是采用TS的禁忌策略尽量避免迂回搜索,它是一种确定性的局部极小突跳策略。
1.1.2禁忌搜索算法的基本思想
禁忌搜索算法的基本思想就是在搜索过程中将近期的历史上的搜索过程存放在禁忌表(Tabu List)中,阻止算法重复进入,这样就有效地防止了搜索过程的循环。禁忌表模仿了人类的记忆功能,禁忌搜索因此得名,所以称它是一种智能优化算法。
具体的思路如下:禁忌搜索算法采用了邻域选优的搜索方法,为了能逃离局部最优解,算法必须能够接受劣解,也就是每一次迭代得到的解不必一定优于原来的解。但是。一旦接受了劣解,迭代就可能陷入循环。为了避免循环,算法将最近接受的一些移动放在禁忌表中,在以后的迭代中加以禁止。即只有不在禁忌表中的较好解(可能比当前解差)才能接受作为下一次迭代的初始解。随着迭代的进行,禁忌表不断更新,经过一定迭代次数后,最早进入禁忌表的移动就从禁忌表中解禁退后。
为了找到“全局最优解”,就不应该执着于某一个特定的区域。局部搜索的缺点就是太贪婪地对某一个局部区域以及其邻域搜索,导致一叶障目,不见泰山。禁忌搜索就是对于找到的一部分局部最优解,有意识地避开它(但不是完全隔绝),从而获得更多的搜索区间。兔子们找到了泰山,它们之中的一只就会留守在这里,其他的再去别的地方寻找。就这样,一大圈后,把找到的几个山峰一比较,珠穆朗玛峰脱颖而出。
当兔子们再寻找的时候,一般地会有意识地避开泰山,因为他们知道,这里已经找过,并且有一只兔子在那里看着了。这就是禁忌搜索中“禁忌表(tabu list)”的含义。那只留在泰山的兔子一般不会就安家在那里了,它会在一定时间后重新回到找最高峰的大军,因为这个时候已经有了许多新的消息,泰山毕竟也有一个不错的高度,需要重新考虑,这个归队时间,在禁忌搜索里面叫做“禁忌长度(tabu
length)”;如果在搜索的过程中,留守泰山的兔子还没有归队,但是找到的地方全是华北平原等比较低的地方,兔子们就不得不再次考虑选中泰山,也就是说,当一个有兔子留守的地方优越性太突出,超过了“best to far”的状态,就可以不顾及有没有兔子留守,都把这个地方考虑进来,这就叫“特赦准则(aspiration criterion)”。这三个概念是禁忌搜索和一般搜索准则最不同的地方。
1.2算法的构成要素
禁忌搜索最重要的思想是标记对应已搜索的局部最优解的一些对象,并在进一步的迭代搜索中尽量避开这些对象(而不是绝对禁止循环),从而保证对不同的有效搜索途径的探索。禁忌搜索涉及到编码方式(Encode)、适值函数、移动(Moving)与领域(neighborhood)、禁忌表(tabu list)、禁忌长度(tabu 1ength)、选择策略(Selection
Strategy)、候选解(candidate)、藐视准则(candidate)等概念,下面将介绍一下这些概念
1.2.1编码方法
编码就是将实际问题的解用一种便于算法操作的形式来描述,通常采用数学的形式;算法进行过程中活着算法结束之后,还需要通过解码来还原到实际问题的解。
根据问题的具体情况,可以灵活地选择编码方式。下面介绍两种编码。
(1)编码1
各不相同的n件物品要分为m组,满足特定的约束条件,要达到特定的目标函数。 以自然数1-n分别代表n件物品,n个数加上m-1个分割符号(例如用0表示)混编在一起,随意排列,使得到一种编码方式。例如,n=9,m=3,下面便是一个合法的编码:
1-3-4-0-2-6-7-5-0-8-9 这种可以成为带分隔符的顺序编码。
(2)编码2
编码的每一位分别代表一件物品,而每一位的值代表该物品所在得分组。同样是n=9,m=3的情况,可以给出如下形式的编码:
1-2-1-1-2-2-3-3
这种是一般的自然数编码。
不同编码形式通常是可以相互转化的,例如带分隔符的顺序编码与一般的自然数编码就很容易相互转化。事实上,上面给出的两个编码表示的是同一个解,也就是物品1,3,4分在第一组;物品2,6,7,5分在第二组;其余的物品8,9分在第三组。
1.2.2适值函数的构造
将目标函数直接作为适值函数是最直接也是最容易理解的做法。当然,对目标函数的任何变形都可以作为适值函数,只要这个变形是严格单调的。例如,对于目标函数才c(x),设适值函数用c’(x) 表示,那么2()(())()...()cxcxkcxbacx 0()00,1kcXaa那么都是可以的,只要在选择的时候注意一下这个变形应该和原来目标函数的大小顺序保持一致。
适值函数的选择主要考虑提高算法的效率、便于搜索的进行等因素,以上给出的各种变形都是针对特定的目标函数形式为了简化算法而设计的。
1.2.3初始解的获得
禁忌搜索算法可以随机给出初始解,也可以事先使用其他启发式等算法给出一个较好的初始解。由于禁忌搜索算法主要是基于邻域搜索的,初始解的好坏对搜索的性能影响很大。尤其是一些带有很复杂约束的优化问题,如果随机给出初始解很可能是不行的,甚至通过多步搜索也很难找到一个可行解,这个时候应该针对特定的复杂约束,采用启发式方法或其它方法找出一个可行解作为初始解。
1.2.4移动与邻域移动
移动是从当前解产生新解的途径,从当前解可以进行的所有移动构成邻域,也可以理解为从当前解经过“一步”可以到达的区域。适当的移动规则的设计,是取得高效的搜索算法的关键。
邻域移动是从一个解产生另一个解的途径。它是保证产生好的解和算法搜索速度的最重要因素之一。邻域移动定义的方法很多,对于不同的问题应采用不同的定义方法。通过移动,目标函数值将产生变化,移动前后的目标函数值之差,称之为移动值。如果移动值是非负的,则称此移动为改进移动;否则称作非改进移动。最好的移动不一定是改进移动,也可能是非改进移动,这一点就保证搜索陷入局部最优时,禁忌搜索算法能自动把它跳出局部最优。
1.2.5禁忌表
不允许恢复即被禁止的性质称作Tabu。禁忌表的主要目的是阻止搜索过程中出现循环和避免陷入局部最优,它通常记录前若干次的移动,禁止这些移动在近期内返回。在迭代固定次数后,禁忌表释放这些移动,重新参加运算,因此它是一个循环表,每迭代一次,将最近的一次移动放在禁忌表的末端,而它的最早的一个移动就从禁忌表中释放出来。为了节省记忆时间,禁忌表并不记录所有的移动,只记录那些有特殊性质的移动,如记载能引起目标函数发生变化的移动。禁忌表记载移动的方式主要有三种:*记录目标值;*移动前的状态;*移禁忌搜索算法在冷藏供应链配送网络中的应用研究动本身。
禁忌表是禁忌搜索算法的核心,禁忌表的大小在很大程度上影响着搜索速度和解的质量。如果选择的好,可有助于识别出曾搜索过的区域。实验表明,如果禁忌表长度过小,那么搜索过程就可能进入死循环,整个搜索将围绕着相同的几个解徘徊;相反,如果禁忌表长度过大,那它将在相当大的程度上限制了搜索区域,好的解就有可能被跳过,同时,不会改进解的效果而增加算法运算时间。因此一个好的禁忌表长度应该是尽可能小却又能避免算法进入循环。禁忌表的这种特性非常类似于“短期记忆”,因而人们把禁忌表称作短期记忆函数。
禁忌表另一个作用是通过调整禁忌表的大小使搜索发散或收敛。初始搜索时,为提高解的分散性,扩大搜索区域,使搜索路径多样化,经常希望禁忌表长度小。
相反当搜索过程接近最优解时,为提离解的集中性,减少分散,缩小搜索区域,这时通常希望禁忌表长度大。为达到这样的目的,最近越来越多的人们允许禁忌表的大小和结构随搜索过程发生改变,即使用动态禁忌表,实验结果表明了动态禁忌表往往比固定禁忌表获得更好的解。
禁忌表是用来存放禁忌对象的一个容器,被放入禁忌表中的
禁忌对象在解禁之前不能被再次搜索,可见禁忌表模拟了人的记 忆机制,防止搜索陷入局部最优,进而探索更多的搜索空间。禁
忌表可以使用数组、队列、栈、链表等顺序结构实现,每个顺序
结构的元素定义根据具体问题确定。
禁忌对象就是放入禁忌表中的元素,归纳而言,禁忌对象通
常可选取状态(解的编码)本身或状态分量或适配值的变化等,
禁忌范围依次扩大。其中选取状态本身易于理解,也最为常
用,禁忌范围最小。
禁忌长度就是每个禁忌对象在禁忌表中的生存时间,也称为
禁忌对象的任期。当一个禁忌对象加入禁忌表时,设置其任期为
禁忌长度值,搜索过程每迭代一次,禁忌表中的各禁忌对象的任
期自动减1,当某一禁忌对象任期为0时,将其从禁忌表中删除。
任期不为0的禁忌对象处于禁忌状态,不能被搜索过程选为新解。
候选解是当前解邻域解集的一个子集。搜索中为了减少搜索
的代价(包括空间和时间),要求禁忌长度和候选解集尽量小但禁忌长度过小将使搜索无法跳出局部最小,候选解集过小将使搜索早熟收敛。候选解集的大小常根据问题特性和对算法的要求确定,禁忌长度的选取则主要有静态和动态两种方法。静态方法是指在搜索过程中,禁忌长度是一个固定值,比如n,其中n为问题维数或规模。动态方法是指在搜索过程中,禁忌长度也是动态变化的,当算法搜索能力较强时,可以增大禁忌长度从而延续当前的搜索能力,并避免搜索陷入局部最优解,反之亦然。禁忌频率记录每个禁忌对象出现在禁忌表中的次数,以此作为搜索过程的重要参考,如若某个对象出现频繁,则