粒子群算法(1)----粒子群算法简单介绍 (8)

%输入參数:IsDraw:是否图形化迭代过程;IsDraw0,不图形化迭代过程,否则,图形化表示。缺省不图形化表示

%输入參数:LoopCount:迭代的次数;缺省迭代100

%输入參数:IsPlot:控制是否绘制在线性能与离线性能的图形表示;IsPlot=0,不显示;

%                 IsPlot=1;显示图形结果。缺省IsPlot=1

%

%返回值:Result为经过迭代后得到的最优解

%返回值:OnLine为在线性能的数据

%返回值:OffLine为离线性能的数据

%返回值:MinMaxMeanAdapt为本次完整迭代得到的最小与最大的平均适应度

%

%使用方法[Result,OnLine,OffLine,MinMaxMeanAdapt]=PsoProcess(SwarmSize,ParticleSize,ParticleScope,InitFunc,StepFindFunc,AdaptFunc,IsStep,IsDraw,LoopCount,IsPlot);

%

%异常:首先保证该文件在Matlab的搜索路径中,然后查看相关的提示信息。

%

%编制人:XXX

%编制时间:2007.3.26

%參考文献:XXXXX%

%改动记录:

%加入MinMaxMeanAdapt,以得到性能评估数据

%改动人:XXX

%改动时间:2007.3.27

%參考文献:XXX.

%容错控制

if nargin<4

    error(\'输入的參数个数错误。\')

end

[row,colum]=size(ParticleSize);

if row>1|colum>1

    error(\'输入的粒子的维数错误,是一个11列的数据。\');

end

[row,colum]=size(ParticleScope);

if row~=ParticleSize|colum~=2

    error(\'输入的粒子的维数范围错误。\');

end

%设置缺省值

if nargin<7

    IsPlot=1;

    LoopCount=100;

    IsStep=0;

    IsDraw=0;

end

if nargin<8

    IsPlot=1;

    IsDraw=0;

    LoopCount=100;

end

if nargin<9

    LoopCount=100;

    IsPlot=1;

end

if nargin<10

    IsPlot=1;

end

%控制是否显示2维以下粒子维数的寻找最优的过程

if IsDraw~=0

    DrawObjGraphic(ParticleSize,ParticleScope,AdaptFunc);

end

%初始化种群       

[ParSwarm,OptSwarm]=InitFunc(SwarmSize,ParticleSize,ParticleScope,AdaptFunc)

%在測试函数图形上绘制初始化群的位置

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

    

%暂停让抓图

if IsStep~=0

    disp(\'開始迭代,按随意键:\')

    pause

end

%開始更新算法的调用

for k=1:LoopCount

    %显示迭代的次数:

    disp(\'----------------------------------------------------------\')

    TempStr=sprintf(\'第 %g 此迭代\',k);

    disp(TempStr);

    disp(\'----------------------------------------------------------\')

    

    %调用一步迭代的算法

    [ParSwarm,OptSwarm]=StepFindFunc(ParSwarm,OptSwarm,AdaptFunc,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,1:ParticleSize);

    YResult=AdaptFunc(XResult);    

    if IsStep~=0

        XResult=OptSwarm(SwarmSize+1,1:ParticleSize);

        YResult=AdaptFunc(XResult);    

        str=sprintf(\'%g步迭代的最优目标函数值%g\',k,YResult);

        disp(str);

        disp(\'下次迭代,按随意键继续\');

        pause

    end

    

    %记录每一步的平均适应度

    MeanAdapt(1,k)=mean(ParSwarm(:,2*ParticleSize+1));

end

%for循环结束标志

%记录最小与最大的平均适应度

MinMaxMeanAdapt=[min(MeanAdapt),max(MeanAdapt)];

%计算离线与在线性能

for k=1:LoopCount

    OnLine(1,k)=sum(MeanAdapt(1,1:k))/k;

    OffLine(1,k)=max(MeanAdapt(1,1:k));

end

for k=1:LoopCount

    OffLine(1,k)=sum(OffLine(1,1:k))/k;

end

%绘制离线性能与在线性能曲线

if 1==IsPlot

    figure

    hold on

    title(\'离线性能曲线图\')

    xlabel(\'迭代次数\');

    ylabel(\'离线性能\');

    grid on

    plot(OffLine);

    figure

    hold on

    title(\'在线性能曲线图\')

    xlabel(\'迭代次数\');

    ylabel(\'在线性能\');

    grid on

    plot(OnLine);

end

%记录本次迭代得到的最优结果

XResult=OptSwarm(SwarmSize+1,1:ParticleSize);

YResult=AdaptFunc(XResult);

Result=[XResult,YResult];

  这里给出一个使用的样例代码,并分别解释各參数的含义:

%打开计时器

tic;

%

Scope=[-50 50

    -50 50

    -50 50

    -50 50

    -50 50

    -50 50

    -50 50

    -50 50

    -50 50

    -50 50];

[v,on,off,minmax]=PsoProcess(20,10,Scope,@initswarm,@BasestepPSO,@Griewank,0,0,4000,0);

toc

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgyywg.html