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

📄 xw_ga_ann19.m

📁 这个程序是关于遗传算法结合人工神经网络算法的源代码
💻 M
字号:
%Genetic algorithm for solving simple optimization problem
%f(x)=x1^2+x2^2,-5<=x1<=5,-5<=x2<=5
%The strategy of optimal maintaince in the algorithm
clear all;
clc;
format long;
Population_Size=200;
String_Length=190;
chromosome=round(rand(Population_Size,String_Length));
chromosome_change=zeros(Population_Size,String_Length);
flag=1;
fitness_function=zeros(1,Population_Size);
selected=zeros(1,Population_Size);
generation=1;
maxsat=0;
a1=zeros(3,5,10);
a2=zeros(1,4,10);
param1=zeros(3,5);
param2=zeros(1,4);
x_param1=zeros(3,5);
y_param2=zeros(1,4);
while(flag>0)&(generation<1000)
    sum_fit=0;
    for i=1:Population_Size
        param1=zeros(3,5);
        param2=zeros(1,4);
        x_param1=zeros(3,5);
        y_param2=zeros(1,4);
        a1(1,1,1:10)=chromosome(i,1:10);a1(1,2,1:10)=chromosome(i,11:20);a1(1,3,1:10)=chromosome(i,21:30);
        a1(1,4,1:10)=chromosome(i,31:40);a1(1,5,1:10)=chromosome(i,41:50);a1(2,1,1:10)=chromosome(i,51:60);
        a1(2,2,1:10)=chromosome(i,61:70);a1(2,3,1:10)=chromosome(i,71:80);a1(2,4,1:10)=chromosome(i,81:90);
        a1(2,5,1:10)=chromosome(i,91:100); a1(3,1,1:10)=chromosome(i,101:110); a1(3,2,1:10)=chromosome(i,111:120);
        a1(3,3,1:10)=chromosome(i,121:130); a1(3,4,1:10)=chromosome(i,131:140);a1(3,5,1:10)=chromosome(i,141:150);
        a2(1,1,1:10)=chromosome(i,151:160); a2(1,2,1:10)=chromosome(i,161:170); a2(1,3,1:10)=chromosome(i,171:180);
        a2(1,4,1:10)=chromosome(i,181:190);
        
         for k=1:3
             for r=1:5
                 for j=1:10
                     param1(k,r)=param1(k,r)+a1(k,r,j)*pow2(j-1);
                 end
             end
         end
         for k=1:4
             for j=1:10
                 param2(1,k)=param2(1,k)+a2(1,k,j)*pow2(j-1);
             end
         end
            
        m=pow2(10)-1;
        for k=1:3
             for r=1:5
                 x_param1(k,r)=-15+param1(k,r)/m*32;
             end
         end
         for k=1:4
             y_param2(1,k)=-15+param2(1,k)/m*32;
         end
        
        fitness_function(1,i)=xw_ga_ann19_fitness( x_param1,y_param2);
        %fitness_function(1,i)=x1^2+x2^2+x3^2+x4^2+x5^2+x6^2+x7^2+x8^2+x9^2+x10^2;
        if(fitness_function(1,i)>maxsat)
            maxsat=fitness_function(1,i);
            optimal_1=x_param1;
            optimal_2=y_param2;
            optimal_3=fitness_function(1,i);
        end
        if(fitness_function(1,i)<=0.001)
            flag=-1;
            %optimal
            %generation
            break;
        else sum_fit=sum_fit+fitness_function(1,i);
        end
        if(flag<0)
            break;
        end
    end
    if(flag>0)
        %the first select
        sum_fit=sum_fit-fitness_function(1,Population_Size);
        for i=1:Population_Size-1
            x=round(randn(1)*1023);
            sum=round(sum_fit);
            rr=rem(x,sum);
            n=1;ba=1;
            partsum=0;
            while((partsum<rr)&(n<Population_Size-1))
                parsum=partsum+fitness_function(1,n);
                ba=n;
                n=n+1;
            end
            selected(1,i)=ba;
        end
        %reproduce
        for i=1:Population_Size-1
            for j=1:String_Length
                chromosome_change(i,j)=chromosome(selected(1,i),j);
            end
            fitness_function(1,i)=fitness_function(1,selected(1,i));
        end
        %select before crossover
        for i=1:Population_Size-1
            x=round(rand(1)*32367);
            sum=round(sum_fit);
            rr=rem(x,sum)+1;
            n=1;
            partsum=0;
            while((partsum<rr)&(n<=Population_Size-1))
                partsum=partsum+fitness_function(1,n);
                bba=n;
                n=n+1;
            end
            selected(1,i)=bba;
        end
        %crossover
        maxsw=max(fitness_function);
        for i=1:Population_Size/2-1
            parent1=selected(1,i);
            parent2=selected(1,Population_Size-1-i);
            child1=i;
            child2=Population_Size-1-i;
            pc=0.8;
            randnum=rand(1);
            if randnum<pc
             site1=round(rand(1)*String_Length);
                for j=1:String_Length
                    if(j<site1)
                    chromosome(child1,j)=chromosome_change(parent1,j);
                    chromosome(child2,j)=chromosome_change(parent2,j);
                    else 
                    chromosome(child1,j)=chromosome_change(parent2,j);
                    chromosome(child2,j)=chromosome_change(parent1,j);
                    end
                end
            end
        end
        %mutation
        pm=0.1;
        for i=1:Population_Size-1            
            for j=1:String_Length
                randnum=rand(1);                
                if(randnum<pm)
                    chromosome(i,j)=~chromosome(i,j);%变异取反
                    %else
                   % chromosome(i,j)=~chromosome(i,j);%变异取反
                end
            end
        end
    end
    generation=generation+1;
