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

📄 新建 文本文档.txt

📁 应用遗传算法实现函数的优化
💻 TXT
字号:
function main
clc;
clear;close all;
v=2*rand(50,22)-1;%-1<v<1
v=hardlim(v);% v=0|1
[N,L]=size(v); ger=200; pc=0.5; pm=0.01;
updatef=-100; c=0;
updatec=zeros(1,size(v,2));
disp(sprintf('number of generations: %d',ger));
disp(sprintf('population size:%d',N));
disp(sprintf('crossover probability:%3f',pc));
disp(sprintf('mutation probability:%3f',pm));
f='-(x.^2+y.^2)';
%General parameters& Initial operations
soll=1;vmfit=[];it=1;vx=[];updatef=-10;
x=decod(v(:,1:11),11);y=decod(v(:,12:end),11);
fit=eval(f);%f(x,y)的结果
%Generations
t0=clock;
while it<=ger
    %Selection 转盘
    for i=1:N
        sp(i)=(fit(i)+3)/sum(fit+3);
    end
    
    for i=2:N
        sp(i)=sp(i)+sp(i-1);
    end
    for i=1:N
        p=rand(1);sindex=1;
        while p>sp(sindex)
            sindex=sindex+1;%寻找要选择个体的位置
        end
        newv(i,:)=v(sindex,:);
    end
    for i=1:N
        v(i,:)=newv(i,:);%用选择出来的个体构成的种群代替旧的种群
    end
    %Crossover 交叉
    for i=1:N
        cindex(i)=i;
    end
    for i=1:N %产生要配对的父代的序号;经过N次顺序调换,将原有顺序打乱,使相邻两个个体作为交叉的父代
        point=unidrnd(N-i+1);
        temp=cindex(i);
        cindex(i)=cindex(i+point-1);
        cindex(i+point-1)=temp;
    end
    for i=1:2:N
        p=rand(1);
        if(p<pc)
            point=unidrnd(L-1)+1;%1<point<L 产生交叉点
            for j=point:(L-1) %交叉
                ch=v(cindex(i),j);
                v(cindex(i),j)=v(cindex(i+1),j); %cindex中相邻的两个为两个父代的序号
                v(cindex(i+1),j)=ch;
            end
        end
    end
    %Mutation 变异
    M=rand(N,L)<=pm;%产生(N,L)维的01矩阵,为1的位置进行变异
    v=v-2.*(v.*M)+M;
    % Evaluatefitness&Evolution 评估与进化
    x=decod(v(:,1:11),11);
    y=decod(v(:,12:end),11);
    fit=eval(f);
    [soll,indb1]=max(fit);
    if updatef>=soll
        soll=updatef;
        v(indb1,:)=updatec;
    end
    updatef=soll;
    updatec=v(indb1,:);
    [sol2,indb2]=min(fit);
    v(indb2,:)=v(indb1,:);
    x=decod(v(:,1:11),11);y=decod(v(:,12:end),11);fit=eval(f);
    media=mean(fit);
    vx=[vx soll];vmfit=[vmfit media];
      if rem(it,1)==0|it==10
          if c~=1
              disp(sprintf('Gen: %d x: %2.5f y: %2.5f  Av:  %2.2f   f(x,y):%2.40f',it,x(indb1),y(indb1),media,soll));
          else
              disp(sprintf('Gen: %d  Av:  %2.2f f(x,y):2.5f',it,media,soll));
          end
      end
      it=it+1;
end;
T=etime(clock,t0);%F=flops-f0;
X=x;Y=y;
x=x(indb1);y=y(indb1);fx=soll;P=v;
disp(sprintf('Maximum found [f(x,y):[%2f]',-fx));%xx=vx ;yy=vmfit;
figure(2);plot(vx,'k');
title('f(x,y)=-(x^3+y^3 x) Mean'); xlabel('Generations');
ylabel('f(x,y)');
hold on; plot(vmfit,'k:');
legend('best','mean',0);hold off;

function x=decod(v,l) %解码--子函数(最大值为1,最小值为-1)
 Umax=1;
 Umin=-1;
 [N,L]=size(v);
 G=(Umax-Umin)/(2^l-1);
for i=1:N
    sum=0;
    for j=1:l
        sum=sum+v(i,j)*2^(j-1); 
    end
    x(i,1)=sum*G+Umin;
end


    
        
    
    
    

⌨️ 快捷键说明

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