捕食搜索算法(PS)

PS算法是一种用于解决组合优化问题的模拟动物模拟动物捕食行为的空间搜索策略。

算法背景简介

【1】在没有发现猎物和猎物痕迹时,在整个空间内沿一定的方向快速的寻找猎物;
【2】一旦发现猎物或者发现猎物痕迹,捕猎者立即改变自己的运动方式,减慢速度,在该附近区域进行集中搜索,持续不断的接近猎物。
【3】在搜寻一段时间没有找到猎物后,捕猎者将放弃这种集中的区域,而继续在整个空间寻找猎物,即所谓的区域限制的搜索策略。
!!!隐含应用:猎物在搜索空间内是聚集的,若为随机分布则算法可能失效

算法优势

区域限制搜索策略可以很好的权衡全面和集中搜索,实现搜索广度和深度的结合。
文献指出:该算法适合求解TSP,GB(二分图)和 Flow-shop Sequencing等组合优化问题。

核心要义

使用限制(Restriction)来表征较优解的临近域大小,注意!!!限制级别越高,越宽松,搜索范围更大。以此来实现搜索空间的增大和减小,平衡算法的探索和开发能力。
具体实现上:当局部搜索陷入局部最优点时,通过拉高限制级别(lhighthreshold),使得算法可以接受当前解向较差的解的移动,进而在较差的解附近再开始新一轮的搜索。(实践中发现这里得避免算法在这两个“相似”的解附近循环跳跃,陷入死循环)

具体解释一下如何用限制来调控搜索范围


对于极小化目标而言,限制【0】到限制【3】,目标函数值依次增大(即 该级别的阈值),在当限制级别L较小时,比如为0,在空间中搜索可以接受的解的空间就在图中最下面包含1的那一块区域,当在这个限制级别(L=0)下搜索若干次无果后,令L=L+1(此时L=1),可搜索的范围变成了包含{1,2,10,12}所在的更大的区域,然后依次增大限制级别(即限制级别越大,搜索区域越宽松)

如何跳出局部最优点?

当L增大到一个阈值Lthreshold时,意味着算法已经在所限制的区域内搜索了跟多很多次而找不到改进解了,所以将L设置为一个相对较高的值LhighThreshold,这个阈值表示,就算搜索邻域得到一个较差解的适应值,,算法还是允许当前解向该差解移动,然后从该差解附近开始搜索,以此跳出原来所限制的较小的区域。PS:在第三步中若限制级别L很大,就可以接受较差解,跳出局部最优

关于算法中参数的设定(具体看代码)

代码演示