end
%**************************************************
%ANN start
sensorN=3;%神经元数
stopR=50000;%训练停止回合数
h=1;%学习率
%------------------------------%
%trainS=1:1:100;
%trainD=1./trainS;%训练样本
trainS=[1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 ];
maxp=max(trainS);
minp=min(trainS);
for i=1:16
    trainS(i)=(trainS(i)-minp)/(maxp-minp)*0.9+0.05;
end
trainD=[293093 304085 306170 280292 305141 297637 288059 278856 271417 276324 274278 280969 301697 312743 356720 446320];
maxt=max(trainD);
mint=min(trainD);
for i=1:16
    trainD(i)=(trainD(i)-mint)/(maxt-mint)*0.9+0.05;
end
%trainS=1:1:100;
%trainD=1./trainS;%训练样本
HLW=randn(sensorN,5);%隐含层权值
%HLW=[x1,x2; x3,x4; x5,x6];
HLW=optimal_1;
HLV=zeros(sensorN,1);%隐含层诱导局部域
HLOut=zeros(sensorN,1);%隐含层输出
HLG=zeros(sensorN,1);%隐含层G
OLW=randn(1,sensorN+1);%输出层权值
%OLW=[x7 x8 x9 x10];
OLW=optimal_2;
OLV=zeros(1,1);%输出层诱导局部域
OLY=zeros(1,1);%输出层输出值
OLG=zeros(1,1);%输出层G

%经验初值 3个隐含神经元
for j=1:stopR %训练回合 停止条件为固定的训练回合 有待改进为其他的停止准则
    for i=4:(length(trainD)-1)
        HLV=HLW*[trainD(i);trainD(i-1);trainD(i-2);trainD(i-3);1];
        HLOut=1./(1+exp(-HLV));
        OLV=OLW*[HLOut;1];
        OLY=1./(1+exp(-OLV));
        OLG=(trainD(i+1)-OLY)*(OLY.*(1-OLY));
        HLG=(HLOut.*(1-HLOut)).*(OLW(:,1:sensorN)'*OLG);
        OLW=OLW+h*OLG*[HLOut;1]';
        HLW=HLW+h*HLG*[trainD(i),trainD(i-1),trainD(i-2),trainD(i-3),1];
    end
end
%train=[1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 ];
%maxp=2003;
%minp=min(trainS);
%for i=1:17
 %   trainS(i)=(trainS(i)-minp)/(maxp-minp)*0.9+0.05;
 %end
trainD=[293093 304085 306170 280292 305141 297637 288059 278856 271417 276324 274278 280969 301697 312743 356720 446320 ];
maxt=446320;
mint=min(trainD);
for i=1:16
    trainD(i)=(trainD(i)-mint)/(maxt-mint)*0.9+0.05;
end
trainanswer=zeros(1,length(trainD)-3);
for i=4:(length(trainS))
        HLV=HLW*[trainD(i);trainD(i-1);trainD(i-2);trainD(i-3);1];
        HLOut=1./(1+exp(-HLV));
        OLV=OLW*[HLOut;1];
        OLY=1./(1+exp(-OLV));
        trainanswer(i-3)=OLY;
    end
 trainD=[293093 304085 306170 280292 305141 297637 288059 278856 271417 276324 274278 280969 301697 312743 356720 446320 460000 ];  
 maxt=446320;
 mint=min(trainD);
for i=1:17
    trainD(i)=(trainD(i)-mint)/(maxt-mint)*0.9+0.05;
end
trainP=zeros(1,length(trainanswer));
trainP=trainD(1,5:17);
k=1992:1:2004;
plot(k,trainP,'r',k,trainanswer,'b+');
xlabel('年份');
ylabel('归一化军费额度(+表示)');

⌨️ 快捷键说明

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