一、获取代码方式

获取代码方式1:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

获取代码方式2:
完整代码已上传我的资源:【TSP】基于matlab人工鱼群算法求解旅行商问题【含Matlab源码 422期】

备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、TSP简介

旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
TSP的数学模型

三、人工鱼群算法简介

1 AFSA的基本思想
人工鱼群算法(artificial fish-swarm algorithm,AFSA)是由李晓磊博士在2002年提出的一种群体智能优化算法。其基本思想是仿照鱼群在一片水域当中寻找最优解的觅食、聚群和追尾等行为,水域中的每一条鱼都对应其中的一个优化解,该水域即为被优化问题的解空间。通过分析人工鱼群的优化理念,可得其人工鱼环境模型如图4所示。假设水域中一条鱼现时状态是X,其可见范围为Visual(公式中用Zvisual表示),在某一时间点对应的视点位置为X k,如果该方位较此时状态更优,则可往该地点处向前一步,即抵达X next;若该方位无此时状态更优,则一直在可见视线内找寻其他较优地点。

2 AFSA路径规划中的具体步骤
1)初始化设置。对鱼群中的各个参数进行初始设置,包括:该人工鱼群的群体规模、视野、最大迭代次数、每一条鱼的最大移动步长Step(公式中用Lstep)等参数。
2)此时迭代的次数是0,由N条鱼组成初始鱼群,每个鱼表示从初始位置到目标位置的一条路径。
3)对每一条人工鱼都进行行为模拟:觅食、追尾、聚群与随机移动行为,选取其中最优的一种行为来操作。
2.1 觅食行为

伪代码段如下:

for i = 1:Nfor j = 1:Try_numberXj=x(i)+Visual.*rand();%人工鱼Xi按式(1)在其视野内随机选择一个状态Xjif f(Xj)<f(x(i))       %比较Xj和Xi的适应度X_next= x(i)+rand()*step*(Xj-x(i))/norm(Xj-x(i)); %人工鱼Xi按式(2)朝着Xj方向移动一步,norm()函数表示二范数 break;elseX_next=x(i)+step*rand();endend
end

2.2 聚群行为
鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群 。人工鱼X i X_iXi​搜索其视野内(d i j < v i s u a l d_{ij}<visualdij​<visual)的伙伴数目n f n_fnf​及中心位置X c X_cXc​,若Y c / n f < δ Y i Y_c/n_f< δY_iYc​/nf​<δYi​(求极小值时使用小于号,在求极大值时则相反;Y c Y_cYc​和Y i Y_iYi​分别为X c X_cXc​和X i X_iXi​的适应度值),表明伙伴中心位置状态较优且不太拥挤,则X i X_iXi​朝伙伴的中心位置移动一步,否则执行觅食行为;
框架图如下所示:

伪代码段如下:

nf=0;X_inside=0;
for i = 1:Nfor j = 1:N   if norm(x(j)-x(i))<Visual         % 求人工鱼Xi与其他人工鱼之间的距离nf = nf+1;                  %统计在视野范围内的鱼数量   X_inside= X_inside+x(j);    %将视野范围内的鱼进行累加endX_inside=X_inside-x(i);         %需要去除Xi本身;因为在 一开始计算时,i=j,把中心的鱼也进行了一次计算nf=nf-1;   Xc = X_inside/nf;              %此时Xc表示Xi感知范围其他伙伴的中心位置; if  f(Xc)/nf < δ*f(x(i))x_next=x(i)+rand*Step*(Xc-x(i))/norm(Xc-x(i)); else进行觅食行动endend
end

2.3 追尾行为
指鱼向其视野区域内的最优方向移动的一种行为。人工鱼X i X_iXi​搜索其视野内(d i j < v i s u a l d_{ij}<visualdij​<visual)适应度最高的个体X j X_jXj​,其适应度值为Y j Y_jYj​,并探索人工鱼X j X_jXj​视野内的伙伴数目n f n_fnf​,若Y j / n f < δ Y i Y_j/n_f< δY_iYj​/nf​<δYi​,表明X j X_jXj​状态较优且不太拥挤,则X i X_iXi​朝X j X_jXj​位置移动一步,否则执行觅食行为;
  框架图如下所示:

