
该程序是遗传算法优化BP神经网络函数极值寻优:
%% 该代码为基于神经网络遗传算法的系统极值寻优
%% 清空环境变量
clc
clear
%% 初始哗李冲化遗传算法参数
%初始化参数
maxgen=100%进化代数,即迭代次数
sizepop=20 %种群规模
pcross=[0.4] %交叉概率选择,0和1之间
pmutation=[0.2] %变异概率选择,0和1之间
lenchrom=[1 1] %每个变量的字串长度,如果是浮点变量,则长度都为1
bound=[-5 5-5 5] %数据范围
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]) %将种群信息定义为一个结构体
avgfitness=[] %每一代种群的平均适应度
bestfitness=[]%每一代种群的最佳适应度
bestchrom=[] %适应度最好的染色体
%% 初始化种群计算适应度值
% 初始化种群
for i=1:sizepop
%随机产生一个种群
individuals.chrom(i,:)=Code(lenchrom,bound)
x=individuals.chrom(i,:)
%计算适应度
individuals.fitness(i)=fun(x) %染色体的适应度
end
%找最好的染色体
[bestfitness bestindex]=min(individuals.fitness)
bestchrom=individuals.chrom(bestindex,:) %最好的染色体
avgfitness=sum(individuals.fitness)/sizepop%染色体的平均适应度
% 记录每一代进化中最好的适应度和平均适应度
trace=[avgfitness bestfitness]
%% 迭代寻优
% 进化开始
for i=1:maxgen
i
% 选择
individuals=Select(individuals,sizepop)
avgfitness=sum(individuals.fitness)/sizepop
%交叉
individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound)
% 变异
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,[i maxgen],bound)
% 计算适应度
for j=1:sizepop
x=individuals.chrom(j,:)%解码
individuals.fitness(j)=fun(x)
end
%找到最小和最大适应度的染色体及它们在种群中的位置
[newbestfitness,newbestindex]=min(individuals.fitness)
[worestfitness,worestindex]=max(individuals.fitness)
% 代替上一扰型次进化中最好的染色体
if bestfitness>newbestfitness
bestfitness=newbestfitness
bestchrom=individuals.chrom(newbestindex,:)
end
individuals.chrom(worestindex,:)=bestchrom
individuals.fitness(worestindex)=bestfitness
avgfitness=sum(individuals.fitness)/sizepop
trace=[traceavgfitness bestfitness]%记录每一代进化中最好的适应度和平均适应度
end
%进化结束
%% 结果分析
[r c]=size(trace)
plot([1:r]',trace(:,2),'r-')
title('适应度曲线','fontsize',12)
xlabel('进化代数','fontsize',12)ylabel('适应度','fontsize',12)
axis([0,100,0,1])
disp('适应度 变量')
x=bestchrom
% 窗口显示
disp([bestfitness x])
给你来一段%主程序核昌
%数据归一化预处理
nntwarn off
[pn,minp,maxp]=premnmx(p)
pp=(pn+1)/2
[tn,mint,maxt]=premnmx(t)
%建立BP网络
net=newff(minmax(pp),[15,1],{'logsig','purelin'},'trainlm')
%应用遗传算法对优化网络初始值
in=size(pn,1)
out=size(tn,1)
hi=15%隐含层节点数
L=in*hi+hi*out+hi+out%遗传算法编码长度
aa=ones(L,1)*[-1,1]
popu=50%种群规模
initPpp=initializega(popu,aa,'ISeval')%初始化种群
gen=100%遗传世代
%调用GAOT工具箱,其中目标函数定义为ISeval
[x,endPop,bPop,trace]=ga(aa,'ISeval',[],initPpp,[1e-6 1 1],'maxGenTerm',…
,gen,'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3])
%绘收敛曲线图
figure(1)
plot(trace(:,1),1./trace(:,3),'r-')
hold on
plot(trace(:,1),1./trace(:,2),'b-')
xlabel('Generation')
ylabel('Sum-Squared Error')
figure(2)
plot(trace(:,1),trace(:,3),'r-')
hold on
plot(trace(:,1),trace(:,2),'b-')
xlabel('Generation')
ylabel('Fittness')
%将得到的权值矩阵赋给尚未开始训毁中练的BP网络
[w1,b1,w2,b2,a1,a2,se,eval]=IScode(x)%调用自定义编解码函数
%创建网络
net.iW{1,1}=w1
net.LW{2,1}=w2
net.b{1,1}=b1
net.b{2,1}=b2
%设置训练参数
net.trainParam.show=10
net.trainParam.epochs=5000
net.trainParam.goal=0.05
%训练网络
net=train(net,pp,t)
%自定义目标函数
function [sol, eval] = ISeval(sol,options)
% eval - the fittness of this individual
% sol - the individual, returned to allow for Lamarckian evolution
% options - [current_generation]
p=[]%原始输入数据
t=[]%原始输出数据
in=size(p,1)
out=size(t,1)
hi=15%隐含层节纤氏山点数
L=in*hi+hi*out+hi+out%遗传算法编码长度
for i=1:L,
x(i)=sol(i)
end
[w1, b1, w2, b2, a1, a2, se, eval]=IScode(x)
%自定义编解码函数
function [w1, b1, w2, b2, a1, a2, se, eval]=IScode(x)
[pn,minp,maxp]=premnmx(p)
pp=(pn+1)/2
[tn,mint,maxt]=premnmx(t)
in=size(pn,1)%输入层结点数
out=size(tn,1)%隐含层结点数
hi=15%隐含层结点数
L=in*hi+hi*out+hi+out%遗传算法编码长度
% 前in*hi个编码为w1
for i=1:hi,
for j=1:in,
w1(i,j)=x(in*(i-1)+j)
end
end
% 接着的hi*out个编码为w2
for i=1:out,
for j=1:hi,
w2(i,j)=x(hi*(i-1)+j+in*hi)
end
end
% 接着的hi个编码为b1
for i=1:hi,
b1(i,1)=x((in*hi+hi*out)+i)
end
% 最后的out个编码b2
for i=1:out,
b2(i,1)=x((in*hi+hi*out+hi)+i)
end
% 计算hi层与out层的输出
a1=tansig(w1*pp,b1)
a2=purelin(w2*a1,b2)
% 计算误差平方和
se=sumsqr(t-a2)eval=1/se% 遗传算法的适应值
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)