Board logo

标题: PSO 粒子群算法 Matlab源码(2) [打印本页]

作者: yuyang911220    时间: 2016-9-16 11:46     标题: PSO 粒子群算法 Matlab源码(2)

%控制是否显示2维以下粒子维数的寻找最优的过程
%if IsDraw~=0
    %DrawObjGraphic(ParticleSize,ParticleScope,AdaptFunc);
%end
  %初始化种群
%[ParSwarm,OptSwarm]=InitFunc(SwarmSize,ParticleSize,ParticleScope,AdaptFunc);
[ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope);
  %在测试函数图形上绘制初始化群的位置
if IsDraw~=0
    if 1==ParticleSize
        for ParSwarmRow=1:SwarmSize
            plot([ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,1)],[ParSwarm(ParSwarmRow,3),0],'r*-','markersize',8);
            text(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,3),num2str(ParSwarmRow));%在图形中加注释
        end
    end
    if 2==ParticleSize
        for ParSwarmRow=1:SwarmSize
            stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);%绘制3D图形
        end
    end
end
  %暂停让抓图
if IsStep~=0
    disp('开始迭代,按任意键:')
    pause
end
  %开始更新算法的调用
for k=1oopCount
    %显示迭代的次数:
    disp('----------------------------------------------------------')
    TempStr=sprintf('第 %g 次迭代',k);
    disp(TempStr);
    disp('----------------------------------------------------------')
   
    %调用一步迭代的算法
    %[ParSwarm,OptSwarm]=StepFindFunc(ParSwarm,OptSwarm,AdaptFunc,ParticleScope,0.95,0.4,LoopCount,k);
    [ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,ParticleScope,0.95,0.4,LoopCount,k);
   
    %在目标函数的图形上绘制2维以下的粒子的新位置
    if IsDraw~=0
        if 1==ParticleSize
            for ParSwarmRow=1:SwarmSize
                plot([ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,1)],[ParSwarm(ParSwarmRow,3),0],'r*-','markersize',8);
                text(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,3),num2str(ParSwarmRow));
            end
        end
        
        if 2==ParticleSize
            for ParSwarmRow=1:SwarmSize
                stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);
            end
        end
    end
   
    XResult=OptSwarm(SwarmSize+1,1articleSize);%存取本次迭代得到的全局最优值
    YResult=AdaptFunc(XResult);                  %计算全局最优值对应的粒子的适应度值
    if IsStep~=0
        %XResult=OptSwarm(SwarmSize+1,1articleSize);
        %YResult=AdaptFunc(XResult);
        str=sprintf('%g 步迭代的最优目标函数值 %g',k,YResult);
        disp(str);
        disp('下次迭代,按任意键继续');
        pause
    end
   
    %记录每一步的平均适应度
    MeanAdapt(1,k)=mean(ParSwarm(:,2*ParticleSize+1));%mean函数为取有效值函数
end
%for循环结束标志
  %记录最小与最大的平均适应度
MinMaxMeanAdapt=[min(MeanAdapt),max(MeanAdapt)];
%计算离线与在线性能
for k=1oopCount
    OnLine(1,k)=sum(MeanAdapt(1,1:k))/k;%求取在线性能的数据
    OffLine(1,k)=max(MeanAdapt(1,1:k));
end
  for k=1oopCount
    OffLine(1,k)=sum(OffLine(1,1:k))/k;%求取离线性能的数据
end
  %绘制离线性能与在线性能曲线
%subplot(m,n,p);%将图形窗口分成m行n列的子窗口,序号为p的子窗口为当前窗口
if 1==IsPlot
    subplot(1,2,1);
    %figure
    hold on
    title('离线性能曲线图')
    xlabel('迭代次数');
    ylabel('离线性能');
    grid on
    plot(OffLine);
      subplot(1,2,2);
    %figure
    hold on
    title('在线性能曲线图')
    xlabel('迭代次数');
    ylabel('在线性能');
    grid on
    plot(OnLine);
end
%记录本次迭代得到的最优值 适应度值
XResult=OptSwarm(SwarmSize+1,1articleSize);
YResult=AdaptFunc(XResult);
Result=[XResult,YResult];
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%适应度函数
function y=AdaptFunc(x)
%Griewan函数
%输入x,给出相应的y值,在x=(0,0,…,0)处有全局极小点0.
%编制人:Jeary
%编制日期:2010.12.12
[row,col]=size(x);
if row>1
    error('适应度函数:输入的参数错误');
end
y1=1/4000*sum(x.^2);
y2=1;
for h=1:col
    y2=y2*cos(x(h)/sqrt(h));
end
y=y1-y2+1;
y=-y;




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0