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

📄 genn_improved.m

📁 遗传算法改进神经网络程序
💻 M
字号:
% genn_improved.m
clear all
NNTWARN OFF
%(Pi,Ti)为样本,FieldDR为变量范围
p=-1:0.01:1;
t=sin(3*p)+1;
%p=rand(2,20);
%t=sin(2*p(1,:)+p(2,:));

%网络结构确定
[r,q]=size(p);
[s2,q]=size(t);
s1=5;
[w1,b1]=rands(s1,r);
[w2,b2]=rands(s2,s1);
f1='tansig';
f2='purelin';


% 必要参数 一维10二维20?
NIND = 100;			    %每个种群个体数目(系统要求每个子群的个体数相同)
NVAR = r*s1+s1*s2+s1+s2; 			    %变量个数
%OBJ_F='realmodel_fun'; 		%目标函数名称
MAXGEN = 500;     		%最大遗传代数
GGAP = 2;               %代沟(可选)
SUBPOP=1;        		%子群的个数
all_nind=NIND*SUBPOP;

%遗传循环中的参数
RFun=[2 0];             %适应度分配方法
SEL_F='sus';   			%选择函数名称,(rws轮盘 sus随机遍历抽样)
XOV_F='reclinex';			%交叉函数名称
PX=1;				    %交叉概率
MUT_F='mutbga';			%变异函数名称
PM=1/NVAR;			    %变异概率
SHRINKING=0;            %变异步长收缩率
MUTOPT=[PM SHRINKING];  %综和变异参数
SEL=1; 				    %重插方法SELECT 0_UNIFORM 1_FITNESS_BASE
INSR = 0.8;             %重插概率
INSOPT=[SEL,INSR];		%综合前面两个的参数




%初始化种群
FieldDR=repmat([-2.5;2.5],[1,NVAR]);    %1:NVAR
%FieldDR=[-3 4.1;12.1 5.8];
Chrom = crtrp(all_nind,FieldDR);  

%计算初始化种群的目标值
%ObjV=feval(OBJ_F,Chrom);
SSE=zeros(all_nind,1);
for i=1:all_nind
        first_v=Chrom(i,1:s1*(r+1));
        [w1,b1]=VtoM(first_v,s1,r,1);
    a1 = feval(f1,w1*p,b1);
        second_v=Chrom(i,s1*(r+1)+1:NVAR);
        [w2,b2]=VtoM(second_v,s2,s1,1);
    a2 = feval(f2,w2*a1,b2);
    e = t-a2;
    SSE(i)= sumsqr(e); 
end
ObjV=SSE;
ObjVSel=ObjV;
newplot;
h = plotfa(p,t,p,a2);


