【优化求解】人工鱼群算法求解梯级水库优化调度【Matlab 349期】

一、简介

1.1 觅食行为
  指鱼循着食物多的方向游动的一种行为,人工鱼X i X_iXi​在其视野内随机选择一个状态X j X_jXj​,分别计算它们的目标函数值进行比较,如果发现Y j Y_jYj​比Y i Y_iYi​优(Y j Y_jYj​和Y i Y_iYi​分别为X j X_jXj​和X i X_iXi​的适应度值),则Xi向Xj的方向移动一步;否则,X i X_iXi​继续在其视野内选择状态X j X_jXj​,判断是否满足前进条件,反复尝试t r y n u m b e r trynumbertrynumber次后,仍没有满足前进条件,则随机移动一步使X i X_iXi​到达一个新的状态。表达式如下:
X j = X i + r a n d ( ) ∗ v i s u a l (1) X_j=X_i+rand()*visual \tag{1}Xj​=Xi​+rand()∗visual(1)                
X n e x t = X i + r a n d ( ) ∗ s t e p ∗ X j − X i ∣ ∣ X j − X i ∣ ∣ (2) X_{next}=X_i+rand()step\frac{X_j-X_i}{\left | \left | X_j-X_i \right | \right |}\tag{2}Xnext​=Xi​+rand()∗step∗∣∣Xj​−Xi​∣∣Xj​−Xi​​(2)
X n e x t = X i + r a n d ( ) ∗ s t e p (3) X_{next}=X_i+rand()*step \tag{3}Xnext​=Xi​+rand()∗step(3)                
  其中rand()是介于0和1之间的随机数。
在这里插入图片描述
人 工 鱼 的 视 觉 描 述 人工鱼的视觉描述人工鱼的视觉描述
  框架图如下所示:
在这里插入图片描述
伪代码段如下:

for i = 1:N
	for j = 1:Try_number
        Xj=x(i)+Visual.*rand();%人工鱼Xi按式(1)在其视野内随机选择一个状态Xj
        if f(Xj)<f(x(i))	   %比较Xj和Xi的适应度
            X_next= x(i)+rand()*step*(Xj-x(i))/norm(Xj-x(i)); %人工鱼Xi按式(2)朝着Xj方向移动一步,norm()函数表示二范数 
            break;
        else
        	X_next=x(i)+step*rand();
        end
    end
end

1.2 聚群行为

鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群 。人工鱼X i X_iXi​搜索其视野内(d i j < v i s u a l d_{ij}<visualdij​<visual)的伙伴数目n f n_fnf​及中心位置X c X_cXc​,若Y c / n f < δ Y i Y_c/n_f< δY_iYc​/nf​<δYi​(求极小值时使用小于号,在求极大值时则相反;Y c Y_cYc​和Y i Y_iYi​分别为X c X_cXc​和X i X_iXi​的适应度值),表明伙伴中心位置状态较优且不太拥挤,则X i X_iXi​朝伙伴的中心位置移动一步,否则执行觅食行为;
  框架图如下所示:
在这里插入图片描述
伪代码段如下:

nf=0;X_inside=0;
for i = 1:N
    for j = 1:N   
        if norm(x(j)-x(i))<Visual 		% 求人工鱼Xi与其他人工鱼之间的距离
            nf = nf+1;                  %统计在视野范围内的鱼数量   
            X_inside= X_inside+x(j);    %将视野范围内的鱼进行累加
        end
         X_inside=X_inside-x(i);  		%需要去除Xi本身;因为在 一开始计算时,i=j,把中心的鱼也进行了一次计算
         nf=nf-1;   
         Xc = X_inside/nf; 				%此时Xc表示Xi感知范围其他伙伴的中心位置; 
         if  f(Xc)/nf < δ*f(x(i))
            x_next=x(i)+rand*Step*(Xc-x(i))/norm(Xc-x(i)); 
         else
             进行觅食行动
         end
    end
end

1.3 追尾行为

