禁忌搜索(Tabu Search)
这个比喻中有几个核心的喻体和它们对应的本体:
山——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),一个区域可能有成千上万座山。
在这种策略的指导下,徐霞客明显提升了搜索的效率,大量的重复的山被成功地跳过了。但是,随之而来还有一个问题:轮廓相似的两座山,就一定是同一座山么?显然不是的。因为把实体的“山”抽象到“山的轮廓”这个步骤,丢失了大量的细节,因此同一个轮廓是有可能对应不止一座山的。那么,假设现在徐霞客来到一座山的山脚下,抬头一看它的轮廓和手里的黄山很像。但是测了一下高度,有4700米(黄山才1900米),那显然就不是黄山了,而是昆仑!——这种情况下,即使这座山和黄山的轮廓是一样的,也一定是座新的山,即使它还在“禁忌列表”中,但它被“特赦”了(activates
aspiration criteria)。那么,昆仑山附近可能有另一座没有去过的高山。
这么一来,徐霞客又对自己的搜索方法做了改进:除了禁忌列表(tabu list),他又建了一个特赦列表(aspiration
list),针对每一种轮廓,记录了一个截至目前长得像这个轮廓的最高高度。那么未来即使碰到同一个轮廓的山,如果高度超过了这个轮廓下的历史记录,很容易就可以确定它是新的,那么就不用顾虑tabu
list了,特赦之。
该问题是一个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时停止迭代,历史最优值即为输出解。