2018-4-8 禁忌搜索算法(Tabu Search or Taboo Search TS)

书本《智能优化算法及其matlab实现》第146-153页

禁忌:禁止重复之前的工作,禁止走之前走过的路

原因:

为了改进局部邻域搜索容易陷入局部最优的不足,禁忌搜索算法引入了一个禁忌表,记录搜索过的局部最优点,在下一次的搜搜中,对禁忌表中的信息不再进行搜索或有选择的搜,依次跳出局部最优解。

1.局部搜索

(1)选定可行解x0,记录当前最优解xbest = x0 ,T = N(xbest)。初始化,(可随机的选取,通常凭经验)N(xbest)表示xbest的邻域

(2)当T - xbest = 空集  (表示邻域搜索完了) 或者是满足其他的终止条件,输出结果,停止运算,否则进行第三步

(3)从T 中选择一集合S ,得到S中的最好解xnow 。若f(xnow)<f(xbest),则xbest = xnow,T = N(xbest);否则 T = T - S

重复(2),继续搜索

缺点:

(1)搜索的好坏完全的依赖于初始解的选择

(2)邻域的选择,以及设置也至关重要(会不会有一种情况,选择的领域半径不够大,将最优解遗漏)

(3)若不在搜索策略上进行改进,要实现全局寻优就必须使用“完全的”邻域函数。

基于以上的种种缺点,为了更好的进行全局寻优设计出了“禁忌搜索”

禁忌搜索

我的理解:

是模拟人的大脑,当人找东西的时候,通常找过的地方就不会再去寻找(所以衍生出了禁忌表),但是当我们找东西的时候,有可能一遍找不到,这样的话我们就会开始回溯最优可能的一些地方(赦免一些在禁忌表中的地方)。



“开发”和“探索”是智能算法中的两个阶段。

算法步骤:

(1)给定禁忌搜索算法参数,随机产生初始解x,置空禁忌表

(2)判断算法终止条件是否满足,是,输出优化结果,否,继续一下步骤

(3)利用当前解的邻域函数产生其所有(或若干)邻域解,并从中确定若干候选解

(4)对候选解判断藐视规则是否满足,是,则用藐视规则的最佳状态y代替x成为新的当前解,即x = y 并用与y 对应的禁忌对象替换最早进入禁忌表的禁忌对象(y是现在的当前进行搜索的地方1,植入禁忌表2,切换状态)同时用y替换“best so far ”状态,然后转入(6),否,(5)

(5)判断候选解对应到各对象的禁忌属性,选择候选解集中非禁忌对象对应的最佳状态为新的当前解,同时用与之对应的禁忌对象替换最早进入禁忌表的禁忌对象。

(6)判断算法终止条件是否满足;是 则结束算法并输出优化结果,否转(3)

流程图:


关键参数说明:

(1)候选解

通常是在当前状态的邻域中择优选取,选取过多,容易造成较大的计算量,而过少则容易“早熟”。通常是确定性(自己经验)或随机性的产生,大小根据问题而定

(2)禁忌表

主要目的是:阻止搜索过程中出现循环和避免陷入局部最优。它通常记录若干次的移动,禁止这些一定在近期返回。在迭代固定次数后,禁忌表释放这些移动,重新参加运算,因此它是一个循环表,没迭代一次,就将最近的以此移动放在禁忌表的末端,而它的最早的一个移动就从禁忌表中释放出来。

(3)禁忌长度

禁忌表中的对象最大不允许被选中的次数(不考虑特赦的情况)

(4)藐视准则

在禁忌搜索算法中,可能会出现候选解全部被禁忌,或者存在一个优于“best so far ”状态的禁忌候选解,此时特设准则将某些状态解禁,已实现更高效的优化

特设准则:

(1基于适配值的原则:某个禁忌候选解的适配值优于“best so far”则解禁为当前状态和新的“best sofar”状态

(2基于搜索方向的准则:若禁忌对象上次被禁忌时使得适配值有所改善,并且目前该禁忌对象对应的候选解的适配值优于当前解,则对解禁。

(5)终止准则

1)最大迭代步数

2)设定某个对象最大禁忌频率

3)设定适配置的偏离阈值


例子:

以及matlab代码,可以运行来源TS解决TSP:

禁忌搜索算法(Tabu Search) - CSDN博客https://blog.csdn.net/zuochao_2013/article/details/72292466