奇迹969

 

day1 普通遗传算法和粒子群算法

 

普通遗传算法

 

%-------------------------------- 普通遗传算法 -----------------------------

%                           该程序实现了普通遗传算法

%---------------------------------- 程序正文 -------------------------------
function SGA
%---------------------------------- 共性参数 -------------------------------
NP=50;                             %种群规模
Max_N=100;                       %限定代数
Pc=ones(1,NP)*0.80;                %交叉概率
Pm=ones(1,NP)*0.01;                %变异概率
flagc=[0,Max_N];                   %收敛标志
%---------------------------------- 个性参数 -------------------------------
D=30;MinX=-100;MaxX=100;Error=1.0e-10;
%---------------------------------- 初始化 ---------------------------------
X=MinX+(MaxX-MinX)*rand(NP,D);
F=fun(X);tF=1./F;
[bestF,bestlow]=min(F);
bestX=X(bestlow,:);
%---------------------------------- 优化开始 -------------------------------
for gen=1:1:Max_N
    time(gen)=gen;
    %------------------------------ 复制操作 -------------------------------
tmpF=cumsum(tF/sum(tF));CX=X;
    for i=1:1:NP
        rnd =rand;
        for flag =1:1:NP
            if rnd<tmpF(flag);
                   X(i,:)=CX(flag,:),break;
            end
        end
    end
    %------------------------------ 种群交叉 -------------------------------
    Pc_rand =rand(1,NP);
    for i=1:2:(NP-1)
        if Pc(i)>Pc_rand(i)
            alfa=rand;
            X(i,:)=alfa*X(i+1,:)+(1-alfa)*X(i,:);
            X(i+1,:)=alfa*X(i,:)+(1-alfa)*X(i+1,:);
        end
    end 
    %------------------------------ 种群变异 -------------------------------
    Pm_rand=rand(NP,D);
    for i=1:1:NP
        for j=1:1:D
            if Pm(i)>Pm_rand(i,j)
                X(i,j)=MinX+(MaxX-MinX)*rand;
            end
        end
    end
    X(NP,:)=bestX;
    %------------------------------ 算函数值 -------------------------------
    F=fun(X);
    %------------------------------ 种群评估 -------------------------------
    [bestF,bestlow]=min(F);
    bestX=X(bestlow,:);
    %--------------------------- 记录结果 ----------------------------------
    result(gen)=bestF;
    if (bestF<Error) & (flagc(1)==0)
        flagc(1)=1;flagc(2)=gen;
    end
    if mod(gen,1000)==0
        disp(['代数:',num2str(gen),'----最优:',num2str(bestF)]);
    end
end
plot(time,result)
%----------------------------- 子函数1:目标函数 ----------------------------
function F=fun(X)
for i=1:1:length(X(:,1))
    F(i)=sum(X(i,:).^2);
end

 

posted on 2021-05-06 15:23  奇迹969  阅读(208)  评论(0编辑  收藏  举报

导航