果蝇优化算法-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。

寻找极小值:

%清空运行环境clcclear%随机初始果蝇群体位置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)以求出该果蝇个体位置的味道浓度SmellSmell(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:sizepopX(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<SmellbestX_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);
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

寻找极大值:

% 清空运行环境 。clcclear% 随机初始果蝇群体位置 。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:sizepopX(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>SmellbestX_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);
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

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

%清空clcclear%随机初始果蝇群体位置X_axis=10*rand();Y_axis=10*rand();%设置参数maxgen=100; %迭代次数sizepop=20; %种群规模kkk=0;%种群寻优开始,利用嗅觉寻找食物for i=1:sizepopfor 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:2X(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 bestSmellkkk=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);
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
           

猜你喜欢

转载自blog.csdn.net/qq_44906603/article/details/89246729