# -*- coding: utf-8 -*-#import package
import copy
import math
import randomimport matplotlib as mpl
import matplotlib.pyplot as pltmpl.rcParams['font.sans-serif'] = ['KaiTi']
mpl.rcParams['font.serif'] = ['KaiTi']#import datasets
#城市坐标  31个城市
def tsp_dataset(filename):location = []with open(filename) as f:for _ in range(7):f.readline()while True:content = f.readline() if content.strip('\n') == 'EOF':breakline_list = content.strip('\n').split()location.append((float(line_list[1]),float(line_list[2])))return location#内部加载城市数据
# location = [(1304,2312),(3639,1315),(4177,2244),(3712,1399),
#             (3488,1535),(3326,1556),(3238,1229),(4196,1004),
#             (4312,790),(4386,570),(3007,1970),(2562,1756),
#             (2788,1491),(2381,1676),(1332,695),
#             (3715,1678),(3918,2179),(4061,2370),
#             (3780,2212),(3676,2578),(4029,2838),
#             (4263,2931),(3429,1908),(3507,2367),
#             (3394,2643),(3439,3201),(2935,3240),
#             (3140,3550),(2545,2357),(2778,2826),
#             (2370,2975)
# ]
#外部加载城市数据
location = tsp_dataset('berlin52.txt')#distance matrix
n = len(location)
distance = [[0 for col in range(n)] for raw in range(n)]
#example:
# distance = [[0,0,0],
#            [0,0,0],
#            [0,0,0]]
for i in range(n):for j in range(n):distance[i][j] = math.sqrt((location[i][0]-location[j][0])**2+(location[i][1]-location[j][1])**2)#function
def sequence_generate():#random initial solutiongen_seq = random.sample(range(1,n+1),n)#1,2,3,4,……,n !!!no 0return gen_seqdef cacl_cost(seq):#calculate the cost of the seqseq_cost = 0for j in range(0,len(seq)-1):cost = distance[seq[j]-1][seq[j+1]-1]#recode from 0 rowseq_cost += costcost2 = distance[seq[0]-1][seq[-1]-1]#come back to startCityseq_cost += cost2return seq_costdef adjacent_seq(seq):'''#create a new solution basing on current seq 2-opt#不能产生和seq一摸一样的解!!!问题出在列表的切片上'''while True:exchange_number = random.sample(range(0,n),2)exchange_number.sort()if exchange_number[0] == (exchange_number[1]-1):#两个位置相邻continueelse:exchange_seq = seq[int(exchange_number[0]):int(exchange_number[1])]exchange_seq.reverse()new_seq = copy.deepcopy(seq)new_seq[int(exchange_number[0]):int(exchange_number[1])] = exchange_seqbreakreturn new_seqdef evalution_domain(seq , s_number):'''create s_number adjacent_seq\ns_number:在当前解附近搜索次数,每次搜索会得到一个解'''evalution_seq = [[0 for rol in range(n)] for raw in range(s_number)]for i in range(0,s_number):evalution_seq[i] = adjacent_seq(seq)return evalution_seqdef restriction_level(seq):'''calculate restrictionLevel in  the algorithm\n限制等级:numlevle+1'''restrict_domin = evalution_domain(seq,numlevle)restrict_cost = [0 for i in range(numlevle)]for i in range(numlevle):restrict_cost[i] = cacl_cost(restrict_domin[i])restrict_level = copy.copy(restrict_cost)restrict_level.sort()restrict_level.insert(0,cacl_cost(seq))return restrict_level#paramas setting
evalution_number = int(0.5*(n**2-n))#5% of the neighborhoods of seq 局部搜索的大小
numlevle = n #restriction level usually set to 'n'
cthreshold = 3*n#3*n
lthreshold = round(n/20)#n/20
lhighthreshold = n-round(n/20)#n-[n/20]best_seq = sequence_generate()
best_cost = cacl_cost(best_seq)
print('random initial solution:')
print(best_seq)
print('initial solution cost:')
print(best_cost)l = 0
counter = 0
res_level = restriction_level(best_seq)
solution = best_seq
cost_trend = [best_cost]#PSA algorithm
while l < n:# if l == 30:#         print('test')if l == lthreshold:#陷入局部最优解了,放开搜索区域l = lhighthresholdwhile True:#在当前解附近搜索evalution_number次,找到最好的一个解ns_domain = evalution_domain(solution,evalution_number)ns_cost = [0 for i in range(evalution_number)]for ns in range(0,evalution_number):ns_cost[ns] = cacl_cost(ns_domain[ns])proposal_cost = min(ns_cost)proposal_index = ns_cost.index(proposal_cost)proposal = ns_domain[proposal_index]if proposal_cost < res_level[l]:solution = proposalif proposal_cost < best_cost:best_seq = solutionbest_cost = proposal_costres_level = restriction_level(best_seq)l = 0counter = 0cost_trend.append(best_cost)else:counter +=1else:counter +=1if counter > cthreshold:counter = 0l += 1break#result
print('PSA SEARCH solution:')
print(best_seq)
print('PSA SEARCH cost:')
print(best_cost)#绘制行驶路线图
best_seq.append(best_seq[0])
x = [location[index-1][0] for index in best_seq]
y = [location[index-1][1] for index in best_seq]
plt.figure(figsize=(15,10))
plt.plot(x,y,'o')
plt.plot(x,y,linewidth=1,color='red')
plt.plot(x[0],y[0],'v',markersize=20)
plt.title('PSA_TSP')
plt.show()plt.figure(figsize=(15,10))
plt.plot(range(len(cost_trend)),cost_trend,lineWidth=2)
plt.show()
'''
random initial solution:
[27, 43, 49, 28, 24, 10, 31, 38, 42, 47, 14, 36, 17, 2, 34, 3, 18, 1, 39, 7, 6, 35, 25, 50, 41, 48, 46, 5, 13, 22, 33, 30, 16, 23, 26, 8, 20, 15, 32, 40, 21, 51, 12, 37, 19, 4, 29, 11, 44, 9, 45]
initial solution cost:
29242.35004468245
PSA SEARCH solution:
[24, 11, 27, 25, 46, 13, 51, 12, 26, 10, 50, 32, 42, 3, 5, 14, 4, 23, 47, 37, 36, 39, 38, 33, 34, 35, 48, 31, 44, 18, 9, 8, 7, 40, 2, 17, 16, 20, 41, 6, 1, 29, 28, 49, 19, 22, 30, 21, 43, 15, 45]
PSA SEARCH cost:
8345.526874164043
'''

运行结果



random initial solution:
[27, 43, 49, 28, 24, 10, 31, 38, 42, 47, 14, 36, 17, 2, 34, 3, 18, 1, 39, 7, 6, 35, 25, 50, 41, 48, 46, 5, 13, 22, 33, 30, 16, 23, 26, 8, 20, 15, 32, 40, 21, 51, 12, 37, 19, 4, 29, 11, 44, 9, 45]
initial solution cost:
29242.35004468245
PSA SEARCH solution:
[24, 11, 27, 25, 46, 13, 51, 12, 26, 10, 50, 32, 42, 3, 5, 14, 4, 23, 47, 37, 36, 39, 38, 33, 34, 35, 48, 31, 44, 18, 9, 8, 7, 40, 2, 17, 16, 20, 41, 6, 1, 29, 28, 49, 19, 22, 30, 21, 43, 15, 45]
PSA SEARCH cost:
8345.526874164043

参考资料:
【1】汪定伟, 王俊伟, 王洪峰, 等. 智能优化方法[M]. Gao deng jiao yu chu ban she, 2007.
【2】论文算法复现—智能调度(1) | 捕食搜索算法
【3】实验数据集-berlin52.tsp.gz