指鱼向其视野区域内的最优方向移动的一种行为。人工鱼X i X_iXi​搜索其视野内(d i j < v i s u a l d_{ij}<visualdij​<visual)适应度最高的个体X j X_jXj​,其适应度值为Y j Y_jYj​,并探索人工鱼X j X_jXj​视野内的伙伴数目n f n_fnf​,若Y j / n f < δ Y i Y_j/n_f< δY_iYj​/nf​<δYi​,表明X j X_jXj​状态较优且不太拥挤,则X i X_iXi​朝X j X_jXj​位置移动一步,否则执行觅食行为;
  框架图如下所示:
在这里插入图片描述
伪代码段如下:

Y_max=inf;nf=0;
for i = 1:N    
    %搜索人工鱼Xi视野范围内的最高适应度个体Xj
    for j = 1:N     
        if norm(x(j)-x(i))<Visual && f(x(j))<Y_max		% 求人工鱼Xi与其他人工鱼之间的距离
            X_max=x(j);        
            Y_max=f(x(j));
        end
    end
    %搜索人工鱼Xj视野范围内的伙伴数量
    for j = 1:N        
        if(norm(x(j)-X_max)<Visual)       
            nf=nf+1;
        end
    end
    nf=nf-1;%去掉他本身
    if Y_max/nf<delta*f(x(i))
        x_next= x(i,:)+rand*Step.*(temp_maxX-x(i,:))./norm(temp_maxX-x(i,:));
    else
        进行觅食行为;
    end
end

1.4 算法总述

综上所述,算法在运算过程中,会同时进行聚群和追尾行为。而觅食行为属于这两种行为中发现聚群对象或者追尾对象附近拥挤度过大时,人工鱼选择的行为方式,若在觅食过程中,未发现比自身适应度高的人工鱼,则按步长step随机移动。最后对聚群行为和追尾行为得到的适应度值进行比较,选择优秀的人工鱼作为下一代的个体。其总框架图如下:
在这里插入图片描述
3 分析拥挤度因子δ δδ
3.1 拥挤度因子的取值

在求极小值问题中:δ = α n m a x , α ∈ ( 0 , 1 ] δ=αn_{max}, α∈(0,1]δ=αnmax​,α∈(0,1]
  在求极大值问题中:δ = 1 α n m a x , α ∈ ( 0 , 1 ] δ=\frac{1}{αn_{max}},α∈(0,1]δ=αnmax​1​,α∈(0,1]
  其中α αα为极值接近水平,n m a x n_{max}nmax​为期望在该邻域内聚集的最大人工鱼数目。

3.2 拥挤度因子的作用机理

对追尾行为的描述
在这里插入图片描述
图中af0为人工鱼af1-5在各自视野内的最优人工鱼,其实物浓度为Y j Y_jYj​,C1为以af0为圆心,以视野范围为半径的圆,即能探知af0的最远距离,人工鱼越靠近af0,状态越优。
  求极大值情况下:当δ n f ≤ 1 δn_f\leq 1δnf​≤1时,所有人工鱼af1-5都执行追尾行为,向af0游动;
δ = 1 α n m a x δ=\frac{1}{αn_{max}}δ=αnmax​1​
δ n f = n f α n m a x ≤ 1 δn_f =\frac{n_f}{αn_{max}}\leq 1δnf​=αnmax​nf​​≤1
  当α αα=1的时候,可以明显看出来n f ≤ n m a x n_f \leq n_{max}nf​≤nmax​,即说明人工鱼视野范围内不拥挤。

当δ n f > 1 δn_f >1δnf​>1时,若C2的食物浓度为Y j δ n f \frac{Y_j}{δn_f }δnf​Yj​​的等浓度食物圈,则C2与C1间的人工鱼af1、af2、af3执行追尾行动,向af0游动,人工鱼af4、af5执行觅食行为。此时δnf 越大执行追尾行动的人工鱼越少,反之越多。

3.2 拥挤度因子的影响

以极大值为例(极小值的情况正好和极大值相反), δ δδ越大,表明允许的拥挤程度越小,人工鱼摆脱局部最优的能力越强;但是收敛的速度会有所减缓,这主要因为人工鱼在逼近极值的同时,会因避免过分拥挤而随机走开或者受其它人工鱼的排斥作用,不能精确逼近极值点。可见,δ δδ的引入避免了人工鱼过度拥挤而陷入局部极值,另一方面,该参数会使得位于极值点附近的人工鱼之间存在相互排斥的影响,而难以向极值点精确逼近,所以,对于某些局部极值不是很严重的具体问题,可以忽略拥挤的因素,从而在简化算法的同时也加快了算法的收敛速度和提高结果的精确程度。