伪代码段如下:

Y_max=inf;nf=0;
for i = 1:N    %搜索人工鱼Xi视野范围内的最高适应度个体Xjfor j = 1:N     if norm(x(j)-x(i))<Visual && f(x(j))<Y_max        % 求人工鱼Xi与其他人工鱼之间的距离X_max=x(j);        Y_max=f(x(j));endend%搜索人工鱼Xj视野范围内的伙伴数量for j = 1:N        if(norm(x(j)-X_max)<Visual)       nf=nf+1;endendnf=nf-1;%去掉他本身if Y_max/nf<delta*f(x(i))x_next= x(i,:)+rand*Step.*(temp_maxX-x(i,:))./norm(temp_maxX-x(i,:));else进行觅食行为;end
end

2.4 算法总述
综上所述,算法在运算过程中,会同时进行聚群和追尾行为。而觅食行为属于这两种行为中发现聚群对象或者追尾对象附近拥挤度过大时,人工鱼选择的行为方式,若在觅食过程中,未发现比自身适应度高的人工鱼,则按步长step随机移动。最后对聚群行为和追尾行为得到的适应度值进行比较,选择优秀的人工鱼作为下一代的个体。其总框架图如下:

3 分析拥挤度因子δ
3.1 拥挤度因子的取值

在求极小值问题中:δ = α n m a x , α ∈ ( 0 , 1 ] δ=αn_{max}, α∈(0,1]δ=αnmax​,α∈(0,1]
在求极大值问题中:δ = 1 α n m a x , α ∈ ( 0 , 1 ] δ=\frac{1}{αn_{max}},α∈(0,1]δ=αnmax​1​,α∈(0,1]
其中α αα为极值接近水平,n m a x n_{max}nmax​为期望在该邻域内聚集的最大人工鱼数目。

3.2 拥挤度因子的作用机理
对追尾行为的描述

图中af0为人工鱼af1-5在各自视野内的最优人工鱼,其实物浓度为Y j Y_jYj​,C1为以af0为圆心,以视野范围为半径的圆,即能探知af0的最远距离,人工鱼越靠近af0,状态越优。
求极大值情况下:当δ n f ≤ 1 δn_f\leq 1δnf​≤1时,所有人工鱼af1-5都执行追尾行为,向af0游动;
δ = 1 α n m a x δ=\frac{1}{αn_{max}}δ=αnmax​1​
δ n f = n f α n m a x ≤ 1 δn_f =\frac{n_f}{αn_{max}}\leq 1δnf​=αnmax​nf​​≤1
当α αα=1的时候,可以明显看出来n f ≤ n m a x n_f \leq n_{max}nf​≤nmax​,即说明人工鱼视野范围内不拥挤。
当δ n f > 1 δn_f >1δnf​>1时,若C2的食物浓度为Y j δ n f \frac{Y_j}{δn_f }δnf​Yj​​的等浓度食物圈,则C2与C1间的人工鱼af1、af2、af3执行追尾行动,向af0游动,人工鱼af4、af5执行觅食行为。此时δnf 越大执行追尾行动的人工鱼越少,反之越多。

3.2 拥挤度因子的影响
以极大值为例(极小值的情况正好和极大值相反), δ δδ越大,表明允许的拥挤程度越小,人工鱼摆脱局部最优的能力越强;但是收敛的速度会有所减缓,这主要因为人工鱼在逼近极值的同时,会因避免过分拥挤而随机走开或者受其它人工鱼的排斥作用,不能精确逼近极值点。可见,δ δδ的引入避免了人工鱼过度拥挤而陷入局部极值,另一方面,该参数会使得位于极值点附近的人工鱼之间存在相互排斥的影响,而难以向极值点精确逼近,所以,对于某些局部极值不是很严重的具体问题,可以忽略拥挤的因素,从而在简化算法的同时也加快了算法的收敛速度和提高结果的精确程度。

四、部分源代码

