mat7labs的个人空间 http://blog.eetop.cn/1631436 [收藏] [复制] [RSS]

日志

无约束连续函数的人工鱼群优化算法

热度 1已有 1895 次阅读2019-7-1 21:27

function [BESTX,BESTY,ALLX,ALLY]=FSOUCP(K,N,V,Delta,L,LB,UB)
%% Fish Swarm Optimization for UnconstrAIned Continuous Problem
%% FSOUCP.m
%% 无约束连续函数的人工鱼群优化算法
%  author:greensim团队
%  修改:沈杰 南京理工大学自动化学院
%  Email:bud000@126.com
%% 此函数实现人工鱼群算法,用于求解无约束连续函数最小化问题
%% 对于最大化问题,请先将其加负号转化为最小化问题
%% 输入参数列表
% K        迭代次数
% N        鱼群规模
% V        人工鱼的感知范围
% Delta    拥挤程度的判决门限,取值0~1之间
% L        觅食行为的试探次数
% 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]=FSOUCP(50,30,0.5,0.3,20,LB,UB)
%具体参数设置可根据待优化函数实际情况修改

%% 第一步:
M=length(LB);%决策变量的个数
%蚁群位置初始化
X=zeros(M,N);
for i=1:M
    x=unifrnd(LB(i),UB(i),1,N);%在上下限内随机产生1xN矩阵
    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;%迭代计数器初始化

%% 第二步:迭代过程
while k<=K
    NewX=zeros(M,N);
    NewY=zeros(1,N);
    for n=1:N
        x=X(:,n);
        Xnb=AFneighbour(n,X,V);%AFneighbour(n,X,V)找出人工鱼感知范围内的邻居,在下方定义
        NN=size(Xnb,2);
        if NN==0
            xx=AFprey(x,V,L,LB,UB);%AFprey(x,V,L,LB,UB)人工鱼觅食行为的子函数,在下方定义
        elseif NN>=3
            xx=AFswarm(x,Xnb,N,Delta,V,L,LB,UB);
        else
            xx=AFprey(x,V,L,LB,UB);
        end
        NewX(:,n)=xx;
    end
    for n=1:N
        NewY(n)=FIT(NewX(:,n));
    end
    X=NewX;
    Y=NewY;
    ALLX{k}=X;
    ALLY(k,:)=Y;
    minY=min(Y);
    pos=find(Y==minY);
    BESTX{k}=X(:,pos(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,'r*');
figure(1)
plot(-BESTY,'-ko','MarkerEdgeColor','r','MarkerFaceColor','r','MarkerSize',2)
ylabel('函数值')
xlabel('迭代次数')
title('收敛情况')
grid on
function Xnb=AFneighbour(s,X,V)
%% 找出人工鱼感知范围内的邻居
%% 输入参数列表
% s        当前人工鱼的编号
% X        M×N矩阵,人工鱼群
% V        人工鱼的感知范围
%% 输出参数列表
% Xnb      第s个人工鱼的邻居
%%
[M,N]=size(X);
xs=X(:,s);
Xnb=zeros(M,0);
for n=1:N
    if n~=s
        xn=X(:,n);
        dx=xn-xs;
        maxdx=max(dx);
        mindx=min(dx);
        if (maxdx<V)&&(mindx>V)
            Xnb=[Xnb,xn];
        end
    end
end
function xx=AFprey(x,V,L,LB,UB)
%% 人工鱼觅食行为的子函数
%% 输入参数列表
% x        觅食行为之前的状态
% V        人工鱼的感知范围
% L        觅食行为的试探次数
% LB       决策变量的下界,M×1的向量
% UB       决策变量的上界,M×1的向量
%% 输出参数列表
% xx       觅食行为之后的状态
%%
M=length(x);
xx=zeros(M,1);
counter=0;
while 1
    for m=1:M
        q=x(m)+unifrnd(-V,V,1,1);
        if q<LB(m)
            q=LB(m);
        end
        if q>UB(m)
            q=UB(m);
        end
        xx(m)=q;
    end
    counter=counter+1;
    Fx=FIT(x);
    Fxx=FIT(xx);
    if Fxx<Fx
        return
    end
    if counter>=L
        return
    end
end

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

关闭

站长推荐上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询 |  EETOP 创芯网 ( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2020-9-22 16:02 , Processed in 0.030078 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

返回顶部