二、源代码

%人工鱼群算法  梯级水库调度
tic
clear all
clc
format long
Visual=2.5;
Step=0.3;
N=100; %50条鱼
Try_number=100;%觅食时做50次搜索
d=[];
h=1e-1;    
Friend_number=50;
a=[977,977,977,977,977,977,977,957,977,970,977,977];         %%[898,898,898,898,898,898,893,892,892,898,898,898];
b=[970,970,970,970,952,952,952,952,952,952,970,970];         %%[888,888,888,888,888,893,888,888,888,888,888,888];
k=0; %最外围变量,m为其上限,控制循环次数
m=50;
X1=rand(N,1)*(a(1)-b(1))+b(1);    
X2=rand(N,1)*(a(2)-b(2))+b(2);    
X3=rand(N,1)*(a(3)-b(3))+b(3);   
X4=rand(N,1)*(a(4)-b(4))+b(4);   
X5=rand(N,1)*(a(5)-b(5))+b(5);   
X6=rand(N,1)*(a(6)-b(6))+b(6);   
X7=rand(N,1)*(a(7)-b(7))+b(7);   
X8=rand(N,1)*(a(8)-b(8))+b(8);    
X9=rand(N,1)*(a(9)-b(9))+b(9);    
X10=rand(N,1)*(a(10)-b(10))+b(10);
X11=rand(N,1)*(a(11)-b(11))+b(11);
X12=rand(N,1)*(a(12)-b(12))+b(12);
X=[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12];%人工鱼数量50,一行24个向量为一条鱼
for i=1:N
wwww=[X(i,1),X(i,2),X(i,3),X(i,4),X(i,5),X(i,6),X(i,7),X(i,8),X(i,9),X(i,10),X(i,11),X(i,12)];  %www为所有鱼的全体,一行24个值,总共50d(i)=maxf(wwww);   
end
[w,i]=max(d);  
maxX=[X(i,1),X(i,2),X(i,3),X(i,4),X(i,5),X(i,6),X(i,7),X(i,8),X(i,9),X(i,10),X(i,11),X(i,12)]; 
       
maxY=w;  %初始公告板记录 w即为最大函数值
figurex1=[];figurex2=[];figurex3=[];figurex4=[];figurex5=[];figurex6=[];figurex7=[];figurex8=[];figurex9=[];figurex10=[];figurex11=[];figurex12=[]; 
figurez=[];            
figurex1(numel(figurex1)+1)=maxX(1);  %figurex1(numel(figurex1)+1)即为figurex1(1),也即X(i,1),同14figurex2(numel(figurex2)+1)=maxX(2);   
figurex3(numel(figurex3)+1)=maxX(3);figurex4(numel(figurex4)+1)=maxX(4);figurex5(numel(figurex5)+1)=maxX(5);figurex6(numel(figurex6)+1)=maxX(6);
figurex7(numel(figurex7)+1)=maxX(7);figurex8(numel(figurex8)+1)=maxX(8);figurex9(numel(figurex9)+1)=maxX(9);figurex10(numel(figurex10)+1)=maxX(10);
figurex11(numel(figurex11)+1)=maxX(11);figurex12(numel(figurex12)+1)=maxX(12);
figurez(numel(figurez)+1)=maxY;     %函数最大值
kkk=0;
for p=1:3
while(k<m)
    for i=1:N  %一次一条鱼进行  
    XX=[X(i,1),X(i,2),X(i,3),X(i,4),X(i,5),X(i,6),X(i,7),X(i,8),X(i,9),X(i,10),X(i,11),X(i,12)];
        
    nf=0;
    Xc=0;
    for j=1:N  %聚群行为开始
       XXX=[X(j,1),X(j,2),X(j,3),X(j,4),X(j,5),X(j,6),X(j,7),X(j,8),X(j,9),X(j,10),X(j,11),X(j,12)];
       if(norm(XXX-XX)<Visual)   
       nf=nf+1;
       Xc=Xc+XXX;
       end
    end
    Xc=Xc/nf;  %鱼群中心位置
   if((maxf(Xc))>maxf(XX))
        XXnext1=XX+rand*Step*(Xc-XX)/norm(Xc-XX);
        XXnext1=xianzhi(XXnext1);
   else
       XXnext1=gmjprey(XX,Try_number,Visual,Step); %觅食
       XXnext1=xianzhi(XXnext1);
   end%聚群行为结束
   %maxX=XX;%追尾行为开始,追尾初始位置仍为xx和聚群一样的,同第35%maxY=maxf(XX);
   for j=1:Friend_number
     XXX=[X(j,1),X(j,2),X(j,3),X(j,4),X(j,5),X(j,6),X(j,7),X(j,8),X(j,9),X(j,10),X(j,11),X(j,12)];
     if(norm(XXX-XX)<Visual & maxf(XXX)>maxY)
         maxX=XXX;
         maxY=maxf(XXX); %此时maxf为Friend_number中的最大值
     end
   end
   if((maxY)>maxf(XX))
       XXnext2=XX+rand*Step*(maxX-XX)/norm(maxX-XX); 
       XXnext2=xianzhi(XXnext2);
   else
      XXnext2 =gmjprey(XX,Try_number,Visual,Step);%觅食
      XXnext2=xianzhi(XXnext2);
   end%追尾行为结束
   if(maxf(XXnext1)>maxf(XXnext2)) %聚群与追尾进行对比
     for j=1:12
     X(i,j)=XXnext1(j);
     end
     %%%%%%%%%%%%%%%%% 每月来水量,丰水年情况
