📄 genn_improved.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 + -