禁忌搜索算法
目录
产生过程
禁忌搜索是在局部领域搜索(爬山启发式算法)的基础上产生的。
爬山启发式算法:从当前节点开始,和周围的邻居节点的值进行比较。如果当前节点值最大,那么返回当前节点,作为最大值;反之用相邻的最高节点替换当前节点,重复以上操作实现向山峰高处攀爬的目的。因为搜索范围是当前点的邻居节点,因此搜索不够全面,得到的结果可能不是最佳的。
禁忌搜索算法:为了找到全局最优解,在上面的爬山启发式方法的基础上进行改进,不再执着于当前节点的邻居节点进行搜索,具体搜索过程是什么样的呢?看接下来的内容
核心思想及流程
核心思想:首先求解局部最优解并进行标记,在进一步迭代的过程中避开局部最优解,扩大搜索范围。通过将多个局部最优解进行比较,得到全局最优解。
算法流程:
(1)产生初始可行解,设置空的禁忌表
(2)判断是否满足接入条件,不满足进入循环
(3) 生成当前解的邻域解,并从中选出候选解
(4) 判断候选解是否满足藐视规则
(5) 满足藐视准则
(6) 将其作为当前解,替换最早进入禁忌表中的对象,更新最优解,去(2)
(7) 不满足藐视准则
(8) 判断候选解禁忌属性,看他是否在禁忌表中
(9) 将非禁忌的最佳候选解作为当前解,用该解对应对象替换最早进入禁忌表中的对象
(10)满足,输出最优解结束。
关键名词
禁忌对象:为了提升计算效率,减少没用的计算,对于一些我们之前选取过,已经计算过的元素,我们要避免一些操作重复计算,我们需要将这些元素放置到禁忌表中来禁止这些元素参与计算,这些元素就是我们所说的禁忌对象。
禁忌长度:指的是被禁对象不允许选取的迭代次数,设t,要求被禁对象在t步之内不允许出现。因此我们可以将所有元素分为两类,一类是被禁元素,另一类是自由元素。
特点
避免在搜索过程中循环
不以局部最优作为停止准则
采用禁忌表在邻域中选取最优解
在用禁忌搜索的时候需要注意的内容:
- 解的形式具体问题具体分析:
- 例如:旅行商问题
定义ABCD组成的串为解
- 例如:旅行商问题
- 邻域的产生:根据之前定义的解的形式自定义邻域的产生规则,使得产生的邻域尽可能全面
- 禁忌表的设置:重点是两个内容,禁忌对象和禁忌长度
- 禁忌对象:被禁的变化元素
- 禁忌长度:禁忌的步数
- 终止条件:
- 设置最大迭代次数、
- 采用频率控制(对产生的结果进行统计,如果某个目标值或元素出现的频率高于给定阈值,停止迭代输出结果)、
- 迭代次数内,历史最优值未发生变化,停止算法