禁忌搜索算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

禁忌搜索算法
2009210042 李同玲运筹学与控制论
搜索是人工智能的一个基本问题,一个问题的求解过程就是搜索。

人工智能在各应用领域中,被广泛的使用。

现在,搜索技术渗透在各种人工智能系统中,可以说没有哪一种人工智能的应用不用搜索方法。

禁忌搜索算法(Tabu Search或Taboo Search,简称TS)的思想最早由Glover (美国工程院院士,科罗拉多大学教授)在1977年提出,它是对局部邻域搜索的一种扩展,是一种全局邻域搜索算法,是人工智能的一种体现,是一种全局逐步寻优算法,是对人类智力过程的一种模拟。

TS算法通过引入一个灵活的存储结构和相应的禁忌准则来避免迂回搜索,并通过藐视准则来赦免一些被禁忌的优良状态,进而保证多样化的有效探索以最终实现全局优化。

迄今为止,TS算法在组合优化、生产调度、机器学习、电路设计和神经网络等领域取得了很大的成功,近年来又在函数全局优化方面得到较多的研究,并大有发展的趋势。

1.1引言
1.1.1局部邻域搜索
局部邻域搜索是基于贪婪思想持续地在当前的邻域中进行搜索,虽然算法通用易实现,且容易理解,但其搜索性能完全依赖于邻域结构和初始解,尤其容易陷入局部极小而无法保证全局优化性。

局部搜索的算法可以描述为:
1、 选定一个初始可行解:0x ;记录当前最优解0best x x =,()best T N x =;
2、 当\best T x =∅时,或满足其他停止运算准则时,输出计算结果,
停止运算;否则,从T 中选一集合S ,得到S 中的最好解now x ;若()()now best f x f x <,则best now x x =,()best T N x =;否则,\T T S =;重复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()(())()...()c x c x kc x b a c x +⎧
⎪=⎨⎪⎩
0()00,1k c X a a ≠>>≠那么都是可以的,只要在选择的时候注意一下
这个变形应该和原来目标函数的大小顺序保持一致。

适值函数的选择主要考虑提高算法的效率、便于搜索的进行等因素,以上给出的各种变形都是针对特定的目标函数形式为了简化算法而设计的。

1.2.3初始解的获得
禁忌搜索算法可以随机给出初始解,也可以事先使用其他启发式
等算法给出一个较好的初始解。

由于禁忌搜索算法主要是基于邻域搜索的,初始解的好坏对搜索的性能影响很大。

尤其是一些带有很复杂约束的优化问题,如果随机给出初始解很可能是不行的,甚至通过多步搜索也很难找到一个可行解,这个时候应该针对特定的复杂约束,采用启发式方法或其它方法找出一个可行解作为初始解。

1.2.4移动与邻域移动
移动是从当前解产生新解的途径,从当前解可以进行的所有移动构成邻域,也可以理解为从当前解经过“一步”可以到达的区域。

适当的移动规则的设计,是取得高效的搜索算法的关键。

邻域移动是从一个解产生另一个解的途径。

它是保证产生好的解和算法搜索速度的最重要因素之一。

邻域移动定义的方法很多,对于不同的问题应采用不同的定义方法。

通过移动,目标函数值将产生变化,移动前后的目标函数值之差,称之为移动值。

如果移动值是非负的,则称此移动为改进移动;否则称作非改进移动。

最好的移动不一定是改进移动,也可能是非改进移动,这一点就保证搜索陷入局部最优时,禁忌搜索算法能自动把它跳出局部最优。

1.2.5禁忌表
不允许恢复即被禁止的性质称作Tabu。

禁忌表的主要目的是阻止搜索过程中出现循环和避免陷入局部最优,它通常记录前若干次的移动,禁止这些移动在近期内返回。

在迭代固定次数后,禁忌表释放这些移动,重新参加运算,因此它是一个循环表,每迭代一次,将最近的一次移动放在禁忌表的末端,而它的最早的一个移动就从禁忌表中
释放出来。

为了节省记忆时间,禁忌表并不记录所有的移动,只记录那些有特殊性质的移动,如记载能引起目标函数发生变化的移动。

禁忌表记载移动的方式主要有三种:*记录目标值;*移动前的状态;*移禁忌搜索算法在冷藏供应链配送网络中的应用研究动本身。

禁忌表是禁忌搜索算法的核心,禁忌表的大小在很大程度上影响着搜索速度和解的质量。

如果选择的好,可有助于识别出曾搜索过的区域。

