优化调度基于人工鱼群算法求解梯级水库优化调度matlab源码

Posted Matlab走起

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优化调度基于人工鱼群算法求解梯级水库优化调度matlab源码相关的知识,希望对你有一定的参考价值。

一、 人工鱼的结构模型

人工鱼是真实鱼抽象化、虚拟化的一个实体,其中封装了自身数据和一系列行为,可以接受环境的刺激信息,做出相应的活动。其所在的环境由问题的解空间和其他人工鱼的状态,它在下一时刻的行为取决于自身的状态和环境的状态,并且它还通过自身的活动来影响环境,进而影响其他人工鱼的活动。

 

二、 人工鱼群算法的寻优原理

人工鱼群算法在寻优的过程中,可能会集结在几个局部最优解的周围,使人工鱼跳出局部最优解,实现全局寻优的因素主要有:

  • 觅食行为中重复次数较少时,为人工鱼提供了随机移动的机会,从而可能跳出局部最优解;
  • 随机步长使得人工鱼在前往局部最优解的途中,有可能转向全局最优解;
  • 拥挤度因子 δδ 限制了聚群的规模,使得人工鱼能够更广泛的寻优;
  • 聚群行为能够促使少出陷于局部最优解的人工鱼趋向全局最优解的人工鱼方向聚集,从而逃出局部最优解;
  • 追尾行为加快了人工鱼向更优状态游动。

三、 人工鱼群算法实现的步骤

  1. 初始化设置,包括种群规模N、每条人工鱼的初始位置、人工鱼的视野Visual、步长step、拥挤度因子δ、重复次数Trynumber;
  2. 计算初始鱼群各个体的适应值,取最优人工鱼状态及其值赋予给公告牌;
  3. 对每个个体进行评价,对其要执行的行为进行选择,包括觅食Pray、聚群Swarm、追尾Follow和评价行为bulletin;
  4. 执行人工鱼的行为,更新自己,生成新鱼群;
  5. 评价所有个体。若某个体优于公告牌,则将公告牌更新为该个体;
  6. 当公告牌上最优解达到满意误差界内或者达到迭代次数上限时算法结束,否则转步骤3。

四、人工鱼群算法实现流程图

五、 各种参数对收敛性的影响

人工鱼群算法中,觅食行为奠定了算法收敛的基础;聚群行为增强了算法收敛的稳定性;追尾行为增强了算法收敛的快速性和全局性;其评价行为也对算法收敛的速度和稳定性提供了保障。

人工鱼群算法有5个基本参数:群规模N、人工鱼的视野Visual、步长Step、拥挤度因子δ、重复次数Trynumber。 
1. 视野Visual:由于视野对算法中个行为都有较大影响,因此,它的变化对收敛性能影响也比较复杂。当视野范围较小时,人工鱼的觅食行为和随机行为比较突出;视野范围较大时,人工鱼的追尾行为和聚群行为将变得比较突出,相应的算法的复杂度也会有所上升。总的来说:视野越大,越容易使人工鱼发现全局最优解并收敛。 
2. 步长Step:对于固定步长,随着步长的增加,收敛的速度得到了一定的加速,但在超过一定的范围后,有使得收敛速度减缓,步长过大时会出现震荡现象而大大影响收敛速度。采用随机步长的方式在一定程度上防止了震荡现象的发生,并使得该参数的敏感度大大降低了,但最快的收敛速度还是最优固定步长的收敛速度,所以,对于特定的优化问题,我们可以考虑采用合适的固定步长或者变尺度方法来提高收敛速度。 
3. 群规模N:人工鱼的数目越多,跳出局部最优解的能力越强,同时,收敛的速度也越快。当然,付出的代价就是算法每次迭代的计算量也越大,因此,在使用过程中,满足稳定收敛的前提下,应当尽可能的减少个图数目。 
4. 尝试次数Trynumber:尝试次数越多,人工鱼的觅食行为能力越强,收敛的效率也越高。在局部极值突出的情况下,应该适当的减少以增加人工鱼随机游动的概率,克服局部最优解。 
5. 拥挤度因子δ:在求极大值问题中,δ=1/(αnmax),α∈(0,1]δ=1/(αnmax),α∈(0,1];在求极小值问题中,δ=αnmax,α∈(0,1]δ=αnmax,α∈(0,1]。其中α为极值接近水平, nmax为期望在该邻域内聚集的最大人工鱼数目。拥挤度因子与nf相结合,通过人工鱼是否执行追尾和聚群行为对优化结果产生影响。以极大值为例(极小值的情况正好与极大值相反),δ越大,表明允许的拥挤程度越小,人工鱼摆脱局部最优解的能力越强;但是收敛速度会有所减缓,这主要因为人工鱼在逼近最优解的同时,会因避免过分拥挤而随机走开或者受其他人工鱼的排斥作用,不能精确逼近极值点。可见,虽然δ的引入避免了人工鱼过度拥挤而陷入局部最优解,但是另一方面,该参数会使得位于极值点附件的人工鱼之间存在相互排斥的影响,而难以想极值点精确逼近。所以,对于某些局部极值不是很严重的具体问题,可以忽略拥挤的因素,从而在简化算法的同时也加快算法的收敛速度和提高结果的精确程度。 

六、 人工鱼群算法的特点

  1. 只需比较目标函数值,对目标函数的性质要求不高;
  2. 对初值的要求不高,随机产生或设置为固定值均可,鲁棒性强;
  3. 对参数设定的要求不高,容许范围大;
  4. 收敛速度较慢,但是具备并行处理能力;
  5. 具备较好的全局寻优能力,能快速跳出局部最优点;
  6. 对于一些精读要求不高的场合,可以用它快速得到一个可行解;
  7. 不需要问题的严格机理模型,甚至不需要问题的精确描述,这使得它的应用范围得以延伸。
    %人工鱼群算法  梯级水库调度
    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个值,总共50行
    d(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),同14行
    figurex2(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

    三、运行结果

    在这里插入图片描述

    四、备注

    完整代码或者仿真咨询添加QQ1575304183

以上是关于优化调度基于人工鱼群算法求解梯级水库优化调度matlab源码的主要内容,如果未能解决你的问题,请参考以下文章

优化调度基于matlab粒子群算法求解抽水蓄能电站最佳调度问题含Matlab源码 1968期

优化求解基于粒子群算法解决经济调度matlab源码

优化调度基于matlab粒子群算法求解经济调度优化问题含Matlab源码 1489期

优化调度基于matlab粒子群算法求解经济调度优化问题含Matlab源码 1489期

优化调度基于matlab粒子群算法求解水电厂优化调度购电最小问题含Matlab源码 1234期

车间调度基于PSO求解6X6的车间调度问题matlab 源码