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

📄 genetic.m

📁 这是一个关于遗传算法和神经网络的经典程序
💻 M
字号:
c=25;
p=rands(100,c)*5;
T=rand(1,c)*0;
A=[1.40,1.80,3.70;4.28,4.96,1.31;1.18,4.29,3.35;1.96,1.90,2.70;1.85,1.43,3.52;3.66,1.60,2.46;3.64,2.14,1.95;4.51,1.52,2.51;3.77,1.45,2.70;4.84,4.32,1.33;1.05,2.55,4.63;4.51,1.37,2.80;1.84,4.43,1.97;1.67,2.81,2.47;2.03,1.88,2.66;3.62,1.95,2.08;1.67,2.23,2.75;3.38,3.70,1.51;2.83,3.70,1.60;1.48,4.44,2.44;3.37,2.13,1.99;2.84,1.24,3.42;1.19,1.53,4.99;4.10,1.71,2.27;1.65,1.38,3.94;2.00,2.06,2.52;2.71,4.13,1.58;1.78,1.11,4.71;3.63,2.27,1.87;2.24,3.74,1.79;1.81,3.18,2.20;4.85,4.66,1.30;3.41,3.88,1.48;1.38,2.55,3.14;2.46,2.12,2.22;2.66,4.42,1.56;4.44,4.71,1.32;3.11,1.06,4.08;4.47,3.66,1.42;1.35,1.76,3.91;1.24,1.41,5.05;2.81,1.35,1.97;1.92,4.25,1.92;4.61,2.68,1.63;3.04,4.97,1.44;4.82,3.80,1.39;2.58,1.97,2.29;4.14,4.76,1.33;4.35,3.90,1.40;2.22,1.35,3.39]';%A原始数据
group=p;
for g=1:5000
     sum1=0;
     for i=1:25
         group(1,i)=T(i);
     end
     for j=1:100
         w1=[group(j,1),group(j,2);group(j,3),group(j,4);group(j,5),group(j,6);group(j,7),group(j,8);group(j,9),group(j,10)];% w1 输入之隐层输入权值
         w01=[group(j,11);group(j,12);group(j,13);group(j,14);group(j,15)];% w01 隐层阈值
         w2=[group(j,16),group(j,17),group(j,18),group(j,19),group(j,20)];% w2 隐层权值
         w02=[group(j,21)];% w02 输出层阈值
         sum=0;
         for k=1:50%  计算适应值函数 
             x11=A(1,k)/5;
             x12=A(2,k)/5;
             x=[x11;x12];
             u1=w1*x-w01;
             o1=[1/(1+exp(-u1(1)));1/(1+exp(-u1(2)));1/(1+exp(-u1(3)));1/(1+exp(-u1(4)));1/(1+exp(-u1(5)))];
             y=w2*o1-w02;
             e=A(3,k)-y;
             sum=sum+e^2;
         end
         group(j,22)=(50/sum);%group(j,22) 为个体适应值   
         fit=group(j,22);
         sum1=sum1+fit;
     end
     average_fit(g)=sum1/100;%平均适应值
     for i=1:100
         group(i,24)=group(i,22)/ (sum1);% 个体适应值与群体适应值的比值
     end
     for i=1:100% 按适应值的大小排序
         for j=1:(100-i)
             m=j+1;
             w=group(j,:);
             z=group(m,:);
             D=[w;z];
             if group(j,22)<group(m,22);
                F=flipud(D);%矩阵上下翻转
                group(j,:)=F(1,:);
                group(m,:)=F(2,:);
             end
         end
     end
     for i=1:25
         T(i)=group(1,i);
     end
     f=T;
     select_du=rand(60,c); %  选择算子产生交配池, select_du为交配池。
     r=1;
     for j=1:100
         Pc=rand(1);
         pc1=group(j,24)*10;
         if Pc<pc1;
            select_du(r,:)=group(j,:);
            r=r+1;
         end
     end
     m=round(r/2); %交叉算子
     cross_p=rand(m*2,c);%交配后新个体放入 cross_p中
     E=rand(1,c);
     B=rand(1,c);
     C=rand(1,c);
     D=rand(1,c);
     for i=1:m
         as=rand(1);
         ad=rand(1);
         p1=round(as*m);
         p2=round(ad*m);
         if p1==0
            select_p1=p1+1;
         else 
            select_p1=p1;
         end
         if p2==0;
            select_p2=p2+1;
         else 
            select_p2=p2;
         end
         E=select_du (select_p1,:);%从交配池中选择交叉个体1
         B=select_du( select_p2,:);%从交配池中选择交叉个体2
         a=rands(1);  %确定交叉概率
         cross_loc=round(rand(1)*20)+1;
         for l=1:21
             if l<cross_loc
                C(l)=E(l);%交配池后新个体1
                D(l)=B(l);%交配池后新个体2
            else 
                C(l)=a*E(l)+(1-a)*B(l);
                D(l)=(1-a)*E(l)+a*B(l);
            end
        end
         cross_p(i,:)=C;
         t=m*2-i+1;
         cross_p(t,:)=D;
     end
     Pm=0.2;%变异算子
     H=rand(1,c);
     G=rand(1,c);
     for i=1:2*m
         mut_p=rand(1);%变异概率
         if mut_p<Pm; 
            H=cross_p(i,:);%选择变异个体
            G=H;
         end
         mut_loc=round(rand(1)*21)+1;%变异位置
         if mut_loc==0
            mut_loc=mut_loc+1;
         end
     if g<1000
        v=30;
         else if g<2000
                    v=20;%变异量大小
                else if g<3000
                           v=5;
                       else v=1;
                       end
         end
     end
     G(mut_loc)=mut_p*H(mut_loc)+v*rands(1);%变异
     cross_p(i,:)=G;
     end
     for i=1:2*m%变异后的个体放入前一代群体中形成新群体
         s=95-i;
         group(s,:)=cross_p(i,:);
     end
    w12=[T(1),T(2);T(3),T(4);T(5),T(6);T(7),T(8);T(9),T(10)];% w12 输入之隐层输入权值
    w012=[T(11);T(12);T(13);T(14);T(15)];% w012 隐层阈值
    w22=[T(16),T(17),T(18),T(19),T(20)];% w22 隐层权值
    w022=[T(21)];% w022 输出层阈值
    sum5=0;
    l=0;
    for l=1:50%  计算最佳个体适应值函数 
        x1=A(1,l)/5;
        x2=A(2,l)/5;
        x=[x1;x2];
        u1=w12*x-w01;
        o1=[1/(1+exp(-u1(1)));1/(1+exp(-u1(2)));1/(1+exp(-u1(3)));1/(1+exp(-u1(4)));1/(1+exp(-u1(5)))];
        y2(l)=w22*o1-w022;
        e=A(3,l)-y2(l);
        sum5=sum5+e^2;
    end
    n(g)=T(22);
