%例 计算函数 f=x1^2+x2^2+...+x9^2+x10^2 的最小值
%***设置参数
%清空运行环境
clc
clear
%初始果蝇群体位置
X_axis=5*rands(1,10);
Y_axis=5*rands(1,10);
maxgen=10000;
%迭代次数
sizepop=50;
%种群规模
yy=zeros(1,maxgen);
Xbest=zeros(maxgen,10);
Ybest=zeros(maxgen,10);
Xmin=zeros(1,10);
%*********果蝇寻优开始
%利用嗅觉寻找食物
for i=1:sizepop
%初始果蝇个体飞行距离
X(i,:)=X_axis+20*rand()-10;
Y(i,:)=Y_axis+20*rand()-10;
%求出与原点之距离
for j=1:10
D(i,j)=(X(i,j)^2+Y(i,j)^2)^0.5;
end
%味道浓度为距离之倒数,先求出味道浓度判定值
for j=1:10
S(i,j)=1/D(i,j);
end
%利用味道浓度判定函数求出味道浓度(类似 Fitness 适应度函数)
x1=S(i,1);
x2=S(i,2);
x3=S(i,3);
x4=S(i,4);
x5=S(i,5);
x6=S(i,6);
x7=S(i,7);
x8=S(i,8);
x9=S(i,9);
x10=S(i,10);
Smell(i)=x1^2+x2^2+x3^2+x4^2+x5^2+x6^2+x7^2+x8^2+x9^2+x10^2;
end
%***根据初始味道浓度值寻找初始极值
[bestSmell bestindex]=min(Smell);
%%利用视觉寻找伙伴聚集味道浓度最高之处
%做法是保留最佳值初始位置及初始味道浓度
X_axis=X(bestindex,:);
Y_axis=Y(bestindex,:);
Smellbest=bestSmell;
%果蝇迭代寻优
for g=1:maxgen
for i=1:sizepop
%由上一代最佳位置处增加果蝇个体飞行距离
X(i,:)=X_axis+20*rand()-10;
Y(i,:)=Y_axis+20*rand()-10;
%求出与原点之距离
for j=1:10
D(i,j)=(X(i,j)^2+Y(i,j)^2)^0.5;
end
%味道浓度为距离之倒数,先求出味道浓度判定值
for j=1:10
S(i,j)=1/D(i,j);
end
%利用味道浓度判定函数求出味道浓度(类似 Fitness 适应度函数)
x1=S(i,1);
x2=S(i,2);
x3=S(i,3);
x4=S(i,4);
x5=S(i,5);
x6=S(i,6);
x7=S(i,7);
x8=S(i,8);
x9=S(i,9);
x10=S(i,10);
Smell(i)=x1^2+x2^2+x3^2+x4^2+x5^2+x6^2+x7^2+x8^2+x9^2+x10^2;
end
%***根据味道浓度值寻找极值
[bestSmell bestindex]=min(Smell);
%***迭代保留最佳值位置与味道浓度
if bestSmell
%每代最优值纪录到 yy 数组中
yy(g)=Smellbest;
Xbest(g,:)=X_axis;
Ybest(g,:)=Y_axis;
end
%相当于解码的过程,将果蝇与原点距离转化为所求问题变量的值
T=zeros(maxgen,10);
for k=1:maxgen
for t=1:10
T(k,t)=1/(sqrt(Xbest(k,t)^2+Ybest(k,t)^2));%解码每代的最优变量
end
end
[fmin,Xmindex]=min(yy);
fmin%最小值
bestx=T(Xmindex,:)%最小值所对应的自变量所对应的值