文章目录
1 禁忌搜索(Tabu Search)
1.1 TS相关术语介绍
- 邻域
对于组合优化问题,给定任意可行解x,x∈D,D是决策变量的定义域,对于D上的一个映射:N:x∈D→N(x)∈2(D) 其中2(D)表示D的所有子集组成的集合,N(x)成为x的一个邻域,y∈N(x)称为x的一个邻居。
- 候选集合
候选集合一般由邻域中的邻居组成,可以将某解的所有邻居作为候选集合,也可以通过最优提取,也可以随机提取,例如某一问题的初始解是[1,2,3],若通过两两交换法则生成候选集合,则可以是[1,3,2],[2,1,3],[3,2,1]中的一个或几个。
- 禁忌表
禁忌表包括禁忌对象和禁忌长度。由于在每次对当前解的搜索中,需要避免一些重复的步骤,因此将某些元素放入禁忌表中,这些元素在下次搜索时将不会被考虑,这些被禁止搜索的元素就是禁忌对象;
禁忌长度则是禁忌表所能接受的最多禁忌对象的数量,若设置的太多则可能会造成耗时较长或者算法停止,若太少则会造成重复搜索。
- 评价函数
用来评价当前解的好坏,TSP问题中是路径里程。
- 藐视规则
禁忌搜索算法中,迭代的某一步会出现候选集的某一个元素被禁止搜索,但是若解禁该元素,则会使评价函数有所改善,因此我们需要设置一个特赦规则,当满足该条件时该元素从禁忌表中跳出。
- 终止规则
一般当两次迭代得到的局部最优解不再变化,或者两次最优解的评价函数差别不大,或者迭代N次之后停止迭代,通常选择第三种方法。
1.2 算法流程
Step1:生成初始解(随机生成,贪婪算法生成,改良圈算法生成);
Step2:Inversion方法生成邻域;
Step3:更新当前最优解、禁忌表以及下一次进入迭代过程的路径;
Step4:重复Step2~3直到满足程序终止条件(本实验采用迭代次数);
Step5:搜索结果可视化输出。
1.3 算例分析
t a b u _ s i z e = 2 tabu\_size=2 tabu_size=2(禁忌表长)
S 1 = [ 2 , 1 , 4 , 3 ] S_1=[2,1,4,3] S1=[2,1,4,3],$ f(S_1) = 500 , , ,tabu_list =[] , , ,S_0 = [2,1,4,3],best_so_far=500$
随机交换 S 0 S_0 S0中两个元素的位置,一共不重复地交换M(候选集合长度)次
交换元素 | 候选集合(邻域) | 目标函数值 |
---|---|---|
(2 , 1) | [1,2,3,4] | 480 |
(1 , 4) | [2,4,1,3] | 436 |
(4 , 3) | [2,1,3,4] | 652 |
对 S 0 S_0 S0交换1和4时目标函数值最优,此时 S 2 = [ 2 , 4 , 1 , 3 ] S_2=[2,4,1,3] S2=[2,4,1,3], f ( S 2 ) = 436 f(S_2)=436 f(S2)=436。将(1,4)添加到禁忌表中, t a b u _ l i s t = [ ( 1 , 4 ) ] tabu\_list=[(1,4)] tabu_list=[(1,4)],令 S 0 = S 2 , b e s t _ s o _ f a r = 436 S_0=S_2,best\_so\_far=436 S0=S2,best_so_far=436。随机交换 S 2 S_2 S2中两个元素的位置,总共不重复地交换M次
交换元素 | 候选集合(邻域) | 目标函数值 |
---|---|---|
(2 , 4) | [4,2,1,3] | 460 |
(4 , 1) | [2,1,4,3] | 500 |
(1 , 3) | [2,4,3,1] | 608 |
对 S 2 S_2 S2交换2和4时目标函数值最优,此时 S 3 = [ 4 , 2 , 1 , 3 ] S_3=[4,2,1,3] S3=[4,2,1,3], S 0 S_0 S0和 b e s t _ s o _ f a r best\_so\_far best_so_far保持不变 f ( S 3 ) = 460 f(S_3)=460 f(S3)=460。将(2,4)添加到禁忌表中, t a b u _ l i s t = [ ( 1 , 4 ) , ( 2 , 4 ) ] tabu\_list=[(1,4),(2,4)] tabu_list=[(1,4),(2,4)]。随机交换S2中两个元素的位置,总共不重复地交换M次。
交换元素 | 候选集合(邻域) | 目标函数值 |
---|---|---|
(4 , 2) | [2,4,1,3] | 436 |
(2 , 1) | [4,1,2,3] | 440 |
(1 , 3) | [4,2,3,1] | 632 |
对 S 3 S_3 S3交换4和2时目标函数最优,虽然(2,4)已经在禁忌表中,但是 f ( S 3 ) = 436 < b e s t _ s o _ f a r = 460 f(S_3)=436<best\_so\_far=460 f(S3)=436<best_so_far=460,所以此时只需将禁忌表中的元素(2,4)调整一下位置即可(放在现有元素的最后面)。此时 S 4 = [ 2 , 4 , 1 , 3 ] S_4=[2,4,1,3] S4=[2,4,1,3], f ( S 4 ) = 436 f(S_4)=436 f(S4)=436, t a b u _ l i s t = [ ( 2 , 4 ) , ( 1 , 4 )