1.禁忌搜索简介
禁忌搜索(Tabu Search,简称TS)是属于模拟人类智能的一种优化算法,它模仿了人类的记忆功能,在搜索过程中标记已经找到的局部最优解及求解过程,并于之后的搜索中避开它们(但不是完全杜绝),从而获得更广的搜索区间,有利于寻找到全局最优解。TS算法通过禁忌策略实现记忆功能,通过藐视准则继承LS的强局部搜索能力。各种机制的配合,使得TS一方面具备高局部搜索能力,同时又能防止算法在优化中陷入局部最优。
2.禁忌搜索的核心思想
禁忌搜索的核心要素有5个:禁忌对象,禁忌表,禁忌步长,藐视准则,终止准则
禁忌对象(Tabu Object,TO):指禁忌表中被禁止的变化元素,比如在旅行商问题(TSP)中可以是交换的城市对或者总路径长度。
禁忌表(Tabu List,TL):用来存放(记忆)禁忌对象的表,是禁忌搜索算法的基本前提。禁忌表有容量限制,大小影响存放禁忌对象的个数,进而影响算法性能。
禁忌长度(Tabu Tenure,TT):指禁忌对象不能被选取的周期,也称为禁忌长度。禁忌期限过短容易导致循环,难以跳出局部最优;过长则会增加计算时间。
藐视准则(Aspiration Criteria,AC):也称为特赦规则,用于在所有对象都被禁忌时解禁性能最好的对象,或者当解禁某个对象会带来目标值显著改进时使用。
终止准则:可以是最大迭代步数;可以利用某个对象的最大禁忌频率,也可以是适配值的偏离幅度。
3.禁忌搜索的步骤
[②-④是迭代步骤],IterMax设置为多少,就迭代多少次。
①首先,生成一个初始解,并将其设为当前解,然后将该解加入禁忌表中。
②创建当前解的候选解集,也就是当前解的邻域解集。
③从步骤②产生的所有候选解中选出这一轮适应值最好的候选解,将其与全局最优解进行比较,
如果优于全局最优解,那么就不考虑其是否被禁忌,用这个最好的候选解来更新全局最优解,并且作为下一个迭代的当前解,然后将对应的城市交换对加入禁忌表;
如果不优于全局最优解,就从所有候选解中选出不在禁忌状态下的最好解作为新的当前解,并且作为下一个迭代的当前解,然后将对应的城市交换对加入禁忌表;这时候不更新全局最优解。
④将新的当前解加入禁忌表,并更新禁忌表。
⑤输出搜索到的最优解。
4.禁忌搜索的算法流程和详细步骤
下面有一个列子来说明:
我们已知(a,b,c,d)四个城市的不对称距离矩阵为Dij,这里假设起始点和结束点必须为a,求解TSP问题:
那么这里我们如下
4.1基本定义:
禁忌对象是交换城市对;
禁忌表保存的是禁忌对象,即交换城市对,
禁忌长度为2,即交换的城市对在禁忌表中存放,经过2轮迭代后会被释放出来,又可以被选择了。
候选解的产生方式为交换一个解中相邻的两点的顺序。某轮迭代中产生的候选解最优且不在禁忌表中的解作为新的当前解
藐视准则:如果某轮迭代中产生的候选解都在禁忌表中,那么这轮迭代直接选择禁忌表中的最优解作为新的当前解,不更新禁忌表。
禁忌表更新规则:用一个数字记录禁忌表中每个解能在迭代中保存的剩余轮数,当解的剩余保存轮数为0时,将解移出禁忌表。
终止准则:最大迭代步数
4.2算法的步骤如下:
从距离矩阵我们可以看出:
ab =1
ac =0.5
ad =1
ba =1
bc =1
bd =1
ca =1.5
cb =5
cd =1
da =1
db =1
dc =1
步骤①产生初始解path0 = (abcda),设置禁忌表为tabu_dict为空,path0的总距离D0 = 1+1+1+1=4。
重复迭代步骤②-步骤④
-------------------------------迭代第一次---------------------------------------------------------
步骤②在禁忌表tabu_dict的限制下,此时path0为当前解,构建当前解的邻域P={
交换bc->path1:acbda | 交换bd->path2:adcba | 交换cd->path3:abdca |
---|---|---|
path1总距离D1 = 0.5+5+1+1=7.5 | path2总距离D2 =1+1+5+1=8 | path3总距离D3 = 1+1+1+1.5=4.5 |
},选path3为这一轮适应值最好的候选解。
步骤③ 此时全局最优解best_path =path3(abdca),令当前解path0=path3(abdca)
步骤④ tabu_dict.append(path3的交换城市对)那么tabu_dict={{(cd):2}}
-------------------------------迭代第二次---------------------------------------------------------
步骤②在禁忌表tabu_dict的限制下,构建当前解的邻域P={
交换bc->path4:acdba | 交换bd->path5:adbca |
---|---|
path4总距离D4 = 0.5+1+1+1=3.5 | path5总距离D5 =1+1+1+1.5=4.5 |
},选path4为这一轮适应值最好的候选解。
步骤③ 此时全局最优解best_path =path4(acdba),令当前解path0=path4(acdba)
步骤④ tabu_dict.append(path4的交换城市对)那么tabu_dict={{(cd):1},{(bc):2}}
-------------------------------迭代第三次---------------------------------------------------------
步骤②在禁忌表tabu_dict的限制下,构建当前解的邻域P={
交换bd->path6:acbda |
---|
path6总距离D6 = 0.5+5+1+1=7.5 |
},path6选出这一轮适应值最好的候选解
步骤③ 如果没有藐视准则,best_path<path6,故全局最优解不变,
此时best_path =path4(acdb),令当前解path0=path6(acbda)
步骤④ tabu_dict.append(path6的交换城市对),那么tabu_dict={{(bc):1},{(bd):2}}
-------------------------------迭代第N次---------------------------------------------------------
按照上面的步骤不断迭代,直到达到设置的最大迭代次数IterMax,则程序终止。
最后得到的全局最优解best_path,就是最后的输出结果。
5.最后
理解了上面的迭代过程,也就理解了禁忌搜索算法的精髓。
┭┮﹏┭┮,至于禁忌搜索算法的实例代码,下期再出了,今天先到这里~
6.相关阅读
1.禁忌搜索(TS)总结:算法流程,实例,思路_ts算法步骤-CSDN博客
相关视频会在后续发布,欢迎关注我的bilibili:无形忍者的个人空间-无形忍者个人主页-哔哩哔哩视频