实验表明,如果禁忌表长度过小,那么搜索过程就可能进入死循环,整个搜索将围绕着相同的几个解徘徊;相反,如果禁忌表长度过大,那它将在相当大的程度上限制了搜索区域,好的解就有可能被跳过,同时,不会改进解的效果而增加算法运算时间。

因此一个好的禁忌表长度应该是尽可能小却又能避免算法进入循环。

禁忌表的这种特性非常类似于“短期记忆”,因而人们把禁忌表称作短期记忆函数。

禁忌表另一个作用是通过调整禁忌表的大小使搜索发散或收敛。

初始搜索时,为提高解的分散性,扩大搜索区域,使搜索路径多样化,经常希望禁忌表长度小。

相反当搜索过程接近最优解时,为提离解的集中性,减少分散,缩小搜索区域,这时通常希望禁忌表长度大。

为达到这样的目的,最近越来越多的人们允许禁忌表的大小和结构随搜索过程发生改变,即使用动态禁忌表,实验结果表明了动态禁忌表往往比固定禁忌表获得更好的解。

禁忌表是用来存放禁忌对象的一个容器,被放入禁忌表中的
禁忌对象在解禁之前不能被再次搜索,可见禁忌表模拟了人的记
忆机制,防止搜索陷入局部最优,进而探索更多的搜索空间。


忌表可以使用数组、队列、栈、链表等顺序结构实现,每个顺序
结构的元素定义根据具体问题确定。

禁忌对象就是放入禁忌表中的元素,归纳而言,禁忌对象通
常可选取状态(解的编码)本身或状态分量或适配值的变化等,
禁忌范围依次扩大。

其中选取状态本身易于理解,也最为常
用,禁忌范围最小。

禁忌长度就是每个禁忌对象在禁忌表中的生存时间,也称为
禁忌对象的任期。

当一个禁忌对象加入禁忌表时,设置其任期为
禁忌长度值,搜索过程每迭代一次,禁忌表中的各禁忌对象的任
期自动减1,当某一禁忌对象任期为0时,将其从禁忌表中删除。

任期不为0的禁忌对象处于禁忌状态,不能被搜索过程选为新解。

候选解是当前解邻域解集的一个子集。

搜索中为了减少搜索
的代价(包括空间和时间),要求禁忌长度和候选解集尽量小但禁忌长度过小将使搜索无法跳出局部最小,候选解集过小将使搜索早熟收敛。

候选解集的大小常根据问题特性和对算法的要求确定,禁忌长度的选取则主要有静态和动态两种方法。

静态方法是指在搜索过程中,禁忌长度是一个固定值,比如n,其中n为问题维数或规模。

动态方法是指在搜索过程中,禁忌长度也是动态变化的,当算法搜索能力较强时,可以增大禁忌长度从而延续当前的搜索能力,并避免搜索陷入局部最优解,反之亦然。

禁忌频率记录每个禁忌对象出现在禁忌表中的次数,以此作为搜索过程的重要参考,如若某个对象出现频繁,则
可以增加禁忌长度来避免循环。

此外可以把某对象的禁忌频率作为评价解的因素加入评价函数来指导搜索过程。

1.2.6.选择策略
选择策略即择优规则,是对当前的邻域移动选择一个移动而采用的准则。

择优规则可以采用多种策略,不同的策略对算法的性能影响不同。

一个好的选择策略应该是既保证解的质量又保证计算速度。

当前采用最广泛的两类策略是最好解优先策略和第一个改进解优先策略。

最好改进解优先策略就是对当前邻域中选择移动值最好的移动产生的解,作为下一次迭代的开始。

而第一个改进解优先策略是搜索邻域移动时选择第一改进当前解的邻域移动产生的解作为下一次迭代的开始。

最好改进解优先策略相当于寻找最陡的下降,这种择优规则效果比较好,但是它需要更多的计算时间;而最快的下降对应寻找第一个改进解的移动,由于它无需搜索整个一次邻域移动,所以它所花计算时间较少,对于比较大的邻域,往往比较适合。

1.2.7.破禁水平
破禁水平通常指渴望水平(Aspiration)函数选择,当一个禁忌移动在随后T次的迭代内再度出现时,如果它能把搜索带到一个从未搜索过的区域,则应该接受该移动即破禁,不受禁忌表的限制。

衡量标准就是定义一个渴望水平函数,渴望水平函数通常选取当前迭代之前所获得的最好解的目标值或此移动禁忌时的目标值作为渴望水平函数。

渴望水平的设定也有很多种形式,总结起来如下。

(1)基于适配值的准则。

(2)基于搜索方向的准则。

(3)基于影响力的准则。

