智能优化系列|第四期:也许你和禁忌搜索算法的距离就差这一文(附python案例代码)

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.5path2总距离D2 =1+1+5+1=8path3总距离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.5path5总距离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博客

2.禁忌搜索算法求解TSP问题python实现

相关视频会在后续发布,欢迎关注我的bilibili:无形忍者的个人空间-无形忍者个人主页-哔哩哔哩视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值