禁忌搜索(Tabu Search)算法及python实现
版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/adkjb,未经博主允许不得转载。
禁忌搜索(Tabu Search,TS,又称禁忌搜寻法)是一种现代启发式算法,由美国科罗拉多大学教授Fred Glover在1986年左右提出的,是一个用来跳脱局部最优解的搜索方法。其先创立一个初始化的方案;基于此,算法“移动”到一相邻的方案。经过许多连续的移动过程,提高解的质量。 [ 百度百科 ]
由于网上提供的代码大多是C和Java的,这里笔者使用Python实现该算法
【目录】
- TS算法原理详解
- 举例详述TS算法过程
- Python实现TS算法
- 总结
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次之后停止迭代,通常选择第三种方法。
举例详述TS算法过程
现有一架飞机,从A点出发,需要经过B,C,D,E,F之后返回A点,且每个点只能经过一次,最后返回A点,求最短路径。
该问题是一个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时停止迭代,历史最优值即为输出解
Python实现TS算法
此处以一个简单版的TSP问题为例
现有29个城市,提供了经纬度,一架飞机需要从1号城市出发,途径剩下的28个城市然后返回1号城市,求最短距离
数据如下