蚁群算法改进的BP神经网络(算法有问题待修正)

转自http://blog.sina.com.cn/greensim
function [BESTX,BESTY,ALLX,ALLY]=ACOUCP(50,30,0.95,1,0.5,LB,UB)

%% 此函数实现蚁群算法,用于优化BP神经网络权值阈值

%% 输入参数列表

% K        迭代次数

% N        蚁群规模

% Rho      信息素蒸发系数,取值0~1之间,推荐取值0.7~0.95

% Q        信息素增加强度,大于0,推荐取值1左右

% Lambda   蚂蚁爬行速度,取值0~1之间,推荐取值0.1~0.5

% LB       决策变量的下界,M×1的向量

% UB       决策变量的上界,M×1的向量

%% 输出参数列表

% BESTX    K×1细胞结构,每一个元素是M×1向量,记录每一代的最优蚂蚁

% BESTY    K×1矩阵,记录每一代的最优蚂蚁的评价函数值

% ALLX     K×1细胞结构,每一个元素是M×N矩阵,记录每一代蚂蚁的位置

% ALLY     K×N矩阵,记录每一代蚂蚁的评价函数值

%% 测试函数设置

% 测试函数用单独的子函数编写好,在子函数FIT.m中修改要调用的测试函数名即可

% 注意:决策变量的下界LB和上界UB,要与测试函数保持一致

%% 参考设置

% [BESTX,BESTY,ALLX,ALLY]=ACOUCP(50,30,0.95,1,0.5,LB,UB)

%% 第一步:初始化

M=length(LB);%决策变量的个数

%蚁群位置初始化

X=zeros(M,N);

for i=1:M

    x=unifrnd(LB(i),UB(i),1,N);

    X(i,:)=x;

end

%输出变量初始化

ALLX=cell(K,1);%细胞结构,每一个元素是M×N矩阵,记录每一代的个体

ALLY=zeros(K,N);%K×N矩阵,记录每一代评价函数值

BESTX=cell(K,1);%细胞结构,每一个元素是M×1向量,记录每一代的最优个体

BESTY=zeros(K,1);%K×1矩阵,记录每一代的最优个体的评价函数值

k=1;%迭代计数器初始化

Tau=ones(1,N);%信息素初始化

Y=zeros(1,N);%适应值初始化

%% 第二步:迭代过程

while k<=K

    YY=zeros(1,N);

    for n=1:N

        x=X(:,n);

        YY(n)=FIT(x,R,S1,S2,xx,yy);

    end

    maxYY=max(YY);

    temppos=find(YY==maxYY);

    POS=temppos(1);

    %蚂蚁随机探路

    for n=1:N

        if n~=POS

            x=X(:,n);

            Fx=FIT(x,R,S1,S2,xx,yy);

            mx=GaussMutation(x,LB,UB);

            Fmx=FIT(mx,R,S1,S2,xx,yy);

            if Fmx<Fx

                X(:,n)=mx;

                Y(n)=Fmx;

            elseif rand>1-(1/(sqrt(k)))

                X(:,n)=mx;

                Y(n)=Fmx;

            else

                X(:,n)=x;

                Y(n)=Fx;

            end

        end

    end

    for n=1:N

        if n~=POS

            x=X(:,n);

            Fx=FIT(x,R,S1,S2,xx,yy);

            mx=GaussMutation(x,LB,UB);

            Fmx=FIT(mx,R,S1,S2,xx,yy);

            if Fmx<Fx

                X(:,n)=mx;

                Y(n)=Fmx;

            elseif rand>1-(1/(sqrt(k)))

                X(:,n)=mx;

                Y(n)=Fmx;

            else

                X(:,n)=x;

                Y(n)=Fx;

            end

        end

    end

    %朝信息素最大的地方移动

    for n=1:N

        if n~=POS

            x=X(:,n);

            r=(K+k)/(K+K);

            p=randperm(N);

            t=ceil(r*N);

            pos=p(1:t);

            TempTau=Tau(pos);

            maxTempTau=max(TempTau);

            pos2=find(TempTau==maxTempTau);

            pos3=pos(pos2(1));

            x2=X(:,pos3(1));

            x3=(1-Lambda)*x+Lambda*x2;

            Fx=FIT(x,R,S1,S2,xx,yy);

            Fx3=FIT(mx,R,S1,S2,xx,yy);

            if Fx3<Fx

                X(:,n)=x3;

                Y(n)=Fx3;

            elseif rand>1-(1/(sqrt(k)))

                X(:,n)=x3;

                Y(n)=Fx3;

            else

                X(:,n)=x;

                Y(n)=Fx;

            end

        end

    end

    %更新信息素并记录

    Tau=Tau*(1-Rho);

    maxY=max(Y);

    minY=min(Y);

    DeltaTau=(maxY-Y)/(maxY-minY);

    Tau=Tau+Q*DeltaTau;

    ALLX{k}=X;

    ALLY(k,:)=Y;

    minY=min(Y);

    pos4=find(Y==minY);

    BESTX{k}=X(:,pos4(1));

    BESTY(k)=minY;

    disp(k);

    k=k+1;

end

%% 绘图

BESTY2=BESTY;

BESTX2=BESTX;

for k=1:K

    TempY=BESTY(1:k);

    minTempY=min(TempY);

    posY=find(TempY==minTempY);

    BESTY2(k)=minTempY;

    BESTX2{k}=BESTX{posY(1)};

end

BESTY=BESTY2;

BESTX=BESTX2;

plot(BESTY,’-ko’,’MarkerEdgeColor’,’k’,’MarkerFaceColor’,’k’,’MarkerSize’,2)

ylabel(‘函数值’)

xlabel(‘迭代次数’)

grid on

    原文作者:神经网络算法
    原文地址: https://blog.csdn.net/pitt_xiong/article/details/7786881
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