qwan=[ 313 	363 	587 	493 	263 	309 	699 1110 	1134 	808 	486 	325 ];
%qwan=[402,352,702,457,227,432,418,1040,795,544,373,405]; 
%qwan=[598.21,699.12,564.58,667.52,195.60,195.60,195.60,946.89,3235.13,1505.35,951.89,730.58]; %丰水年
%qwan=[167.16,176.81,378.46,317.67,286.8,286.8,1061.56,1312.18,918.52,768.25,500.99,250.13];%平水年
%qwan=[332.3,295.18,664.44,365.42,26.15,45.32,122.58,950.26,622.13,141.65,236.98,334.18];%枯水年
%%%%%%%%%%%%%%% 每月来水,丰水年情况
qwl=[0,0,0,0,0,0,0,0,0,0,0,0];  %上下游水库区间流量w代表万家寨,l代表龙口

%%%%%%%%%%%%每月小时数
t(1)=31*24; t(3)= t(1); t(5)= t(1);
t(5)= t(1); t(7)= t(1); t(8)= t(1);
t(10)= t(1); t(12)= t(1);
t(2)=28*24;
t(4)=30*24; t(6)= t(4);t(9)= t(4);t(11)= t(4);

%-------------------------------------------------

     for j=1:12        %%%%%%% 水位推求库容
        if 952<=x(j)<955
            vw(j)=(4.508+(x(j)-952)/(955-952)*(4.548-4.508))*10^8;  %vw(j)上游水位对应的库容
        elseif 955<=x(j)<957
            vw(j)=(4.548+(x(j)-955)/(957-955)*(4.739-4.548))*10^8;
        elseif 957<=x(j)<960
            vw(j)=(4.739+(x(j)-957)/(960-957)*(4.936-4.739))*10^8;
        elseif 960<=x(j)<965
            vw(j)=(4.936+(x(j)-960)/(965-960)*(5.546-4.936))*10^8;
        elseif 965<=x(j)<970
            vw(j)=(5.546+(x(j)-965)/(970-965)*(7.756-6.563))*10^8;
        elseif 975<=x(j)<977.5
            vw(j)=(7.756+(x(j)-975)/(977.5-975)*(8.35-7.756))*10^8;
        elseif 977.5<=x(j)<980
            vw(j)=(8.35+(x(j)-977.5)/(980-977.5)*(8.962-8.35))*10^8;
        end
     end
 
             
     for j=1:11    %%%%%%%%%%%%%%% 下泄流量推水位
         qxw(j)=qwan(j)-(vw(j+1)-vw(j))/(t(j)*3600); % qxw(j)为出库流量
     end
         qxw(12)=qwan(12)-(vw(1)-vw(12))/(t(12)*3600);  %vw(13)=vw(1)
     %%%%%%%%%%%%%%%%%%%%%%%%%% 下泄流量水位关系
     for j=1:12
         if 0<=qxw(j)<85
             hxw(j)=898+(qxw(j)-0)/(85-0)*(899-898);  %下游流量对应的水位
         elseif 85<=qxw(j)<174
             hxw(j)=899+(qxw(j)-85)/(174-85)*(900-899);
         elseif 174<=qxw(i)<286
             hxw(j)=900+(qxw(j)-174)/(286-174)*(901-900);
         elseif 286<=qxw(j)<571
             hxw(j)=901+(qxw(j)-286)/(571-2860)*(902-901);
         elseif 571<=qxw(j)<878
             hxw(j)=902+(qxw(j)-571)/(878-571)*(903-902);
         elseif 878<=qxw(j)<1320
             hxw(j)=903+(qxw(j)-878)/(1320-878)*(904-903);
         elseif 1320<=qxw(j)<1860
             hxw(j)=904+(qxw(j)-1320)/(1860-1320)*(905-904);
         elseif 1860<=qxw(j)<2480
             hxw(j)=905+(qxw(j)-1860)/(2480-1860)*(906-905);
         end

