遗传算法及其改进.zip

  • Blessedhy
    了解作者
  • matlab
    开发工具
  • 3.3KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 1
    下载次数
  • 2022-01-07 10:36
    上传日期
包含了传统遗传算法的源代码(非调用工具箱)、改进的自适应遗传算法(纯代码,非工具箱调用)
遗传算法及其改进.zip
  • AGAf1.m
    4KB
  • TGAf1.m
    2.6KB
内容介绍
clear all %% 初始化参数 T=100;%仿真代数 N=10;% 群体规模 n=2;%变量个数 % pm=0.0018;pc=0.7;% 交叉变异概率 L=10;%单个参数字串长度,总编码长度 n*L bval=round(rand(N,n*L));% 初始种群 for tt=1:10 bestv=inf;% 最优适应度初值 for iiii=1:200 %% 迭代开始 %解码,计算适应度 for iii=1:T for i=1:N for ii=1:n x(ii)=0; Z=3;%前Z个二进制表示整数位 for j=(1+L*(ii-1)):(Z+L*(ii-1)) x(ii)=x(ii)+bval(i,Z+L*(ii-1)+L*(ii-1)-j+1)*2^(j-L*(ii-1)-1);%整数位 end x(ii)=x(ii)+sum( bval(i,((ii-1)*L+Z+1):(ii*L)).*2.^(-1:-1:-(L-Z)));%小数位+整数位 %判断是不是在[-4.5,4.5]这个区间,不在的话,随机产生一个满足区间的数代替 if x(ii)>4.5 x(ii)=4.5*rand(1); end end X(i,:)=x; [obj(i)] = objfunc(X(i,1),X(i,2)); end func=obj;% 目标函数转换为适应度函数 p=func./sum(func); p = 1./p;%用轮盘赌选择求最小值,需要倒一下,这样才是求最小值 p = p./sum(p); q=cumsum(p);%累加 [fmin,indmin]=min(func);% 求当代最佳个体 % [fmax,indmax]=max(func);% 求当代最佳个体 if fmin<=bestv bestv=fmin;% 到目前为止最优适应度值 bvalxx=bval(indmin,:);% 到目前为止最佳位串 optxx=X(indmin,:);% 到目前为止最优参数 end Bfit1(iii)=bestv;%存储每代的最优适应度 %% 自适应遗传算法做准备 fave = sum(func)/N; fmax = max(func); k1 = 1; k2 = 0.005; %% 遗传操作开始 if asin(fave/fmax)>=pi/6 pc = k1 * (1-asin(fave/fmax)/(pi/2)); pm = k2 * asin(fave/fmax)/(pi/2); %位点变异 mm=rand(N,n*L)<pm;%N 行, 小于变异概率的赋值为 1,其他赋值 0 mm(N,:)=zeros(1,n*L);% 最后一行不变异,强制赋 0 bval(mm)=1-bval(mm); %bval(mm) 把 mm中赋值为 1 的基因提取出来 %单点交叉操作 for i=1:2:(N-1) cc=rand; if cc<pc position = ceil(rand*(L/2));%每个字符串,从postion位置开始往后L/2个被当做交叉字符 long = floor(L/2);%这就是前面提的L/2 ch=bval(i,:); for j=1:n bval(i,(position+(j-1)*L):(long+position+(j-1)*L))=bval(i+1,(position+(j-1)*L):(long+position+(j-1)*L)); bval(i+1,(position+(j-1)*L):(long+position+(j-1)*L))=ch(1,(position+(j-1)*L):(long+position+(j-1)*L)); end end end bval(N,:)=bvalxx;% 最优保留 %轮盘赌选择 for i=1:(N-1) r=rand; tmp=find(r<=q); newbval(i,:)=bval(tmp(1),:); end newbval(N,:)=bvalxx;% 最优保留 bval=newbval; else pc = k1 * asin(fave/fmax)/(pi/2); pm = k2 * (1-asin(fave/fmax)/(pi/2)); %单点交叉操作 for i=1:2:(N-1) cc=rand; if cc<pc position = ceil(rand*(L/2));%每个字符串,从postion位置开始往后L/2个被当做交叉字符 long = floor(L/2);%这就是前面提的L/2 ch=bval(i,:); for j=1:n bval(i,(position+(j-1)*L):(long+position+(j-1)*L))=bval(i+1,(position+(j-1)*L):(long+position+(j-1)*L)); bval(i+1,(position+(j-1)*L):(long+position+(j-1)*L))=ch(1,(position+(j-1)*L):(long+position+(j-1)*L)); end end end %位点变异 mm=rand(N,n*L)<pm;%N 行, 小于变异概率的赋值为 1,其他赋值 0 mm(N,:)=zeros(1,n*L);% 最后一行不变异,强制赋 0 bval(mm)=1-bval(mm); %bval(mm) 把 mm中赋值为 1 的基因提取出来 %轮盘赌选择 for i=1:(N-1) r=rand; tmp=find(r<=q); newbval(i,:)=bval(tmp(1),:); end newbval(N,:)=bvalxx;% 最优保留 bval=newbval; end end %% 输出 bestvf(iiii)=bestv; % 输出最优适应度值 bestp(iiii,:)=optxx; end %% 画图像,直观体现预测结果 b(tt,:) = min(bestvf);%输出寻得的最优自变量位置和最优输出变量 k=find(bestvf==min(bestvf)); a(tt,:) = bestp(k(1),:); bb(tt,:) = bestvf; end min(b) a(find(min(b)==b),:) % subplot(1,2,1) % plot(bestvf) % % subplot(1,2,2) % x = [-4.5:0.1:4.5];y = [-4.5:0.1:4.5]; % [XX,YY]=meshgrid(x,y); % [Z] = objfunc(XX,YY); % surf(XX,YY,Z); %% objective optimizitation function function [f1] = objfunc(x,y); f1 = (1.5- x + x.*y).^2 + (2.25 - x + x.*y.^2).^2 + (2.625 - x + x.*y.^3).^2;%-4.5<=x;y<=4.5,最小值为0,此时(3,0.5) f3 = 0.5 - ((sin(sqrt(x.^2+y.^2))).^2 -0.5)./(1+0.001*(x.^2+y.^2)).^2 ;%最大值为1,此时(0,0);x,y是[-10,10] end
评论
    相关推荐