【TSP问题】基于人工鱼群算法求解TSP问题matlab 源码

132 阅读1分钟

1 模型介绍

2 部分代码

clear
clc
 
tic                                                                 %开始计时
 
[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_gen
    for i=1:FishNum
        [Xinext,flag]= AF_movestrategy(currX,i,D,Visual,deta,trynumber);
        currX(i,:)=Xinext;
    end
    currY=AF_foodconsistence(currX,D);
    [Ymin,index]=min(currY);
    if Ymin<besty
        besty=Ymin;
        bestx=currX(index,:);
        BestY(gen)=besty;
        BestX(gen,:)=bestx;
    else
        BestY(gen)=BestY(gen-1);
        BestX(gen,:)=BestX(gen-1,:);
    end
    disp(['第',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:trynumber
    while(1)
        DJ=floor(rand*Visual)+1;    %不相同的字段数
        if(DJ>0 && DJ<=Visual)         %在视野范围内
            break;
        end
    end
    while(1)
         S(1)=floor(rand*CityNum)+1;
         if(S(1)>1 && S(1)<=CityNum)  %在所有城市里
            break;
         end
    end
    p=1;
    while(p<DJ)
       t=floor(rand*CityNum)+1;
       if(t>1&&t<=CityNum && sum(S==t)==0)
           p=p+1;
           S(p)=t;
       end
   end
   Xi=X(i,:);
   t=Xi(S(1));
   for k=1:DJ-1
       Xi(S(k))=Xi(S(k+1));
   end

3 运行结果

在这里插入图片描述在这里插入图片描述

4 参考文献

[1]胡孟杰. TSP问题的人工鱼群解决方案[J]. 中国科技信息, 2009(11):42-43.

部分理论引用网络文献,若有侵权联系博主删除。

5 MATLAB代码与数据下载地址

见博客主页