end 
sum1=0;
S1=rand(2,50)*4;
S1=0.1*ones(size(S1))+S1+ones(size(S1));%随即产生检验样本
sume=0;
for k=1:50
    x1(k)=S1(1,k);
   x2(k)=S1(2,k);
   y11(k)=(1+x1(k)^(-2)+x2(k)^(-1.5))^2;
   x=[x1(k)/5;x2(k)/5];
   u1=w12*x-w012;
   o1=[1/(1+exp(-u1(1)));1/(1+exp(-u1(2)));1/(1+exp(-u1(3)));1/(1+exp(-u1(4)));1/(1+exp(-u1(5)))];
   y1(k)=w22*o1-w022;
   e(k)=y11(k)-y1(k);
   sum=sum+e(k)^2;
   sum1=sum1+e(k);
   average_E(k)=sum1/50;
   SE=sum/50;
   sume=sume+e(k)^2;
end
average_E=sum1/20%平均误差
S=sqrt(sume/19)%均方差
max=0;
for i=1:50
    if abs(max)<abs(e(i))
        max=e(i);%最大误差
    end
end
max
subplot(3,1,1);plot(e);
grid;
xlabel('检验数据个数');
ylabel('误差');
title('检验误差曲线');
subplot(3,1,2);plot(n);
xlabel('遗传代数T');
ylabel('最佳个体适应值');
%title('最佳个体适应值曲线');
grid;  
subplot(3,1,3);plot(average_fit);
xlabel('遗传代数T');
ylabel('平均适应值');
%title('平均适应值曲线');
grid;  

⌨️ 快捷键说明

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