MATLAB中果蝇味道浓度判定函数,果蝇优化算法-matlab实现、过程剖析

1.随机初始果蝇群体位置。

Init X_axis

Init Y_axis

2.附与果蝇个体利用嗅觉搜寻食物之随机方向与距离。

Xi= X_axis + Random Value

Yi= Y_axis + Random Value

3.由于无法得知食物位置,因此先估计与原点之距离(Dist),再计算

味道浓度判定值(S),此值为距离之倒数。

Disti=√(X_i^2+Y_i^2 );Si=1/Disti

4.味道浓度判定值(S)代入味道浓度判定函数(或称为 Fitness function)

以求出该果蝇个体位置的味道浓度(Smelli)。

Smelli = Function(Si)

5.找出此果蝇群体的中味道浓度最高的果蝇(求极大值)

[bestSmell bestIndex] = max(Smell)

6.保留最佳味道浓度值与 x、y 坐标,此时果蝇群体利用视觉往该位

置飞去。

Smellbest = bestSmell

X_axis = X(bestIndex)

Y_axis = Y(bestIndex)

最后:进入迭代寻优,重复执行步骤 2-5,并判断味道浓度是否优于前一

迭代味道浓度,若是则执行步骤 6。

寻找极小值:

%清空运行环境

clc

clear

%随机初始果蝇群体位置

X_axis=10*rand();

Y_axis=10*rand();

maxgen=100; %迭代次数

sizepop=20; %种群规模

%果蝇寻优开始

for i=1:sizepop

%附与果蝇个体利用嗅觉搜寻食物之随机方向与距离

X(i)=X_axis+2*rand()-1;

Y(i)=Y_axis+2*rand()-1;

%由于无法得知食物位置,因此先估计与原点之距离(Dist),再计算味道浓度判定值(S),此值为距离之倒数

D(i)=(X(i)^2+Y(i)^2)^0.5;

S(i)=1/D(i);

%味道浓度判定值(S)代入味道浓度判定函数(或称为Fitness function)以求出该果蝇个体位置的味道浓度Smell

Smell(i)=10+S(i)^2;

end

%找出此果蝇群体的中味道浓度最低的果蝇(求极小值)。

[bestSmell bestindex]=min(Smell);

%保留最佳味道浓度值与x、y 坐标,此时果蝇群体利用视觉往该位置飞去。

X_axis=X(bestindex);

Y_axis=Y(bestindex);

Smellbest=bestSmell;

%果蝇迭代寻优开始

for g=1:maxgen

%附与果蝇个体利用嗅觉搜寻食物之随机方向与距离。

for i=1:sizepop

X(i)=X_axis+2*rand()-1;

Y(i)=Y_axis+2*rand()-1;

%由于无法得知食物位置,因此先估计与原点之距离(Dist),再计算味道浓度判定值(S),此值为距离之倒数。

D(i)=(X(i)^2+Y(i)^2)^0.5;

S(i)=1/D(i);

%判定值(S)代入判定函数以求出该果蝇位置的味道浓度(Smelli)。

Smell(i)= 10+S(i)^2;

end

%找出此果蝇群体的中味道浓度最低的果蝇(求极小值)。

[bestSmell bestindex]=min(Smell);

%判断味道浓度是否优于前一迭代味道浓度,若是则保留最佳味道浓度值与x、y 坐标,此时果蝇群体利用视觉往该位置飞去。

if bestSmell

X_axis=X(bestindex);

Y_axis=Y(bestindex);

Smellbest=bestSmell;

end

%每代最优Smell值纪录到yy 数组中,并记录最优迭代坐标

yy(g)=Smellbest;

Xbest(g)=X_axis;

Ybest(g)=Y_axis;

end

%绘制迭代味到浓度与果蝇飞行路径趋势图

figure(1)

plot(yy)

title('Optimization process','fontsize',12)

xlabel('Iteration Number','fontsize',12);

ylabel('Smell','fontsize',12);

figure(2)

plot(Xbest,Ybest,'b.');

title('Fruit fly flying route','fontsize',14)

xlabel('X-best','fontsize',12);

ylabel('Y-best','fontsize',12);

寻找极大值:

% 清空运行环境 。

clc

clear

% 随机初始果蝇群体位置 。

X_axis=10*rand();

Y_axis=10*rand();

%设置参数

maxgen=100; %迭代次数

sizepop=100; %种群规模

%果蝇寻优开始

for i=1:sizepop

%附与果蝇个体利用嗅觉搜寻食物之随机方向与距离

X(i)=X_axis+2*rand()-1;

Y(i)=Y_axis+2*rand()-1;

%由于无法得知食物位置,因此先估计与原点之距离D,再计算味道浓度判定值(S),此值为距离之倒数

D(i)=((X(i)-1)^2+Y(i)^2)^0.5;

S(i)=1/D(i);