三、运行结果

在这里插入图片描述

四、备注

完整代码或者代写添加QQ912100926
往期回顾>>>>>>
【优化求解】粒子群算法之充电站最优布局【Matlab 061期】
【优化求解】遗传算法之多旅行商问题【Matlab 062期】
【优化求解】遗传和模拟退火之三维装箱问题【Matlab 063期】
【优化求解】遗传算法之求最短路径【Matlab 064期】
【优化求解】粒子群之优化灰狼算法【Matlab 065期】
【优化求解】多目标之灰狼优化算法MOGWO 【Matlab 066期】
【优化求解】遗传算法之求解优化车辆发车间隔【Matlab 067期】
【优化求解】磷虾群算法简介【Matlab 068期】
【优化求解】差分进化算法简介【Matlab 069期】
【优化求解】约束优化之惩罚函数法简介【Matlab 070期】
【优化求解】改进灰狼算法之求解重油热解模型【Matlab 072期】
【优化求解】蚁群算法之配电网故障定位【Matlab 073期】
【优化求解】遗传算法之求解岛屿物资补给优化问题【Matlab 137期】
【优化求解】基于matlab冠状病毒群体免疫优化算法(CHIO)【Matlab 138期】
【优化求解】基于matlab之金鹰优化求解算法(GEO)【Matlab 139期】
【优化求解】基于GUI界面之BP神经网络优化求解【Matlab 179期】
【优化求解】基于GUI界面之遗传算法优化求解【Matlab 180期】
【优化求解】基于GUI界面之蚁群算法优化求解【Matlab 181期】
【优化求解】 免疫算法之数值逼近优化分析【Matlab 182期】
【优化求解】 启发式算法之函数优化分析【Matlab 183期】
【优化求解】改进的遗传算法(GA+IGA)之城市交通信号优化【Matlab 184期】
【优化求解】改进的遗传算法GA之城市交通信号优化【Matlab 185期】
【优化求解】改进的遗传算法IGA之城市交通信号优化【Matlab 186期】
【优化求解】罚函数的粒子群算法之函数寻优【Matlab 187期】
【优化求解】细菌觅食算法之函数优化分析【Matlab 188期】
【优化求解】引力搜索算法之函数优化分析【Matlab 189期】
【优化求解】蚁群算法之函数优化分析【Matlab 190期】
【优化求解】多元宇宙优化算法【Matlab 191期】
【优化求解】飞蛾扑火算法(MFO)【Matlab 192期】
【优化求解】实现电动汽车有序充电【Matlab 294期】
【优化求解】粒子群的智能微电网多目标优化算法【Matlab 295期】
【优化求解】PSO货物配装问题最优化【Matlab 296期】

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页