clear
clctic                                                                 %开始计时[num_Citys,CityPosition]=ReadTSPFile('ulysses22.tsp');              %读取.tsp文件
%% 计算两两城市之间的距离
h=pdist(CityPosition);
D=squareform(h);
%% 初始化参数
FishNum=9;                                                          %生成10只人工鱼
Max_gen=200;                                                        %最多迭代次数
trynumber=500;                                                      %最多试探次数
Visual=16;                                                          %感知距离
deta=0.8;                                                           %拥挤度因子
%% 鱼群初始化,每一行表示一条鱼
initFish=AF_init(FishNum,num_Citys);BestX=zeros(Max_gen,num_Citys);                                     %记录每次迭代过程中最优路径
BestY=zeros(Max_gen,1);                                             %记录每次迭代过程中最优路径的距离
besty=inf;                                                          %最优总距离,初始化为无穷大
gen=1;
currX=initFish;
currY=AF_foodconsistence(currX,D);
while gen<=Max_genfor i=1:FishNum[Xinext,flag]= AF_movestrategy(currX,i,D,Visual,deta,trynumber);currX(i,:)=Xinext;endcurrY=AF_foodconsistence(currX,D);[Ymin,index]=min(currY);if Ymin<bestybesty=Ymin;bestx=currX(index,:);BestY(gen)=besty;BestX(gen,:)=bestx;elseBestY(gen)=BestY(gen-1);BestX(gen,:)=BestX(gen-1,:);enddisp(['第',num2str(gen),'次迭代,得出的最优值:',num2str(BestY(gen))]);gen=gen+1;end
%% 本程序用来使第i条人工鱼觅食,假如觅食成功,则flag 为1,X中为i鱼觅食后的状态,否则flag为0
%输入X:               鱼群集合
%输入i:               第i条人工鱼
%输入D:               距离矩阵
%输入trynumber:       最多试探次数
%输入Visual:          感知距离
%输出Xinext:          新找到的路径
%输出flag:            标记是否找到更好的路径,flag=0表示觅食失败,flag=1表示觅食成功
function [Xinext,flag]=AF_prey(X,i,D,trynumber,Visual)Xinext=[];
Yi=PathLength(D,X(i,:));                                            %路径Xi的总距离
CityNum=length(X(i,:));
flag=0;                                                         %标记是否觅食到更好路径,flag=0表示没觅食到,flag=1表示觅食成功
for j=1:trynumberwhile(1)DJ=floor(rand*Visual)+1;    %不相同的字段数if(DJ>0 && DJ<=Visual)         %在视野范围内break;endendwhile(1)S(1)=floor(rand*CityNum)+1;if(S(1)>1 && S(1)<=CityNum)  %在所有城市里break;endendp=1;while(p<DJ)t=floor(rand*CityNum)+1;if(t>1&&t<=CityNum && sum(S==t)==0)p=p+1;S(p)=t;endendXi=X(i,:);t=Xi(S(1));for k=1:DJ-1Xi(S(k))=Xi(S(k+1));end

五、运行结果


六、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