1.2.8.停止规则
在禁忌搜索中停止规则通常有三种,一种是把最大迭代步数作为停止算法的标准,而不以局优为停止规则;第二种是在给定数目的迭代内所发现的最好解无法改进或无法离开它时,算法停止,最后一种是设定某对象的最大禁忌频率。

如果某对象的禁忌频率达到了事先给定的值,或者历史最优值连续若干步迭代得不到改善,则算法停止。

1.3禁忌搜索算法流程
简单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)。

可见,简单的禁忌搜索是在领域搜索的基础上,通过设置禁忌表来禁忌一些已经历的操作,并利用藐视准则来奖励一些优良状态,其中领域结构、候选解、禁忌长度、禁忌对象、藐视准则、终止准则等是影响禁忌搜索算法性能的关键。

需要指出的是:
(1)首先,由于TS是局部领域搜索的一种扩充,因此领域结构的设计很关键,它决定了当前解的领域解的产生形式和数目,以及各个解之间的关系。

(2)其次,出于改善算法的优化时间性能的考虑,若领域结构决定了大量的领域解(尤其对大规模问题,如TSP的SW AP操作将产生Cn2个领域解),则可以仅尝试部分互换的结果,而候选解也仅取其中的少量最佳状态。

(3)禁忌长度是一个很重要的关键参数,它决定禁忌对象的任期,其大小直接进而影响整个算法的搜索进程和行为。

同时,以上示例中,
禁忌表中禁忌对象的替换是采用FIFO方式(不考虑藐视准则的作用),当然也可以采用其他方式,甚至是动态自适应的方式。

(4)藐视准则的设置是算法避免遗失优良状态,激励对优良状态的局部搜索,进而实现全局优化的关键步骤。

(5)对于非禁忌候选状态,算法无视它与当前状态的适配值的优劣关系,仅考虑它们中间的最佳状态为下一步决策,如此可实现对局部极小的突跳(是一种确定性策略)。

(6)为了使算法具有优良的优化性能或时间性能,必须设置一个合理的终止准则来结束整个搜索过程。

此外,在许多场合禁忌对象的被禁次数(frequency)也被用于指导搜索,以取得更大的搜索空间。

禁忌次数越高,通常可认为出现循环搜索的概率越大。

我们可以明显地看到,邻域函数、禁忌对象、禁忌表和藐视准则,构成了禁忌搜索算法的关键。

其中,邻域函数沿用局部邻域搜索的思想,用于实现邻域搜索;禁忌表和禁忌对象的设置,体现了算法避免迂回搜索的特点;藐视准则,则是对优良状态的奖励,它是对禁忌策略的一种放松。

需要指出的是,上述算法仅是一种简单的禁忌搜索框架,对各关键环节复杂和多样化的设计则可构造出各种禁忌搜索算法。

同时,算法流程中的禁忌对象,可以是搜索状态,也可以是特定搜索操作,甚至是搜索目标值等。

同时,与传统的优化算法相比,TS算法的主要特点是:
(1)在搜索过程中可以接受劣解,因此具有较强的“爬山”能力;
(2)新解不是在当前解的邻域中随机产生,而或是优于“best so far ”的解,或是非禁忌的最佳解,因此选取优良解的概率远远大于其他解。

由于TS 算法具有灵活的记忆功能和藐视准则,并且在搜索过程中可以接受劣解,所以具有较强的“爬山”能力,搜索时能够跳出局部最优解,转向解空间的其他区域,从而增强获得更好的全局最优解的概率,所以TS 算法是一种局部搜索能力很强的全局迭代寻优算法.
我们首先用一个示例来理解禁忌搜索及其各重要概念,而后给出算法的一般流程。

示例:五城市的TSP 问题,设禁忌长度为3,以SW AP 为邻域操作(解的起点是1),规定()x N x ∉,候选解选当前邻域解集中的最佳4
个解。

问题的距离矩阵如下:()01015621008139158020156132005291550ij d ⎛⎫ ⎪ ⎪ ⎪= ⎪ ⎪ ⎪⎝⎭
第一步:当前状态为(1,2,3,4,5;45),其中45为目标值。

