禁忌搜索算法求解TSP问题python实现

1 禁忌搜索(Tabu Search)

1.1 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次之后停止迭代,通常选择第三种方法。

1.2 算法流程

Step1:生成初始解(随机生成,贪婪算法生成,改良圈算法生成);

Step2:Inversion方法生成邻域;

Step3:更新当前最优解、禁忌表以及下一次进入迭代过程的路径;

Step4:重复Step2~3直到满足程序终止条件(本实验采用迭代次数);

Step5:搜索结果可视化输出。

1.3 算例分析

t a b u _ s i z e = 2 tabu\_size=2 tabu_size=2(禁忌表长)

S 1 = [ 2 , 1 , 4 , 3 ] S_1=[2,1,4,3] S1=[2,1,4,3],$ f(S_1) = 500 , , tabu_list =[] , , S_0 = [2,1,4,3],best_so_far=500$

随机交换 S 0 S_0 S0中两个元素的位置,一共不重复地交换M(候选集合长度)次

交换元素 候选集合(邻域) 目标函数值
(2 , 1) [1,2,3,4] 480
(1 , 4) [2,4,1,3] 436
(4 , 3) [2,1,3,4] 652

S 0 S_0 S0交换1和4时目标函数值最优,此时 S 2 = [ 2 , 4 , 1 , 3 ] S_2=[2,4,1,3] S2=[2,4,1,3], f ( S 2 ) = 436 f(S_2)=436 f(S2)=436。将(1,4)添加到禁忌表中, t a b u _ l i s t = [ ( 1 , 4 ) ] tabu\_list=[(1,4)] tabu_list=[(1,4)],令 S 0 = S 2 , b e s t _ s o _ f a r = 436 S_0=S_2,best\_so\_far=436 S0=S2,best_so_far=436。随机交换 S 2 S_2 S2中两个元素的位置,总共不重复地交换M次

交换元素 候选集合(邻域) 目标函数值
(2 , 4) [4,2,1,3] 460
(4 , 1) [2,1,4,3] 500
(1 , 3) [2,4,3,1] 608

S 2 S_2 S2交换2和4时目标函数值最优,此时 S 3 = [ 4 , 2 , 1 , 3 ] S_3=[4,2,1,3] S3=[4,2,1,3], S 0 S_0 S0 b e s t _ s o _ f a r best\_so\_far best_so_far保持不变 f ( S 3 ) = 460 f(S_3)=460 f(S3)=460。将(2,4)添加到禁忌表中, t a b u _ l i s t = [ ( 1 , 4 ) , ( 2 , 4 ) ] tabu\_list=[(1,4),(2,4)] tabu_list=[(1,4),(2,4)]。随机交换S2中两个元素的位置,总共不重复地交换M次。

交换元素 候选集合(邻域) 目标函数值
(4 , 2) [2,4,1,3] 436
(2 , 1) [4,1,2,3] 440
(1 , 3) [4,2,3,1] 632

S 3 S_3 S3交换4和2时目标函数最优,虽然(2,4)已经在禁忌表中,但是 f ( S 3 ) = 436 < b e s t _ s o _ f a r = 460 f(S_3)=436<best\_so\_far=460 f(S3)=436<best_so_far=460,所以此时只需将禁忌表中的元素(2,4)调整一下位置即可(放在现有元素的最后面)。此时 S 4 = [ 2 , 4 , 1 , 3 ] S_4=[2,4,1,3] S4=[2,4,1,3], f ( S 4 ) = 436 f(S_4)=436 f(S4)=436, t a b u _ l i s t = [ ( 2 , 4 ) , ( 1 , 4 )

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值