捕食搜索算法(PS)-求解TSP问题相关推荐

  1. 禁忌搜索算法TS求解TSP问题

    目录 一.局部邻域搜索 二.禁忌搜索 三.禁忌搜索算法流程 四.算法求解例题 一.局部邻域搜索 局部邻域搜索是基于贪婪准则持续地在当前的邻域中进行搜索,虽然算法通用,易于实现,且容易理解,但其搜索性能 ...

  2. 基于改进禁忌搜索算法求解TSP问题(Matlab代码实现)

    目录 1 概述 2 改进禁忌搜索算法 3 运行结果 4 参考文献 5 Matlab代码实现 1 概述 当城市数量较少时,理论上可以通过穷举法来列举出最优方案,然而当城市数量较多时,所有路线之和将呈指数 ...

  3. 禁忌搜索算法求解TSP旅行商问题Matlab实现

    一. 禁忌搜索算法 禁忌搜索算法是一种全局性邻域搜索算法,模拟人类具有记忆功能的寻优特征.它通过局部邻域搜索机制和相应的禁忌准则来避免迂回搜索,并通过破禁水平来释放一些被禁忌的优良状态,进而保证多样化 ...

  4. 遗传-粒子群算法遗传-禁忌搜索算法求解TSP问题

    1. 前言 上一篇博文[五种常见启发式算法求解TSP问题-总结篇]中,总结了五种常见启发式算法在求解TSP问题上的效果,其中遗传算法的求解质量最差,而粒子群算法和禁忌搜索算法的求解效果最佳,因此本文计 ...

  5. 禁忌搜索算法求解TSP旅行商问题C++(2020.11.19)

    TS算法求解TSP问题C++ 1.禁忌搜索算法 1.1 基本思想及主要特点 1.2 基本概念 1.3 算法流程 2. TS求解TSP问题的C++实现 2.1 输入数据文件:bayg29.tsp 2.2 ...

  6. 实验10 禁忌搜索算法求解tsp问题

    传送门(所有的实验都使用python实现) 实验1 BP神经网络实验 实验2 som网实验 实验3 hopfield实现八皇后问题 实验4 模糊搜索算法预测薄冰厚度 实验5 遗传算法求解tsp问题 实 ...

  7. 基于遗传算法求解TSP问题(旅游路径规划,Python实现,超详细,可视化,结果分析)

    ps:作者是很用心写的,如果觉得不错,请给作者一点鼓励噢!(点赞收藏评论噢) 基于遗传算法求解TSP问题 摘要 巡回旅行商问题(TSP)是组合优化中的经典问题.常见的TSP问题求解算法例如穷举法.贪心 ...

  8. 【Matlab】 遗传算法求解TSP问题

    [Matlab] 遗传算法求解TSP问题 文章目录 [Matlab] 遗传算法求解TSP问题 前言 一.问题描述 二.实验设计 1.问题案例 2.读入数据 3.适应度计算 4. 选择子代 5. 结果输 ...

  9. 人工智能导论——遗传算法求解TSP问题实验

    一.实验目的: 熟悉和掌握遗传算法的原理.流程和编码策略,并利用遗传算法求解组合优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响. 二.实验原理: 旅行商问题,即TSP问题(Traveli ...

最新文章

  1. 设备控制接口(ioctl 函数)
  2. 我从大厂面试中学到的关于 C# 的知识
  3. 通过批处理文件启动Oracle服务
  4. 在opencv中实现中文输出
  5. 政企上云网络适配复杂,看华为云Stack有妙招
  6. jquery--动态篇
  7. c++多线程——基于锁和条件变量的前程安全队列
  8. vivo换手机云服务器,换新手机迁移数据很麻烦?这里两招教你快速迁移,有云服务不用愁...
  9. adodb 连接oracle php,c# 利用ADODB连接ORACLE数据库
  10. RS232_RS422_RS485简介
  11. 这位程序员桌面很干净
  12. 数字营销专业术语介绍
  13. 智能化推送服务MobPush产品简介
  14. GMSL虚拟通道ID简介
  15. 游戏开发和设计推荐书籍
  16. 为什么要学习Java?|猿代码科技
  17. 升级win8后视频没有图像只有声音的一个解决方法
  18. PMP项目管理——整合管理之制订项目管理计划
  19. 视相关细节层次网格简化方法(VDPM-LOD)
  20. uniapp授权登陆操作

热门文章

  1. c语言德州扑克课设报告,德州扑克 别在聊天时一不小心泄露了自己的牌力
  2. 无人驾驶掀起车载摄像头新风潮
  3. sigma-delta数字滤波器的设计(1) — 原理与前端设计
  4. RTOS原理与实现01:RTOS基础知识
  5. 祝贺memoQ再获好评!
  6. 【追光者】2022年终总结,又是一个开始,新的挑战。愿你历尽千帆,归来仍是少年。
  7. H5 CSS hack 和浏览器内核
  8. python制作ai小说网_【案例分享】使用Python创建AI比你想象的轻松
  9. 使用lnkscape制作简单名字logo设计
  10. STM32CubeMX系列|ADXL345传感器