【TSP】基于matlab人工鱼群算法求解旅行商问题【含Matlab源码 422期】相关推荐

  1. 【AFSA TSP】基于matlab人工鱼群算法求解旅行商问题【含Matlab源码 422期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab人工鱼群算法求解旅行商问题[含Matlab源码 422期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  2. 【AFSA TSP】基于matlab改进的人工鱼群算法求解旅行商问题【含Matlab源码 1479期】

    ⛄一. TSP简介 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须 ...

  3. Matlab实现鱼群算法(附上完整仿真源码)

    鱼群算法(Fish School Search, FSS)是一种基于鱼群行为的启发式优化算法,模拟了鱼群在寻找食物和逃避危险时的集体行为.它是一种全局优化算法,适用于解决多种优化问题.在本文中,我们将 ...

  4. 【路径规划-TSP问题】基于蚁群算法求解旅行商问题含Matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  5. MATLAB人工蜂群算法求解超市物流配送选址问题代码实例

    MATLAB人工蜂群算法求解超市物流配送选址问题代码实例 MATLAB人工蜂群算法求解超市物流配送选址问题代码实例 人工蜂群算法编程问题实例: 在范围为(0,0)到(100,100)的矩形区域内,散布 ...

  6. MATLAB人工蜂群算法求解数据拟合和多参数优化问题代码实例

    MATLAB人工蜂群算法求解数据拟合和多参数优化问题代码实例 MATLAB人工蜂群算法求解数据拟合和多参数优化问题代码实例 1.基本概念 人工蜂群算法是模仿蜜蜂行为提出的一种优化方法,是集群智能思想的 ...

  7. 【RF分类】基于matlab随机森林算法数据分类【含Matlab源码 2048期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[RF分类]基于matlab随机森林算法数据分类[含Matlab源码 2048期] 获取代码方式2: 付费专栏Matlab智能算法神经网络 ...

  8. Python基于Opencv的鱼群密度速度检测系统(源码&教程)

    1.研究背景 智慧渔业是大数据.物联网与人工智能等现代信息技术驱动下的渔业发展新模式,是水产养殖业供给侧结构性改革的重要方式,涉及养殖环境监测.生物环境监测与生物状态监测这几大方面的应用与需求.本文从 ...

  9. 【Matlab图像加密】正交拉丁方置乱算法图像加解密【含GUI源码 182期】

    一.代码运行视频(哔哩哔哩) [Matlab图像加密]正交拉丁方置乱算法图像加解密[含GUI源码 182期] 二.matlab版本及参考文献 一.代码运行视频(哔哩哔哩) [Matlab图像处理]自动 ...

  10. 粒子群算法求解带约束优化问题 源码实现

    算法原理 之前求解的无约束的问题. 粒子群算法求解无约束优化问题 源码实现 算法原理如下 今天讲解下求解约束优化的问题.该问题常用的方法是罚函数法.即如果一个解x不满足约束条件,就对适应度值设置一个惩 ...

最新文章

  1. C#把某个数组的一部分复制到另一个数组中的两种方法:Buffer.BlockCopy和Array.Copy...
  2. ftp linux 服务器 麒麟_阿里云ECS服务器搭建vsftpd
  3. 前缀树(字典树,单词查找树,Trie树)
  4. wifi精灵android版,WiFi精灵安卓版
  5. 可视化神经网络实验报告,可视化神经网络工具
  6. UWP 应用通知Notifications
  7. java qq验证_用Java代码来校验QQ号
  8. 安卓自定义悬浮按钮实现
  9. 如何快速用密钥登录服务器
  10. 初探 sort 方法和 sorted 内置函数
  11. 一、自定义一个竖直Layout
  12. win10打开语言服务器,在 Windows 10 中,部署一个 Go 1.13 语言的本地文档浏览 web 服务器的流程(已缺少 godoc.exe)...
  13. 微信小程序云音乐项目
  14. 主机防病毒攻略之勒索病毒
  15. 来了, 微信又双叒叕更新
  16. 华为一、二、三面面经
  17. 遥感中的表观反射率、反射率、反照率等之间的区别与联系
  18. TensorFlow学习笔记--Deep Dream模型
  19. 区块链不是神医,却能治疗医疗痼疾
  20. Selenium+Request+Beautifulsoup(周杰伦,林俊杰歌词爬取)

热门文章

  1. 广义线性模型(GLM, Generalized Linear Model)
  2. 在WPF控件上添加Windows窗口式调整大小行为
  3. Codeforces 15C Industrial Nim 简单的游戏
  4. 学习数据库必须掌握的54条SQL查询语句
  5. 20190903每日一句
  6. 黑马 Python学习笔记之第一个 Python 程序
  7. Atitit.pagging  翻页功能解决方案专题 与 目录大纲 v3 r44.docx
  8. Atitit.软件开发概念说明--io系统区--特殊文件名称保存最佳实践文件名称编码...filenameEncode
  9. paip.java c++得到当前类,方法名称以及行号
  10. paip.java 以及JavaScript (js) 的关系以及区别