普通遗传算法
%-------------------------------- 普通遗传算法 ----------------------------- % 该程序实现了普通遗传算法 %---------------------------------- 程序正文 ------------------------------- 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