此时禁忌表H =∅,候选解集为{(1,3,2,4,5;43),(1,4,3,2,5;45),(1,2,5,4,3;59),(1,2,3,5,4;44)},则选取(1,3,2,4,5;43)为新的当前解,并令H={(1,3,2,4,5;43)},
第二步:当前解为(1,3,2,4,5;43),H={(1,3,2,4,5;43)},:候选解集为{(1,3,2,5,4;43),(1,4,2,3,5;
44),(1,2,3,4,5;45),(1,3,5,4,2;48)},则选取(1,3,2,5,4;43)为新的当前解,并令H={(1,3,2,4,5;43),(1,3,2,5,4;43)}
第三步:当前解为(1,3,2,5,4;43),H={(1,3,2,4,5;43),(1,3,2,5,4;43)},候选解集为{(1,3,2,4,5;43),(1,2,3,5,4;44),(1,5,2,3,4,;45),(1,4,2,5,3,;58)},则选取(1,2,3,5,4;43)为新的当前解,并令H={(1,3,2,4,5;43),(1,3,2,5,4;43),(1,2,3,5,4;44)} 第四步:当前解为(1,2,3,5,4;44),H={(1,3,2,4,5;43),(1,3,2,5,4;43),(1,2,3,5,4;44)},候选解集为{(1,3,2,5,4;43),(1,5,3,2,4;44),(1,2,3,4,5;45),(1,2,4,5,3,;58)},则选取(1,5,3,2,4;44)为新的当前解,并令H={(1,3,2,5,4;43),(1,2,3,5,4;44),(1,5,3,2,4;44)}
第五步:当前解为(1,5,3,2,4;44),H={(1,3,2,5,4;43),(1,2,3,5,4;44),(1,5,3,2,4;44)},候选解集为{(1,5,4,2,3;43),(1,2,3,5,4;44),(1,5,3,4,2;44),(1,5,2,3,4;58)},则选取(1,5,4,2,3;44)为新的当前解。

1.4中期表与长期表
1.4.1中期表
中期表也称为频数表或频率表。

禁忌频数(频率)是对禁忌属性的一种补充,可以放宽选择决策对象的范围。

例如,如果某个适配值频繁出现,可以推测搜索陷入了循环或者达到了某个极限点,或者说算法当前参数很难搜索到更好的状态,需要调整参数,以期望更好的
效果。

1.4.2长期表
长期表:短期记忆用来避免最近所作的一些移动被重复,但是在很多的情况下短期记忆并不足以把算法搜索带到能够改进解的区域。

因此在实际应用中常常短期记忆与长期记忆相结合使用,以保持局部的强化和全局多样化之间的平衡,即在加强与好解有关性质的同时还能把搜索带到未搜索过的区域。

在长期记忆中,频率起着非常重要的作用,使用频率的目的就是通过了解同样的选择在过去做了多少次来重新指导局部选择。

当在非禁忌移动中找不到可以改进的解时用长期记忆更有效。

目前长期记忆函数主要有两种形式,一种通过惩罚的形式,即用一些评价函数来惩罚在过去的搜索中用得最多或最少的那些选择,并用一些启发方法来产生新的初始点。

用这种方式获得的多样性可以通过保持惩罚一段时间来得到加强,然后取消惩罚,禁忌搜索继续按照正常的评价规则进行。

另一种形式采用频率矩阵,使用两种长期记忆,一种是基于最小频率的长期记忆,另一种是基于最大频率的长期记忆。

通过使用基于最小频率的长期记忆,可以在未搜索的区域产生新的序列;而使用基于最大频率的长期记忆,可以在过去的搜索中认为是好的可行区域内产生不同的序列。

在整个搜索过程中频率矩阵被不断的修改。

1.5算法性能的改进
1.5.1并行禁忌搜索算法
并行禁忌搜索算法分为两种,一种是基于空间分解策略,另一种是基于任务分解策略。

1.基于空间分解策略包括搜索空间分解和邻域分解两种做法。

搜索空间分解,即通过搜索空间的分解将原问题分解为多个子问题分别进行求解,从而实现并行化。

这里求解各个子问题的算法参数可以相同,也可以不相同。

邻域分解策略,即每一步中用很多种方法对邻域分解得到的子集进行评价,从而实现对最佳邻域解搜索的并行化,这种分解策略对同步的要求较高。

2.基于任务分解策略
将待求解问题分解为多个任务,每一个任务使用一个禁忌搜索算法来求解。

不同的禁忌搜索算法可以设置不同的参数,包括初始解、邻域结构、选择策略、渴望水平等。

在多处理机的情况下,根据这些任务对各处理机的分配情况,又可以分为如下三种。

(1)非自适应方式。

(2)半自适应方式。

(3)自适应方式。

1.5.2主动禁忌搜索算法
主动搜索(Reactive Search,简称RS)是一种反馈机制,是一种适合与求解离散优化问题的启发式算法。

Battiti和Tecchiolli (1994)将主动搜索算法机制引入到禁忌搜索算法中来,提出了主动禁忌搜索(Reactive Tabu Search,简称RTS )算法。

主动禁忌搜索算法利用反。

相关文档
最新文档