%遗传循环
gen=0;
trace=zeros(MAXGEN,2);							%遗传算法性能跟踪
while gen < MAXGEN,
    %判断是否结束
    [index1,index2]=min (ObjV);
    index1
    if index1<0.02
        message = 'ok';
        fprintf(message,0,SSEval)
        %SSEval
        first_v=Chrom(index2,1:s1*(r+1));
            [w1,b1]=VtoM(first_v,s1,r,1);
        a1 = feval(f1,w1*p,b1);
            second_v=Chrom(index2,s1*(r+1)+1:NVAR);
            [w2,b2]=VtoM(second_v,s2,s1,1);
        w1
        b1
        w2
        b2
        hold on;
        plot (trace (:,1));
        %hold on;
        plot (trace (:,2),'-.');grid;
        legend ('种群均值的变化','解的变化')
        [value,index]=min(trace(:,1))
        return;
    end
	FitnV = ranking(ObjV,RFun,SUBPOP);						%计算适应度,求最大值时,应为ranking(-ObjV,RFun,SUBPOP)
	SelCh = select(SEL_F,Chrom,FitnV,GGAP,SUBPOP);				%选择
	%SelCh = recombin(XOV_F,SelCh,PX,SUBPOP);				%交叉重组
    SelCh = reclinex(SelCh,[], FieldDR);
	SelCh = mutate(MUT_F,SelCh,FieldDR,MUTOPT,SUBPOP);					%变异(subpop取消了)
	%计算种群的目标值
    nn=size(SelCh,1);
    SSEval=zeros(nn,1);
    for i=1:nn
            first_v=SelCh(i,1:s1*(r+1));
            [w1,b1]=VtoM(first_v,s1,r,1);
        a1 = feval(f1,w1*p,b1);
            second_v=SelCh(i,s1*(r+1)+1:NVAR);
            [w2,b2]=VtoM(second_v,s2,s1,1);
        a2 = feval(f2,w2*a1,b2);
        e = t-a2;
        SSEval(i)= sumsqr(e);
        if i==index2
            delete(h);
            h = plot(p,a2);
            drawnow;    
        end
    end
     ObjVSel=SSEval;
    
    %局部搜索
    localN=20;
    localpt=0.1;
    %[SelCh,ObjVSel]=localsearch(SelCh,ObjVSel,localN,FieldDR,OBJ_F,localpt);
    [mvalue,mindex]=min(ObjVSel);
    distance=(FieldDR(2,:)-FieldDR(1,:))*localpt/2;
    new=[SelCh(mindex,:)-distance;SelCh(mindex,:)+distance];
    localFieldDR(1,:)=max(new(1,:),FieldDR(1,:));
    localFieldDR(2,:)=min(new(2,:),FieldDR(2,:));
    localChrom = crtrp(localN,localFieldDR);
    %localObjV=feval(OBJ_F,localChrom);
        for i=1:localN
            first_v=localChrom(i,1:s1*(r+1));
            [w1,b1]=VtoM(first_v,s1,r,1);
            a1 = feval(f1,w1*p,b1);
            second_v=localChrom(i,s1*(r+1)+1:NVAR);
            [w2,b2]=VtoM(second_v,s2,s1,1);
            a2 = feval(f2,w2*a1,b2);
            e = t-a2;
            SSEval(i)= sumsqr(e);
        end
        localObjV=SSEval;
    [newmvalue,newmindex]=min(localObjV);
    if mvalue>newmvalue 
        SelCh(mindex,:)=localChrom(newmindex,:);
        ObjVSel(mindex)=localObjV(newmindex);
    end
    %全局搜索
    globalN=50;
    globalpt=0.9;
    %[SelCh,ObjVSel]=globalsearch(SelCh,ObjVSel,globalN,FieldDR,OBJ_F,globalpt);
    [mvalue,mindex]=min(ObjVSel);
distance=(FieldDR(2,:)-FieldDR(1,:))*globalpt/2;
new=[SelCh(mindex,:)-distance;SelCh(mindex,:)+distance];
globalFieldDR(1,:)=max(new(1,:),FieldDR(1,:));
globalFieldDR(2,:)=min(new(2,:),FieldDR(2,:));
globalChrom = crtrp(globalN,globalFieldDR);
%globalObjV=feval(OBJ_F,globalChrom);
for i=1:globalN
            first_v=globalChrom(i,1:s1*(r+1));
            [w1,b1]=VtoM(first_v,s1,r,1);
            a1 = feval(f1,w1*p,b1);
            second_v=globalChrom(i,s1*(r+1)+1:NVAR);
            [w2,b2]=VtoM(second_v,s2,s1,1);
            a2 = feval(f2,w2*a1,b2);
            e = t-a2;
            SSEval(i)= sumsqr(e);
        end
        globalObjV=SSEval;
[newmvalue,newmindex]=min(globalObjV);
if mvalue>newmvalue 
    SelCh(mindex,:)=globalChrom(newmindex,:);
    ObjVSel(mindex)=globalObjV(newmindex);
end
    
    [Chrom ObjV]=reins(Chrom,SelCh,SUBPOP,INSOPT,ObjV,ObjVSel);	%重插,求最大值时reins(Chrom,SelCh,SUBPOP,INSOPT,-ObjV,-ObjVSel)
   
    %migrate
    %MigOpt=[0.2 1 1];
    %[Chrom, ObjV] = migrate(Chrom, SUBPOP, MigOpt, ObjV);
    
	gen = gen+1;
    trace (gen,1)=min (ObjV);                % 遗传算法性能跟踪
    trace (gen,2)=sum (ObjV)/length (ObjV); 
	
end
w1
b1
w2
b2
globalObjV
SSEval
plot (trace (:,1));hold on;
plot (trace (:,2),'-.');grid;
legend ('种群均值的变化','解的变化')
[value,index]=min(trace(:,1))
fprintf('no');

⌨️ 快捷键说明

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