禁忌搜索(Tabu Search)算法及python实现

禁忌搜索(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号城市,求最短距离

数据如下

禁忌搜索算法是一种启发式搜索算法,用于在大规模搜索空间中寻找最优解。它通过维护一个禁忌表来避免搜索过程中陷入局部最优解,从而提高搜索效率。 禁忌搜索算法的总成本包括两个方面:时间复杂度和空间复杂度。时间复杂度取决于搜索空间的大小和禁忌表的大小,通常情况下是指数级别的。空间复杂度则取决于禁忌表的大小和搜索过程中需要存储的其他信息,通常情况下也是指数级别的。 以下是一个简单的禁忌搜索算法Python实现: ```python def tabu_search(initial_solution, neighborhood_func, aspiration_criteria, tabu_list_size, max_iterations): current_solution = initial_solution best_solution = initial_solution tabu_list = [] iteration = 0 while iteration < max_iterations: iteration += 1 neighborhood = neighborhood_func(current_solution) best_neighbor = None for neighbor in neighborhood: if neighbor not in tabu_list or aspiration_criteria(neighbor): if best_neighbor is None or neighbor.cost < best_neighbor.cost: best_neighbor = neighbor current_solution = best_neighbor if current_solution.cost < best_solution.cost: best_solution = current_solution tabu_list.append(current_solution) if len(tabu_list) > tabu_list_size: tabu_list.pop(0) return best_solution ``` 其中,`initial_solution`是初始解,`neighborhood_func`是产生邻居解的函数,`aspiration_criteria`是采用折衷策略时的判断条件,`tabu_list_size`是禁忌表的大小,`max_iterations`是最大迭代次数。算法返回最优解。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值