% 味道浓度判定值 (S) 代入味道浓度判定函数( ( 或称为 Fitness function)以求出 该果蝇个体位置的味道浓度 (Smelli) 。

Smell(i)=8-S(i)^2+2*S(i);

end

%找出此果蝇群体的中味道浓度最高的果蝇(求极大值)

[bestSmell bestindex]=max(Smell);

%保留最佳味道浓度值与 x x 、y y 坐标 , 此时果蝇群体利用视觉往该位置飞去 。

X_axis=X(bestindex);

Y_axis=Y(bestindex);

Smellbest=bestSmell;

%果蝇迭代寻优开始

for g=1:maxgen

%附与果蝇个体利用嗅觉搜寻食物之随机方向与距离

for i=1:sizepop

X(i)=X_axis+2*rand()-1;

Y(i)=Y_axis+2*rand()-1;

%*** 由于无法得知食物位置, 因此先估计与原点之距离 (Dist),再计算味道浓度判定值 (S),此值为距离之倒数

D(i)=(X(i)^2+Y(i)^2)^0.5;

S(i)=1/D(i);

%判定值 (S) 代入判定函数以求出该果蝇位置的味道浓度 (Smelli) 。

Smell(i)=8-S(i)^2+2*S(i);

end

%找出此果蝇群体的中味道浓度最高的果蝇( 求极大值)

[bestSmell bestindex]=max(Smell);

%判断味道浓度是否优于前一迭代味道浓度, 若是则保留最佳味道浓度值与 x x 、y y 坐标 , 此时果蝇群体利用视觉往该位置飞去 。

if bestSmell>Smellbest

X_axis=X(bestindex);

Y_axis=Y(bestindex);

Smellbest=bestSmell;

end

%每代最优 smell值纪录到数组中,并记录最优迭代坐标

yy(g)=Smellbest;

Xbest(g)=X_axis;

Ybest(g)=Y_axis;

end

%绘制迭代味到浓度与果蝇飞行路径趋势图

figure(1)

plot(yy)

title('Optimization process','fontsize',12)

xlabel('Iteration Number','fontsize',12);

ylabel('Smell','fontsize',12);

figure(2)

plot(Xbest,Ybest,'b.');

title('Fruit fly flying route','fontsize',14)

xlabel('X-best','fontsize',12);

ylabel('Y-best','fontsize',12);

下面给出一个难以求出极小值的函数:

%清空

clc

clear

%随机初始果蝇群体位置

X_axis=10*rand();

Y_axis=10*rand();

%设置参数

maxgen=100; %迭代次数

sizepop=20; %种群规模

kkk=0;

%种群寻优开始,利用嗅觉寻找食物

for i=1:sizepop

for j=1:2

%附与果蝇个体利用嗅觉搜寻食物之随机方向与距离

X(i,j)=X_axis+2*rand()-1;

Y(i,j)=Y_axis+2*rand()-1;

%由于无法得知食物位置,因此先估计与原点之距离(Dist),再计算味道浓度判定值(S),此值为距离之倒数

D(i,j)=(X(i,j)^2+Y(i,j)^2)^0.5;

S(i,j)=1/D(i,j);

end

%味道浓度判定值(S)代入味道浓度判定函数(或称为Fitness function)以求出该果蝇个体位置的味道浓度

Smell(i)=0.5+(sin((S(i,1)^2+S(i,2)^2)^0.5)^2-0.5)./(1+0.001*(S(i,1)^2+S(i,2)^2))^2;

end

%找出此果蝇群体中味道浓度最低的果蝇(求极小值)

[bestSmell bestindex]=min(Smell);

%保留最佳味道浓度值与x,y坐标,此时果蝇群体利用视觉往该位置飞去

X_axis=X(bestindex);

Y_axis=Y(bestindex);

Smellbest=bestSmell;

%果蝇迭代寻优开始

for g=1:maxgen

%附与果蝇个体利用嗅觉搜寻食物之随机方向与距离

for i=1:sizepop

%附与果蝇个体利用嗅觉搜寻食物之随机方向与距离

for j=1:2

X(i,j)=X_axis+2*rand()-1;

Y(i,j)=Y_axis+2*rand()-1;

%由于无法得知食物位置,因此先估计与原点之距离(Dist),再计算味道浓度判定值(S),此值为距离之倒数

D(i,j)=(X(i,j)^2+Y(i,j)^2)^0.5;

S(i,j)=1/D(i,j);

end

%味道浓度判定值(S)代入味道浓度判定函数(或称为Fitness function)以求出该果蝇个体位置的味道浓度

Smell(i)=0.5+(sin((S(i,1)^2+S(i,2)^2)^0.5)^2-0.5)./(1+0.001*(S(i,1)^2+S(i,2)^2))^2;

end

%找出此果蝇群体中味道浓度最低的果蝇(求极小值)

[bestSmell bestindex]=min(Smell);

%判断味道浓度是否优于前一迭代味道浓度,若是则保留最佳味道浓度值与x,y坐标,此时果蝇群体利用视觉往该位置飞去

if bestSmell

kkk=kkk+1;

X_axis=X(bestindex);

Y_axis=Y(bestindex);

Smellbest=bestSmell;

end

%每代最优Smell值记录到yy数组中,并记录最优迭代坐标

yy(g)=Smellbest;

Xbest(g)=X_axis;

Ybest(g)=Y_axis;

end

%绘制迭代味道浓度与果蝇飞行路径趋势图

figure(1)

plot(yy)

title('Optimization process','fontsize',12)

xlabel('Iteration Number','fontsize',12);

ylabel('Smell','fontsize',12);

figure(2)

plot(Xbest,Ybest,'b');

title('Fruit flying toute','fontsize',14)

xlabel('X-best','fontsize',12);

ylabel('Y-best','fontsize',12);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值