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

📄 gaf1.m

📁 利用遗传算法
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%遗传算法%%%%%%%%%%%%%%%%%%%%%%%%%

clear
k=0.1;              
num=200;
z4=-100;
for e1=1:7
%产生初始种群
%**************************************************************************
t0=round(20000*rand(10));
t1=dec2bin(t0,15);
for i=2:2:100;   
   t(i/2,:)=[t1(i-1,:) t1(i,:)];
   x(i/2,:)=t1(i-1,:);
   y(i/2,:)=t1(i,:);                 
end                             %参数用二进制编码并两两组合成一个新二进制串
for e=1:num

%复制过程
%**************************************************************************
    xd=bin2dec(x);
    yd=bin2dec(y);
    for i=1:50
        if xd(i,:)==10000
            xd(i,:)=xd(i,:)+1;
        else if yd(i,:)==10000
                yd(i,:)=yd(i,:)+1;
            end
        end
    end                                            %防止出现分母为零的情况
        xd1=((xd./1000)-10);
        yd1=((yd./1000)-10);
        z=0.9*exp(((xd1+5).^2+(yd1+5).^2)./(-10))+0.9996*exp(((xd1-5).^2+(yd1-5).^2)./(-20));                %计算目标函数值

    z1=[1:50];
    z2=[z';z1];
    for j=1:49
        for i=1:(50-j)
            if z2(1,i)>z2(1,(i+1));
                z3=z2(:,i);
                z2(:,i)=z2(:,(i+1));
                z2(:,(i+1))=z3;
            end
        end
    end                                                          %排序
    for i=1:50
        z3(z2(2,i),:)=k*i/50;
    end                                 %按照适配值的大小重新计算适配值
   
        s=0;
        for i=1:50
            s=s+z3(i,:);            
        end
                                                          
    eq=s/50;
    for i=1:50
        j(i,:)=z(i,:)/s;
        m(i,:)=z(i,:)/eq;
    end                                                     
    m1=round(m);                                    %计算期望的复制个数
    s1=0;
    for i=1:50
        s1=s1+m1(i,:);
    end
    i1=s1-50;                                                 
    if i1>0                               
        for i=1:i1
            a(i)=round(50*rand);
            if a(i)==0
                a(i)=a(i)+1;
            end 
            while m1(a(i))==0
                a(i)=round(50*rand);
                if a(i)==0
                    a(i)=a(i)+1;
                end
            end
            m1(a(i))=m1(a(i))-1;
        end
    end                                       %处理复制的个数多于规定的数目的情况
    if i1<0                               
        i1=abs(i1);
        for i=1:i1
            a(i)=round(50*rand);
            if a(i)==0
                a(i)=a(i)+1;
            end
            while m1(a(i))==0
                a(i)=round(50*rand);
                if a(i)==0
                    a(i)=a(i)+1;
                end
            end
            m1(a(i))=m1(a(i))+1;
        end
    end                                  %处理复制的个数少于规定的数目的情况
    n=1;                                  
    for i=1:50
        if m1(i,:)==0 
            continue;
        end
        for j=1:m1(i,:)
            t2(n,:)=t(i,:);
            n=n+1;
        end
    end                                    %复制 t2为复制以后的种群

%交叉过程
%**************************************************************************
    t3=t2;
    for i=1:50
        r=round(rand*50);
        while r==0
            r=round(rand*50);
        end
        t3(i,:)=t2(r,:);
        t3(r,:)=t2(i,:);
    end                                 %随机两两配对 t3为配对后的种群
    t4=t3;
    for i=1:2:50
        r=round(rand*29);
        while r==0
            r=round(rand*29);
        end
        t4(i,:)=[t3(i,1:r) t3((i+1),(r+1):30)];
        t4(i+1,:)=[t3((i+1),1:r) t3(i,(r+1):30)];
    end                                   %交叉 t4为交叉后的种群
    
    %变异过程
    %**************************************************************************
    for i=1:15
        r1=round(rand*29);
        r2=round(rand*49);
        if r1==0
            r1=30;
        end
        if r2==0
            r2=50;
        end
        if t4(r2,r1)==0
            t4(r2,r1)=1;
        else t4(r2,r1)=0;
        end
    end
    %**************************************************************************
    t=t4;
    for i=1:50
        x(i,:)=t4(i,1:15);
        y(i,:)=t4(i,16:30);
    end
    if z4<z2(1,50);
        z4=z2(1,50);
        x4=xd1(z2(2,50),:);
        y4=yd1(z2(2,50),:);
        fprintf('第')
        disp(e1)
        fprintf('个随机生成的初始种群中第')
        disp(e) 
        fprintf('代得到')
        fprintf('x的值为:')
        disp(x4)
        fprintf('y的值为:')
        disp(y4)
        fprintf('z的值为:')
        disp(z4)
    end
end
end

⌨️ 快捷键说明

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