遗传算法matlab代码
tmprnd=rand; function youhuafun
tmpind=tmprnd difind=[0,diffD=code; (tmpind)];
N=50; % Tunable if ~any(difind) maxgen=50; % Tunable difind(1)=1; crossrate=0.5; %Tunable end
muterate=0.08; %Tunable childind(k)=scoreind(logical(difingeneration=1; d));
num = length(D); end
fatherrand=randint(num,N,3); fatherrand=fatherrand(:,childind);
score = zeros(maxgen,N); generation=generation+1; while generation<=maxgen end
ind=randperm(N-2)+2; % 随机配对交叉 % score
A=fatherrand(:,ind(1:(N-2)/2)); maxV=max(score,[],2);
B=fatherrand(:,ind((N-2)/2+1:end)); minV=11*300-maxV;
% 多点交叉 plot(minV,'*');title('各代的目标函数值');
rnd=rand(num,(N-2)/2); F4=D(:,4);
ind=rnd tmp=A(ind); -fatherrand(:,1); FF4=F4
A(ind)=B(ind); FF4=max(FF4,1);
B(ind)=tmp; D(:,5)=FF4;
save DData D
% % 两点交叉
% for kk=1:(N-2)/2 function D=code
rndtmp=randint(1,1,num)+1; %load youhua.mat
% tmp=A(1:rndtmp,kk); % properties F2 and F3
A(1:rndtmp,kk)=B(1:rndtmp,kk); %F1=A(:,1);
% B(1:rndtmp,kk)=tmp; F2=A(:,2);
% end F3=A(:,3);
fatherrand=[fatherrand(:,1:2),A,B]; if (max(F2)>1450)||(min(F2)<=900)
error('DATA property F2 exceed it''s
% 变异 range (900,1450]')
rnd=rand(num,N); end
ind=rnd [m,n]=size(ind); % get group property F1 of data, according
tmp=randint(m,n,2)+1; to F2 value
tmp(:,1:2)=0; F4=zeros(size(F1));
fatherrand=tmp+fatherrand; for ite=11:-1:1
fatherrand=mod(fatherrand,3); index=find(F2<=900+ite*50); % fatherrand(ind)=tmp; F4(index)=ite;
end
%评价、选择 D=[F1,F2,F3,F4];
scoreN=scorefun(fatherrand,D);% 求得N
个个体的评价函数 function ScoreN=scorefun(fatherrand,D)
score(generation,:)=scoreN; F3=D(:,3);
[scoreSort,scoreind]=sort(scoreN); F4=D(:,4);
sumscore=cumsum(scoreSort); N=size(fatherrand,2);
sumscore=sumscore./sumscore(end); FF4=F4*ones(1,N);
childind(1:2)=scoreind(end-1:end); FF4rnd=FF4-fatherrand;
for k=3:N FF4rnd=max(FF4rnd,1);
ScoreN=ones(1,N)*300*11; popsize,列数为chromlength的矩阵, % 这里有待优化 % roud对矩阵的每个单元进行圆整。这样产生for k=1:N 的初始种群。
FF4k=FF4rnd(:,k);
for ite=1:11 % 2.2 计算目标函数值
F0index=find(FF4k==ite); % 2.2.1 将二进制数转化为十进制数(1)
if ~isempty(F0index) %遗传算法子程序
tmpMat=F3(F0index); %Name: decodebinary.m
tmpSco=sum(tmpMat); %产生 [2^n 2^(n-1) ... 1] 的行向量,然后求和,
ScoreBin(ite)=mod(tmpSco,300); 将二进制转化为十进制
end function pop2=decodebinary(pop)
end [px,py]=size(pop); %求pop行和列数
Scorek(k)=sum(ScoreBin); for i=1:py
end pop1(:,i)=2.^(py-i).*pop(:,i);
ScoreN=ScoreN-Scorek; end
pop2=sum(pop1,2); %求pop1的每行之和 遗传算法实例:
% 2.2.2 将二进制编码转化为十进制数(2)
% decodechrom.m函数的功能是将染色体(或二% 下面举例说明遗传算法 % 进制编码)转换为十进制,参数spoint
示待解% 求下列函数的最大值 % 码的二进制串的起始位置
% f(x)=10*sin(5x)+7*cos(4x) x?[0,10] % % (对于多个变量而言,如有两个变量,采用20% 将 x 的值用一个10位的二值形式表示为二为表示,每个变量为10,则第一个变量从1开值问题,一个10位的二值数提供的分辨率是每始,另一个变量从11开始。本例为1), 为 (10-0)/(2^10-1)?0.01 。 % % 参数1ength表示所截取的长度(本例为10)。 % 将变量域 [0,10] 离散化为二值域 [0,1023], %遗传算法子程序
x=0+10*b/1023, 其中 b 是 [0,1023] 中的一个%Name: decodechrom.m 二值数。 % %将二进制编码转换成十进制 % % function pop2=decodechrom(pop,spoint,length)
%------------------------------------------------------------pop1=pop(:,spoint:spoint+length-1);
--------------------------------------------------% pop2=decodebinary(pop1); %------------------------------------------------------------
--------------------------------------------------% % 2.2.3 计算目标函数值
% calobjvalue.m函数的功能是实现目标函数的% 编程 计算,其
采用本文示例仿真,可根据不同优%----------------------------------------------- 化问题予以修改。
% 2.1初始化(编码) %遗传算法子程序
% initpop.m函数的功能是实现群体的初始化,%Name: calobjvalue.m popsize表示群体的大小,chromlength表示染%实现目标函数的计算
色体的长度(二值数的长度), function [objvalue]=calobjvalue(pop)
% 长度大小取决于变量的二进制编码的长度(在temp1=decodechrom(pop,1,10); %将pop每行本例中取10位)。 转化成十进制数
%遗传算法子程序 x=temp1*10/1023; %将二值域 中的数转化为变%Name: initpop.m 量域 的数
%初始化 objvalue=10*sin(5*x)+7*cos(4*x); %计算目标函function pop=initpop(popsize,chromlength) 数值
pop=round(rand(popsize,chromlength)); %
rand随机产生每个单元为 {0,1} 行数为% 2.3 计算个体的适应值
%遗传算法子程序 end
%Name:calfitvalue.m end
%计算个体的适应值
% 2.5 交叉 function fitvalue=calfitvalue(objvalue)
% 交叉(crossover),群体中的每个个体之间都以global Cmin;
一定的概率 pc 交叉,即两个个体从各自字符串Cmin=0;
的某一位置 [px,py]=size(objvalue);
% (一般是随机确定)开始互相交换,这类似生for i=1:px
物进化过程中的基因分裂与重组。例如,假设2if objvalue(i)+Cmin>0
个父代个体x1,x2为: temp=Cmin+objvalue(i);
else % x1=0100110 temp=0.0; % x2=1010001
% 从每个个体的第3位开始交叉,交又后得到2end
个新的子代个体y1,y2分别为: fitvalue(i)=temp;
% y1,0100001 end
% y2,1010110 fitvalue=fitvalue';
% 这样2个子代个体就分别具有了2个父代个
% 2.4 选择复制 体的某些特征。利用交又我们有可能由父代个体% 选择或复制操作是决定哪些个体可以进入下在子代组合成具有更高适合度的个体。 一代。程序中采用赌轮盘选择法选择,这种方法% 事实上交又是遗传算法区别于其它传统优化较易实现。 方法的主要特点之一。
% 根据方程 pi=fi/?fi=fi/fsum ,选择步骤: %遗传算法子程序
% 1) 在第 t 代,由(1)式计算 fsum 和 pi %Name: crossover.m % 2) 产生 {0,1} 的随机数 rand( .),求 %交叉
s=rand( .)*fsum function [newpop]=crossover(pop,pc)
% 3) 求 ?fi?s 中最小的 k ,则第 k 个个体[px,py]=size(pop); 被选中 newpop=ones(size(pop)); % 4) 进行 N 次2)、3)操作,得到 N 个个for i=1:2:px-1 体,成为第 t=t+1 代种群 if(rand
分析】选择二进制编码,种群中的个体数目为bestfit=fitvalue(1);
10,二进制编码长度为20,交叉概率为0.95,变for i=2:px
异概率为0.08 if fitvalue(i)>bestfit
【程序清单】 bestindividual=pop(i,:);
%编写目标函数 bestfit=fitvalue(i);
end function[sol,eval]=fitness(sol,options)
end x=sol(1);
eval=x 10*sin(5*x) 7*cos(4*x);
% 2.8 主程序 %把上述函数存储为fitness.m文件并放在工%遗传算法主程序 作目录下
initPop=initializega(10,[0 9],'fitness');%生成%Name:genmain05.m
初始种群,大小为10 clear
clf [x endPop,bPop,trace]=ga([0 popsize=20; %群体大小 9],'fitness',[],initPop,[1e-6 1 chromlength=10; %字符串长度(个体长度) 1],'maxGenTerm',25,'normGeomSelect',...
pc=0.6; %交叉概率
pm=0.001; %变异概率 [0.08],['arithXover'],[2],'nonUnifMutation',[2 25
3]) %25次遗传迭代
运算借过为:x = 异概率为0.08
7.8562 24.8553(当x为7.8562时,f(x)取【程序清单】
最大值24.8553) %编写目标函数
注:遗传算法一般用来取得近似最优解,而不是 function[sol,eval]=fitness(sol,options) 最优解。 x=sol(1);
遗传算法实例2 eval=x+10*sin(5*x)+7*cos(4*x); 【问题】在,5<=Xi<=5,i=1,2区间内,求解 %把上述函数存储为fitness.m文件并放在工
作目录下 f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2
initPop=initializega(10,[0 9],'fitness');%生成x2.^2)))-exp(0.5*(cos(2*pi*x1) cos(2*pi*x2)))
22.71282的最小值。 初始种群,大小为10
【分析】种群大小10,最大代数1000,变异率 [x endPop,bPop,trace]=ga([0 0.1,交叉率0.3 9],'fitness',[],initPop,[1e-6 1 【程序清单】 1],'maxGenTerm',25,'normGeomSelect',...
,源函数的matlab代码
function [eval]=f(sol) [0.08],['arithXover'],[2],'nonUnifMutation',[2 25
3]) %25次遗传迭代 numv=size(sol,2);
运算借过为:x = x=sol(1:numv);
7.8562 24.8553(当x为7.8562时,f(x)取
最大值24.8553) eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(
注:遗传算法一般用来取得近似最优解,而不是sum(cos(2*pi*x))/numv) 22.71282;
%适应度函数的matlab代码 最优解。
遗传算法实例2 function [sol,eval]=fitness(sol,options)
【问题】在,5<=Xi<=5,i=1,2区间内,求解 numv=size(sol,2)-1;
x=sol(1:numv);
eval=f(x); f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-
eval=-eval; exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)))+22.71282
%遗传算法的matlab代码 的最小值。
【分析】种群大小10,最大代数1000,变异率 bounds=ones(2,1)*[-5 5];
0.1,交叉率0.3
【程序清单】 [p,endPop,bestSols,trace]=ga(bounds,'fitness')
注:前两个文件存储为m文件并放在工作目录 ,源函数的matlab代码
下,运行结果为 function [eval]=f(sol)
p = numv=size(sol,2);
0.0000 -0.0000 0.0055 x=sol(1:numv);
大家可以直接绘出f(x)的图形来大概看看f(x)
的最值是多少,也可是使用优化函数来验证。eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(matlab命令行执行命令: sum(cos(2*pi*x))/numv)+22.71282;
%适应度函数的matlab代码 fplot('x 10*sin(5*x) 7*cos(4*x)',[0,9])
evalops是传递给适应度函数的参数,opts是二 function [sol,eval]=fitness(sol,options) 进制编码的精度,termops是选择maxGenTerm numv=size(sol,2)-1; 结束函数时传递个maxGenTerm的参数,即遗 x=sol(1:numv);
传代数。xoverops是传递给交叉函数的参数。 eval=f(x);
mutops是传递给变异函数的参数。 eval=-eval;
%遗传算法的matlab代码
【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大 bounds=ones(2,1)*[-5 5]; 值,其中0<=x<=9
【分析】选择二进制编码,种群中的个体数目为[p,endPop,bestSols,trace]=ga(bounds,'fitness') 10,二进制编码长度为20,交叉概率为0.95,变注:前两个文件存储为m文件并放在工作目录
下,运行结果为 maxvalue=max(fitnessList);
p = indexMax=find(fitnessList==maxvalue,1,'first');
0.0000 -0.0000 0.0055 Best(1,1:VariableNum)=Pop(indexMax,1:Varia大家可以直接绘出f(x)的图形来大概看看f(x)bleNum);
的最值是多少,也可是使用优化函数来验证。Best(1,VariableNum+1)=maxvalue; matlab命令行执行命令: minvalue=min(fitnessList);
fplot('x+10*sin(5*x)+7*cos(4*x)',[0,9]) indexMin=find(fitnessList==minvalue,1,'first'); evalops是传递给适应度函数的参数,opts是二Worst(1,1:VariableNum)=Pop(indexMin,1:Varia进制编码的精度,termops是选择maxGenTermbleNum);
结束函数时传递个maxGenTerm的参数,即遗Worst(1,VariableNum+1)=minvalue; 传代数。xoverops是传递给交叉函数的参数。genetation=1;
mutops是传递给变异函数的参数。 while genetation
1 function value=fitness(varargin)
if VariableNUM==2
n=varargin{1,1}; 染色体为1到18的整数组成的随机序列。 value=n(1,1)^2-n(1,1)*n(1,2)+n(1,3);
适应度f的计算:对种群中的每个染色体vi,已知n个城市之间的相互距离,现有一个推销员
计算其适应度,f=σd(t(i),t(i+1)). 必须遍访这n个城市,并且每个城市
评价函数eval(vi):用来对种群中的每个染色只能访问一次,最后又必须返回出发城市。如何
安排他对这些城市的访问次序,可使其 体vi设定一个概率,以使该染色体被选中 旅行路线的总长度最短,
的可能性与其种群中其它染色体的适应性成比,用图论的术语来说,假设有一个图g=(v,e)例,既通过轮盘赌,适应性强的染色体被 其中v是顶点集,e是边集,设d=(dij) 选择产生后台的机会要大,设alpha?(0,1),是由顶点i和顶点j之间的距离所组成的距离矩本文定义基于序的评价函数为eval(vi)=al 阵,旅行商问题就是求出一条通过所有顶 pha*(1-alpha).^(i-1) 。[随机规划与模糊点且每个顶点只通过一次的具有最短距离的回
路。 规划]
这个问题可分为对称旅行商问题(dij=dji,,
选择过程:选择过程是以旋转赌轮pop-size次任意i,j=1,2,3,…,n)和非对称旅行商 为基础,每次旋转都为新的种群选择一个
染色体。赌轮是按每个染色体的适应度进行选择问题(dij?dji,,任意i,j=1,2,3,…,n)。 染色体的。
若对于城市v={v1,v2,v3,…,vn}的一个访问step1 、对每个染色体vi,计算累计概率qi,
q0=0;qi=σeval(vj) j=1,…,i;i=1, 顺序为t=(t1,t2,t3,…,ti,…,tn),其中 …pop-size.
ti?v(i=1,2,3,…,n),且记tn+1= t1,则step2、从区间(0,pop-size)中产生一个随机旅行商问题的数学模型为: 数r;
min l=σd(t(i),t(i+1)) (i=1,…,n)
step3、若qi-1 step4、重复step2和step3旅行商问题是一个典型的组合优化问题,并且是
一个np难问题,其可能的路径数目 共pop-size次,这样可以得到pop-size个
复制的染色体。 与城市数目n是成指数型增长的,所以一般很难
grefenstette编码:由于常规的交叉运算和精确地求出其最优解,本文采用遗传算法
求其近似解。 变异运算会使种群中产生一些无实际意义的 遗传算法: 染色体,本文采用grefenstette编码《遗传初始化过程:用v1,v2,v3,…,vn代表所选n算法原理及应用》可以避免这种情况的出现 个城市。定义整数pop-size作为染色体的个数 。所谓的grefenstette编码就是用所选队员
在未选(不含淘汰)队员中的位置,如: ,并且随机产生pop-size个初始染色体,每个8 15 2 16 10 7 4 3 11 14 6 12 9 5 18
13 17 1 则跳入适应度f的计算;是,结束遗传 对应:
8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2 操作,跳出。
1。 matlab 代码
distTSP.txt 交叉过程:本文采用常规单点交叉。为确定交叉
0 6 18 4 8 操作的父代,从 到pop-size重复以下过 7 0 17 3 7
4 4 0 4 5 程:从[0,1]中产生一个随机数r,如果r 将20 19 24 0 22
8 8 16 6 0 所选的父代两两组队,随机产生一个位置进行交
%GATSP.m 叉,如:
8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2 function gatsp1() 1 clear;
6 12 3 5 6 8 5 6 3 1 8 5 6 3 3 2 1 1 load distTSP.txt;
distance=distTSP; 交叉后为:
N=5; 8 14 2 13 8 6 3 2 5 1 8 5 6 3 3 2 1
1 ngen=100;
ngpool=10; 6 12 3 5 6 8 5 6 3 7 3 4 3 2 4 2 2 1
%ngen=input('# of generations to 变异过程:本文采用均匀多点变异。类似交叉操
evolve = '); 作中选择父代的过程,在r 选择多个染色体vi%ngpool=input('# of chromosoms in the
gene pool = '); % size of genepool 作为父代。对每一个选择的父代,随机选择多个
gpool=zeros(ngpool,N+1); % gene pool 位置,使其在每位置
for i=1:ngpool, % intialize gene pool 按均匀变异(该变异点xk的取值范围为gpool(i,:)=[1 randomize([2:N]')' 1];
for j=1:i-1 [ukmin,ukmax],产生一个[0,1]中随机数r,while gpool(i,:)==gpool(j,:)
gpool(i,:)=[1 randomize([2:N]')' 1]; 该点
end 变异为x'k=ukmin+r(ukmax-ukmin))操作。end
end 如:
8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2
1 costmin=100000;
tourmin=zeros(1,N); 变异后:
8 14 2 13 10 6 3 2 2 7 3 4 5 2 4 1 2 cost=zeros(1,ngpool); 1 increase=1;resultincrease=1;
for i=1:ngpool, 反grefenstette编码:交叉和变异都是在cost(i)=sum(diag(distance(gpool(i,
:)',rshift(gpool(i,:))'))); grefenstette编码之后进行的,为了循环操end
% record current best solution 作
[costmin,idx]=min(cost); 和返回最终结果,必须逆grefenstette编码tourmin=gpool(idx,:);
disp([num2str(increase) 'minmum trip 过程,将编码恢复到自然编码。
length = ' num2str(costmin)]) 循环操作:判断是否满足设定的带数xzome,否,
costminold2=200000;costminold1=150
000;resultcost=100000; for i=1:copygpool
tourminold2=zeros(1,N); for j=ngpool:-1:2*i+2
tourminold1=zeros(1,N); gpool(j,:)=gpool(j-1,:); resulttour=zeros(1,N); end
while gpool(2*i+1,:)=gpool(i,:);
end (abs(costminold2-costminold1) ;100
if copygpool==0 )&(abs(costminold1-costmin) ;100)&
gpool(ngpool,:)=gpool(1,:); (increase ;500)
end
costminold2=costminold1; %=========
tourminold2=tourminold1; %when genaration is more than 50,or costminold1=costmin;tourminold1=tothe patterns in a couple are too urmin; close,do mutation
increase=increase+1; for i=1:ngpool/2
if resultcost>costmin %
resultcost=costmin; sameidx=[gpool(2*i-1,:)==gpool(2*iresulttour=tourmin; ,:)];
resultincrease=increase-1; diffidx=find(sameidx==0); end if length(diffidx)<=2
for i=1:ngpool, gpool(2*i,:)=[1 randomize([2:12]')' cost(i)=sum(diag(distance(gpool(i,1];
:)',rshift(gpool(i,:))'))); end
end end
% record current best solution %===========
[costmin,idx]=min(cost); %cross gens in couples tourmin=gpool(idx,:); for i=1:ngpool/2
%============== [gpool(2*i-1,:),gpool(2*i,:)]=cros% copy gens in th gpool according to sgens(gpool(2*i-1,:),gpool(2*i,:)); the probility ratio end
% >1.1 copy twice
% >=0.9 copy once for i=1:ngpool,
% ;0.9 remove cost(i)=sum(diag(distance(gpool(i,[csort,ridx]=sort(cost); :)',rshift(gpool(i,:))'))); % sort from small to big. end
csum=sum(csort); % record current best solution caverage=csum/ngpool; [costmin,idx]=min(cost); cprobilities=caverage./csort; tourmin=gpool(idx,:); copynumbers=0;removenumbers=0; disp([num2str(increase) 'minmum trip for i=1:ngpool, length = ' num2str(costmin)]) if cprobilities(i) >1.1 end
copynumbers=copynumbers+1;
end disp(['cost function evaluation: ' if cprobilities(i) <0.9 int2str(increase) ' times!']) removenumbers=removenumbers+1; disp(['n:' int2str(resultincrease)]) end disp(['minmum trip length = ' end num2str(resultcost)])
copygpool=min(copynumbers,removenudisp('optimum tour = ') mbers); disp(num2str(resulttour))
%=================================if col==0, % row vector, rotate left
=================== y = [x(2:n) x(1)]; function B=randomize(A,rowcol) elseif col==1, % Usage: B=randomize(A,rowcol) y = [x(2:n); x(1)]; % rotate up % randomize row orders or column end
elseif dir==0, % default rotate right orders of A matrix
% rowcol: if =0 or omitted, row order or down
col==0, (default) if
y = [x(n) x(1:n-1)]; % if = 1, column order
elseif col==1 % column vector
y = [x(n); x(1:n-1)]; rand('state',sum(100*clock))
if nargin == 1, end
rowcol=0; end
end %=================================if rowcol==0, ================= [m,n]=size(A); function [L1,L2]=crossgens(X1,X2) =rand(m,1); % Usage:[L1,L2]=crossgens(X1,X2) p
[p1,I]=sort(p); s=randomize([2:12]')'; B=A(I,:); n1=min(s(1),s(11));n2=max(s(1),s(1elseif rowcol==1, 1));
Ap=A'; X3=X1;X4=X2;
[m,n]=size(Ap); for i=n1:n2,
p=rand(m,1); for j=1:13,
[p1,I]=sort(p); if X2(i)==X3(j), B=Ap(I,:)'; X3(j)=0;
end end
%=================================if X1(i)==X4(j), X4(j)=0; ==================== end
function y=rshift(x,dir) end
% Usage: y=rshift(x,dir) end
% rotate x vector to right (down) by j=13;k=13;
1 if dir = 0 (default) for i=12:-1:2, % or rotate x to left (up) by 1 if dir if X3(i)~=0,
= 1 j=j-1;
if nargin ;2, dir=0; end t=X3(j);X3(j)=X3(i);X3(i)=t; [m,n]=size(x); end
if m>1, if X4(i)~=0,
if n == 1, k=k-1;
col=1; t=X4(k);X4(k)=X4(i);X4(i)=t; elseif n>1, end
error('x must be a vector! break'); end
end % x is a column vectorelseif m == for i=n1:n2
1, X3(2+i-n1)=X2(i); if n == 1, y=x; X4(2+i-n1)=X1(i); return end
elseif n>1, L1=X3;L2=X4;
col=0; % x is a row vector endend %=======================
if dir==1, % rotate left or up 由于BP网络的权值优化是一个无约束优化问题~
而且权值要采用实数编码~所以直接利用Matlabhold on
遗传算法工具箱。以下贴出的代码是为一个19plot(trace(:,1),trace(:,2),'b-'); 输入变量~1个输出变量情况下的非线性回归而xlabel('Generation'); 设计的~如果要应用于其它情况~只需改动编解ylabel('Fittness'); 码函数即可。 %下面将初步得到的权值矩阵赋给尚未开始训练
GA训练BP权值的主函数 程序一:的BP网络
function net=GABPNET(XX,YY) [W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x);
%------------------------------------------------------------net.LW{2,1}=W1;
-------------- net.LW{3,2}=W2;
% GABPNET.m net.b{2,1}=B1;
% 使用遗传算法对BP网络权值阈值进行优化,net.b{3,1}=B2;
再用BP算法训练网络 XX=P;
%------------------------------------------------------------YY=T;
-------------- %设置训练参数
%数据归一化预处理 net.trainParam.show=1; nntwarn off net.trainParam.lr=1; XX=premnmx(XX); net.trainParam.epochs=50; YY=premnmx(YY); net.trainParam.goal=0.001; %创建网络 %训练网络
net=newff(minmax(XX),[19,25,1],{'tansig','tansig','net=train(net,XX,YY); purelin'},'trainlm'); 程序二:适应值函数
%下面使用遗传算法对网络进行优化 function [sol, val] = gabpEval(sol,options)
P=XX; % val - the fittness of this individual T=YY; % sol - the individual, returned to allow for
R=size(P,1); Lamarckian evolution S2=size(T,1); % options - [current_generation] S1=25;%隐含层节点数 load data2
S=R*S1+S1*S2+S1+S2;%遗传算法编码长度 nntwarn off
aa=ones(S,1)*[-1,1]; XX=premnmx(XX);
popu=50;%种群规模 YY=premnmx(YY);
initPpp=initializega(popu,aa,'gabpEval');%初始化P=XX;
种群 T=YY;
gen=100;%遗传代数 R=size(P,1);
%下面调用gaot工具箱,其中目标函数定义为S2=size(T,1);
gabpEval S1=25;%隐含层节点数
[x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[S=R*S1+S1*S2+S1+S2;%遗传算法编码长度 1e-6 1 1],'maxGenTerm',gen,... for i=1:S,
'normGeomSelect',[0.09],['arithXover'],[2],'nonUn x(i)=sol(i);
ifMutation',[2 gen 3]); end;
%绘收敛曲线图 [W1, B1, W2, B2, P, T, A1, A2, SE, figure(1) val]=gadecod(x);
plot(trace(:,1),1./trace(:,3),'r-');
hold on 程序三:编解码函数
plot(trace(:,1),1./trace(:,2),'b-'); function [W1, B1, W2, B2, P, T, A1, A2, SE,
xlabel('Generation'); val]=gadecod(x)
ylabel('Sum-Squared Error'); load data2
figure(2) nntwarn off
plot(trace(:,1),trace(:,3),'r-'); XX=premnmx(XX);
YY=premnmx(YY);
P=XX;
T=YY;
R=size(P,1);
S2=size(T,1);
S1=25;%隐含层节点数
S=R*S1+S1*S2+S1+S2;%遗传算法编码长度 % 前R*S1个编码为W1
for i=1:S1,
for k=1:R,
W1(i,k)=x(R*(i-1)+k);
end
end
% 接着的S1*S2个编码(即第R*S1个后的编码)为W2
for i=1:S2,
for k=1:S1,
W2(i,k)=x(S1*(i-1)+k+R*S1);
end
end
% 接着的S1个编码(即第R*S1+S1*S2个后的编码)为B1
for i=1:S1,
B1(i,1)=x((R*S1+S1*S2)+i);
end
% 接着的S2个编码(即第R*S1+S1*S2+S1个后的编码)为B2
for i=1:S2,
B2(i,1)=x((R*S1+S1*S2+S1)+i);
end
% 计算S1与S2层的输出
A1=tansig(W1*P,B1); A2=purelin(W2*A1,B2); % 计算误差平方和
SE=sumsqr(T-A2); val=1/SE; % 遗传算法的适应值