⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ga_simple.m

📁 人工免疫算法基于遗传MATLAB代码很有用哦
💻 M
字号:
function ga_simple(prompt,def)
   %(NIND,NVAR,bounds,evalFN,MAXGEN,PRECI,GGAP,pCross,FieldD,tag)

%evalFN = 'x + 10*sin(5*x)+7*cos(4*x)';

%figure(1);
%fplot(evalFN,bounds);   %画出函数曲线
%定义遗传算法参数
%NIND=80;        %个体数目(Number of individuals)
%MAXGEN=50;      %最大遗传代数(Maximum number of generations)
%PRECI=20;       %变量的二进制位数(Precision of variables);染色体的长度
GGAP=0.9;       %代沟(Generation gap)

prompt={'适应度函数Func:','边界范围Bounds:','自变量个数Nvar:','种群总数N:','终止代数R:','交叉率pc:','求最大小值(0,1):'};
%def={'x + 10*sin(5*x)+7*cos(4*x)','[0,9]','1','50','30','0.7','0'};
def={ '0.5+(sin(sqrt(x.*x+y.*y)).* sin(sqrt(x.*x+y.*y))-0.5)./((0.001*(x.*x+y.*y)+1.0).^2)','[-100,100]','2','80','100','0.7','0'};
%def={'((1*cos((1+1)*x+1))+(2*cos((2+1)*x+2))+(3*cos((3+1)*x+3))+(4*cos((4+1)*x+4))+(5*cos((5+1)*x+5))).*((1*cos((1+1)*y+1))+(2*cos((2+1)*y+2))+(3*cos((3+1)*y+3))+(4*cos((4+1)*y+4))+(5*cos((5+1)*y+5)))',...
 %      '[-10,10]','2','80','100','0.7','0'};
dlgTitle='input';%'参数输入';
lineNo=1;
answer=inputdlg(prompt,dlgTitle,lineNo,def);
answer=char(answer);
evalFN=(answer(1,:));
bounds=str2num(answer(2,:));
NIND=str2num(answer(4,:));
NVAR=str2num(answer(3,:));
MAXGEN=str2num(answer(5,:));
pCross=str2num(answer(6,:));
tag=str2num(answer(7,:));
tic;
PRECI=ceil(log2((bounds(:,2)-bounds(:,1))' ./ (1e-6)));          % Chrom's length
if NVAR==1
         FieldD=[PRECI;bounds(1);bounds(2);1;0;1;1];
  else   FieldD=[rep([PRECI],[1,NVAR]);rep([bounds(1);bounds(2)],[1,NVAR]);rep([1;0;1;1],[1,NVAR])];
  end    
len=NVAR*PRECI;
trace=zeros(MAXGEN,3);                          %寻优结果的初始值
%FieldD=[20;bounds(1);bounds(2);1;0;1;1];       %区域描述器(Build field descriptor)
Chrom=crtbp(NIND,len );                  %初始种群
%pop_temp=chaos_serial(evalFN,bounds,NIND,NVAR,PRECI);
%pop_temp=round(rand(NIND-2,len));
%Chrom=[zeros(1,len);pop_temp;ones(1,len)];
gen=0;                                          %代计数器

if NVAR==1
    x=bs2rv(Chrom, FieldD);                     %计算初始种群的十进制转换
elseif NVAR==2 
     p=bs2rv(Chrom, FieldD);
     x=p(:,1);
     y=p(:,2);
end
ObjV = eval(evalFN);                                      %计算目标函数值

while gen<MAXGEN
   if tag==0
        FitnV=ranking(-ObjV);                             %分配适应度值(Assign fitness values)         
   else FitnV=ranking(ObjV); 
   end
   SelCh=select('sus', Chrom, FitnV, GGAP);               %选择
   SelCh=recombin('xovsp', SelCh, pCross);                %交叉
   SelCh=mut(SelCh);                                      %变异
   
   p=bs2rv(SelCh, FieldD);                                %子代个体的十进制转换
   if NVAR==1
       x=p;
   elseif NVAR==2 
       x=p(:,1);
       y=p(:,2);
   end
   ObjVSel=eval(evalFN);                                  %计算子代的目标函数值
   
   [Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel); %重插入子代的新种群
  
   gen=gen+1;                                             %代计数器增加
   optim=min(ObjV);
   if tag==0
       [Y, I]=max(ObjV);
       if optim<=Y  
           optim=Y;
           p=bs2rv(Chrom(I,:),FieldD);
        if NVAR==1
            bstch=p;
       elseif NVAR==2 
            bstch=p(:,1)+i*p(:,2);
         end
       end
   elseif tag==1 
       [Y, I]=min(ObjV);
       if optim >= Y  
           optim=Y;
           p=bs2rv(Chrom(I,:),FieldD);
            if NVAR==1
                bstch=p;
           elseif NVAR==2 
                bstch=p(:,1)+i*p(:,2);
             end
       end
    end
%   Y,  x=r(:,1), y=r(:,2),                              %输出最优解及其序号,并在目标函数图像中标出,Y为最优解,I为种群的序号
   trace(gen,1)= max(ObjV);                              %遗传算法性能跟踪
   trace(gen,2)=sum(ObjV)/length(ObjV);
   trace(gen,3)=min(ObjV); 
end
                
if tag==0
    optim=max(trace(:,1));
    plot(trace(:,1));
    hold on;plot(I,optim,'*');
    plot(trace(:,2),'r-.');grid
    hold on;
    plot(trace(:,3),':');
    text(I,optim,['FMax=' num2str(optim)]);
    str1=sprintf('进化到 %d 代 ,自变量为 %s 时,得本次求解的最优值 %f\n对应染色体是:%s\n use times: %5.2f',...
             I,num2str(bstch),optim,num2str(Chrom(I,:)),toc);
     disp(str1);
   legend('解的变化','种群均值的变化','种群最小值的变化')
elseif tag==1 
    optim=min(trace(:,3));
    plot(trace(:,3));
    hold on;plot(I,optim,'*');
    plot(trace(:,2),'r-.');grid
    hold on;
    plot(trace(:,1),':');
    text(I,optim,['FMin=' num2str(optim)]);
    str1=sprintf('进化到 %d 代 ,自变量为 %s 时,得本次求解的最优值 %f\n对应染色体是:%s\n use times: %5.2f',...
             I,num2str(bstch),optim,num2str(Chrom(I,:)),toc);
     disp(str1);
    legend('解的变化','种群均值的变化','种群最大值的变化')
end
title('函数优化的遗传算法');xlabel('进化世代数(Generation)');ylabel('每一代适应度(Fitness)');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -