📄 main.m
字号:
clear;
tic %开始记时
FishNum=10;%生成10只人工鱼
Max_gen=50;%最多迭代次数
trynumber=100;%最多试探次数
Visual=6;%感知距离
deta=0.8;% 拥挤度因子
CityPosition=[16.47,96.10;%从上到下,依次是14个城市的坐标,每一行一个城市。
16.47,94.44;
20.09,92.54;
22.39,93.37;
25.23,97.24;
22.00,96.05;
20.47,97.02;
17.20,96.29;
16.30,97.38;
14.05,98.12;
16.53,97.38;
21.52,95.59;
19.41,97.13;
20.09,92.55];
CityNum=length(CityPosition);%城市个数
DNAN=100; %同一个城市之间的距离定义为无穷大
for i=1:CityNum %算出每条边的长度
edge(i,i)=DNAN;
for j=i+1:CityNum
edge(i,j)=sqrt(sum((CityPosition(i,:)-CityPosition(j,:)).^2));
edge(j,i)=edge(i,j);
end
end
for i=1:FishNum %对所有人工鱼进行初始化
X(i,:)=Inital(CityNum);
end
Best=1000;
for NC=1:Max_gen
Besty(NC)=1000;
for i=1:FishNum
[Xi,flag1]=follow(X,FishNum,Visual,deta,i,edge);%首先偿试追尾
if(flag1==0) %追尾失败
Visual2=floor(Visual*(1-NC/Max_gen));
[Xi,flag2]=prey(X,CityNum,i,Visual,trynumber,edge);%再偿试觅食
if(flag2==0) %觅食失败
[Xi,flag3]=swarm(X,FishNum,CityNum,Visual,deta,i,edge);%再偿试聚群
if(flag3==0)%聚群失败
Xi=X(i,:);%无奈,静止不动,这是对算法的一个改进
end
end
end
X(i,:)=Xi;
Yi=evaluate(Xi,edge);
if(Yi<Besty(NC))
Besty(NC)=Yi;%每次最优解
end
if(Yi<Best)
Best=Yi; %全局最优解
Bestpath=Xi;
end
end
disp(['第',num2str(NC),'次迭代,得出的最优值:',num2str(Besty(NC))]);
end
t_train=toc;%结束记时
s=num2str(Bestpath(1));
for i=2:CityNum
s=strcat(s,'->');
s=strcat(s,num2str(Bestpath(i)));
end
s=strcat(s,'->');
s=strcat(s,num2str(Bestpath(1)));
disp(['得出的最优路径:',s,',最优值:',num2str(Best)]);
plot(Besty);
title(['本次运行得到的最优值为',num2str(Best),',共耗时:',num2str(t_train),'秒']);%x,
text(floor(Max_gen/2),44,'最优值随迭代次数变化曲线');
xlabel('迭代次数');
ylabel('最优值');
XC=[1,10,9,11,8,13,7,12,6,5,4,3,14,2];%你给的最优解
y=evaluate(XC,edge);
disp(['你给的最优解:',num2str(XC),' 1,最优值:',num2str(y)]);
disp('最优路径可能不只一条,我给的解可能和你的解刚好逆转,很显然也是对的。不知道你的30.8785是怎么来的(C++么?)');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -