智能优化算法学习笔记(3)–禁忌搜索算法(TS)

禁忌搜索算法概述

禁忌搜索(Tabu Search,TS)是Glover于1986年提出的一种全局搜索算法。禁忌搜索属于模拟人类智能的一种优化算法,它模仿了人类的记忆功能,在求解问题的过程中,采用了禁忌技术,对已经搜索过的局部最优解进行标记,并且在迭代中尽量避免重复相同的搜索(但不是完全隔绝),从而获得更广的搜索区间,有利于寻找到全局最优解。

禁忌搜索算法基本概念

定义1 禁忌表是用来存放(记忆)禁忌对象的表。它是禁忌搜索得以进行的基本前提。禁忌表本身是有容量限制的,它的大小对存放禁忌对象的个数有影响,会影响算法的性能。

定义2 禁忌对象是指禁忌表中被禁的那些变化元素。禁忌对象的选择可以根据具体问题而制定。例如在旅行商问题中可以将交换的城市对作为禁忌对象,也可以将总路径长度作为禁忌对象。

定义3 禁忌期限也叫禁忌长度,指的是禁忌对象不能被选取的周期。禁忌期限过短容易出现循环,跳不出局部最优,长度过长会造成计算时间过长。

定义4 渴望准则也称特赦准则。当所有的对象都被禁忌之后,可以让其中性能最好的被禁忌对象解禁,或者当某个对象解禁会带来目标值的很大改进时,也可以使用特赦规则。

定义5 领域所谓领域,简单的说即是给定点附近其他点的集合。领域就是指对当前解进行一个操作(这个操作可以称之为领域动作)可以得到的所有解的集合。

定义6 领域动作是一个函数,通过这个函数,对当前解s,产生其相应的邻居解集合。

例如:对于一个bool型问题,其当前解为:s = 1001,当前领域动作定义为翻转其中一个bit时,得到的邻居解的集合N(s)={0001,1101,1011,1000},其中N(s)属于S。

定义7 候选集合由领域中的邻居组成。禁忌搜索算法中的候选集合指的是搜索过程中待考虑的解的集合,每个解都可以看作是一个候选解。在禁忌搜索算法中,通过对候选解进行评估和选择,来进行搜索过程,同时还需要考虑候选解的禁忌属性,即哪些解不能被选择,以保证搜索的效率和质量。候选集合的大小和组成方式会影响禁忌搜索算法的搜索效果和效率。

定义8 评价函数(目标函数)评价函数是候选集合元素选取的一个评价公式,候选集合的元素通过评价函数值来选取。

算法流程

Step1:禁忌表H = 空集,并选定一个初始解x_{1};

Step2:在x_{1}的领域N(x_{i})中选择候选集Can\_N(x_{i});在Can\_N(x_{i})中选一个评价值最佳的解x_{i+1},

>x_{i+1}不在禁忌表中,选为当前解

>x_{i+1}在禁忌表中,满足破禁条件,x_{i+1}为当前解,否则从不在禁忌表解中,选择一个最优解

Step3:重复step2,直到满足停止条件

应用范围

禁忌搜索算法已经在组合优化、生产调度、机器学习、电路设计和神经网络等领域取得了很大的成功,近年来又在函数全局优化方面得到较多的研究,并大有发展的趋势。

混合其他现代计算方法,如遗传算法、蚁群算法等技术对传统的禁忌搜索算法进行性能的改进与提高。

例子


相关代码

import random

# 定义目标函数
def target_func(x):
    return x**2

# 定义禁忌搜索算法函数
def taboo_search(init_x, max_iter, tabu_length):
    # 初始化当前解和最优解
    cur_x = init_x
    best_x = init_x
    # 初始化禁忌表
    tabu_list = [init_x]
    # 迭代搜索
    for i in range(max_iter):
        # 在邻域中搜索最优解
        neighbor_x = cur_x + random.uniform(-1, 1)
        while neighbor_x in tabu_list:
            neighbor_x = cur_x + random.uniform(-1, 1)
        # 更新当前解和最优解
        if target_func(neighbor_x) < target_func(cur_x):
            cur_x = neighbor_x
        if target_func(cur_x) < target_func(best_x):
            best_x = cur_x
        # 更新禁忌表
        tabu_list.append(neighbor_x)
        if len(tabu_list) > tabu_length:
            tabu_list.pop(0) 
   # 返回最优解
    return best_x

# 测试禁忌搜索算法函数
init_x = 5
max_iter = 100
tabu_length = 5
best_x = taboo_search(init_x, max_iter, tabu_length)
print("最优解为:", best_x)
print("最优解对应的函数值为:", target_func(best_x))

在上面的代码中,我们定义了一个简单的目标函数target_func,并使用禁忌搜索算法寻找该函数的最小值。我们设定初始解为5,最大迭代次数为100,禁忌表长度为5,最终输出禁忌搜索得到的最优解及其对应的函数值。

参考文献 

计算智能 张军

  • 3
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值