遗传神经 *** 识别原理
4.3.1 遗传BP简介
遗传识别是遗传算法+神经 *** 的一种新兴的寻优技术,适合于复杂的、叠加的非线性系统的辨识描述。神经 *** 算法是当前较为成熟的识别分类 *** ,但 *** 权值的训练一直存在着缺陷。为此结合具体应用,在对遗传算法进行改进的基础上,本文采用了一种基于遗传学习权值的神经 *** 识别 *** ,并取得了较好的效果。
尽管常规遗传算法是稳健的,但针对一个具体问题遗传算法只有和其他 *** (或称原有算法)有效地结合在一起,组成一个新的混合算法,才能在实际中得到广泛应用。混合算法既要保持原有算法的长处,又要保持遗传算法的优点,因此常规遗传算法中的适应值函数、编码、遗传算子等必须做适当的修改以适应混合算法的要求。
4.3.1.1 适应值信息
常规算法中,适应值常被表示为全局极小,用欧氏距离来实现。例如,适应值常被表示为如下形式:
储层特征研究与预测
式中:)Yi为第i 个样本的实际输出,Yi为第i 个样本的期望输出,N 为学习样本数。这种表示法的单点拟合能力较强,能够满足精度要求,但大多数情况下,还要考虑样本整体的一些性质,如方差、连续性等。适应值作为GA中的惟一使用信息,除了体现样本的差异性,还 应当兼顾样本间的相关性。这样就在一定程度上克服了剧烈振荡、 *** 容错能力差等弱点。因此,我们将灰色系统的灰关联引入进来,在保证样本的遗传操作的同时,加强样本间横向上的联系,从而更有效地选择权值。
设 X0={X0(K),K=1,2,…,n}为母序列,Xi={Xi(K),K=1,2,…,n i=1,2,…,m}为子序列。
则关联系数为:
储层特征研究与预测
关联度为:
储层特征研究与预测
4.3.1.2 编码问题
二进制位串编码是GA中常见的编码技术。但在实际编程中,采用浮点数直接表示更有利。主要有以下原因:
(1)避免了因 *** 权值范围不明确,难以进行编码的困难;
(2)取消了编码、译码过程,提高了学习算法的速度;
(3)十进制数字串的引入,在数字串长度不变的情况下,计算精度可以大为提高。例如,用七位二进制数字串来表示(-10,10)之间的数值,则精度更高为:
储层特征研究与预测
用同样长度的十进制数字串来表示(-10,10)之间的数值,去掉符号位和小数点所占用的一位,余下的四位表示小数值,则精度更高可以达到0.0001。
4.3.1.3 修改杂交算子
由于编码方式的改变,杂交算子可以设计为具有数值特点的向量的线性组合。通常表示为如下形式:
若有两个个体Sa、Sb杂交,则产生的个体为
储层特征研究与预测
其中u的取值在(0,1),也可根据情况适当缩小取值范围。当u取常数时,杂交算子即为一致杂交,当u随代数变化时,杂交算子则为非一致杂交。
在遗传算法中,随着迭代次数的增加,个体的平均性能逐步提高,个体间的差异缩小。为了防止个体趋向一致,影响算法的收敛性能,本文对u作了如下改变,令
储层特征研究与预测
其中t为当前代数,T为预置更大代数,随着代数的增加,u从1到0变化,完成杂交的渐变过程。
4.3.1.4 修改变异算子
设个体x=(v1,v2,…,vn),则每个分量以一定概率进行变异,一次变异后的结果为(v1,…,,…,vn),1<=K<=n,的值按下面的随机方式决定:
储层特征研究与预测
式中:LB,UB为第K个变量的左、右邻居,函数Δ(t,y)返回(0,y)上的一个值,并使这个值随着代数t的增大而接近于0,这样选取的函数允许这个算子在算法的开始阶段一致搜索整个空间,而在算法的后阶段进行局部搜索。
储层特征研究与预测
式中:r为[0,1]上的随机数,T为预置的更大代数,t为当前代数,b是决定非一致程度的参数,这里取为0.5。
4.3.1.5 成熟前收敛问题
成熟前收敛是指GA不能再产生性能超过父代的后代,尽管尚未达到全局更优解,主要表现形式是连续数代或数十代适应值不发生变化。它与其他 *** 中的局部极值问题很相似,但又不同,因为它并不一定出现在局部极小点。目前解决这一问题的 *** 主要有:重新启动法、动态参数编码法、混合法等。为了便于程序表现,我们引进了一个动态记忆窗口W,W用来记录从当前代开始更优目标值保持连续不变的代数。当W达到某个给定的值时,就认为出现了成熟前收敛,这时就令杂交算子和变异算子突然增大,实现基因的重组。当然用这种 *** 来判别收敛问题是不严格的,对一个算法收敛性能的评价主要应体现在时间复杂性和空间复杂性上。对于像GA这样带有随机搜索性质的具体 *** ,理论上说,只有当随机数字完全取尽,目标值仍未改变才可认为是成熟前收敛。但在实际中是不可能这样做的。因此可根据随机数的总个数,每次计算出最多取多少个随机参数,来大致估算所需的次数,这个次数就可认为是动态记忆机制W。
4.3.2 遗传BP *** 结构
遗传算法一般可以通过两种方式应用到神经 *** 中。一种方式是利用遗传算法训练已知结构的 *** ,优化 *** 的连接权;另一种方式是利用遗传算法寻找 *** 的规模、结构和学习参数。目前这种 *** 在理论上还不完全成熟,寻优机理、学习效率等有待进一步研究,离实际应用还有一定的距离。
对多层前馈神经 *** ,目前用得最多的学习算法是BP算法。然而由于BP本身固有的学习机理的限制,从根本上改进BP算法是很困难的。BP的学习过程实际上是连接权的重组优化过程,因此在保持 *** 结构的前提下,寻找一种能使连接权达到更优组合的学习 *** ,具有一定的实际意义。
利用GA的优点来克服BP算法收敛慢和易局部收敛的缺陷,同时与BP算法的结合,也解决了单独利用GA往往只能在短时间内寻找到接近更优解的近优解这一问题,引入BP算法的梯度信息将会避免这种现象。GA与BP算法可以有多种不同的组合 *** :
先BP后GA:先用BP培训一个预先选定结构的ANN(人工神经 *** )直到平均误差不再有意义地减少时为止,然后在此基础上再用GA进行若干代的优化。重复进行这样的搜索,直到误差范围达到满意的要求或者发现搜索不收敛为止。这种组合 *** 的基本思想是先用BP确定使误差函数取极小值的参数组合在参数空间的位置,再利用GA摆脱掉可能的局部极小。应用这种组合必须事先选定ANN的结构。即只能用它确定ANN的连接权重。显然,如果事先选择的ANN结构不合理或有关的参数(如学习率等)不合适,可能会导致搜索不收敛。
先GA后BP:先用GA反复优化描述ANN模型的参数组合,直到适应函数的平均不再有意义地增加为止。在此基础上再用 BP算法对它们进行优化。这种组合 *** 的基本思想是先用GA粗选ANN模型,再用 BP算法精细与优化。这种组合 *** 的优点是通用性好,既可像前一组合 *** 那样用来优选指定结构下的部分参数,也可用来优选其他的参数,例如 ANN 的结构、学习率等,甚至还可用于优选它们的组合。
图4-4 GABP结构图
上面两种组合GA与 BP的 *** 是比较基本的两种,以它们为基础可以衍生出多种具体的实现方案。但由于 BP 算法本身也有许多参数需要选定,而且选择 *** 也无规则可循,因而组合 GA 与BP在一定程度上也使待解决的问题更加复杂化。为此,这里提出了一种改进的GABP *** ,即利用 BP *** 的非线性分类能力和 *** 结构来设计分类器,将遗传学习的结果直接送入 *** ,不再经过BP优化,通过 *** 结构输出结果。这种改进既体现了系统的非线性,与前面的处理 *** 相衔接,又通过GA的学习优化了权值,提高了运算速度。该 *** 为一个三层 BP *** ,结构如图4-4所示。
4.3.3 遗传BP计算过程
遗传BP算法的具体步骤:
(1)随机产生N组(-1,1)区间内取值的初始 *** 权值。
(2)用BP算法对这N组始值分别进行训练,若这N组权值中至少已有一组满足精度要求,则算法结束;否则转入步骤(3)。
(3)分别依据经过训练的这N组较好的权值所对应的上下限确定取值区间,在区间内再随机生产成N组新的权限,连同经过训练的N组权值在一起,构成一个完整的基因群体,共2*N组权值。
(4)从这2*N组权值进行选择、交叉、变异等遗传操作。
(5)从经过遗传操作的这2*N组权值中选出N组较好的,回复到步骤(2)。
图4-5 改进的 GABP计算流程图
GABP的计算过程图如图4-5所示。
遗传算法为什么可以优化bp神经 ***
遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索更优解的 *** 。遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成。每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的 *** ,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。因此,在一开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择(selection)个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的更优个体经过解码(decoding),可以作为问题近似更优解。
基于遗传算法的BP神经 ***
源码地址:
介绍:
利用遗传算法并行地优化BP *** 的权值和阈值,从而避免了BP *** 在优化权值和阈值时陷入局部更优的缺点
背景:
这个项目的背景为客运量和货运量的预测
文件介绍:
因为项目中用到了GAOT工具包中的函数,所以需要将GAOT工具包加入路径。
操作步骤为:点击GAOT文件---添加到路径---选定文件夹和子文件夹
这样,工程中就可以调用GAOT工具包中的函数了
源码地址:
关于遗传算法优化BP神经 *** 的问题
程序:
1、未经遗传算法优化的BP神经 *** 建模
clear;
clc;
%%%%%%%%%%%%%输入参数%%%%%%%%%%%%%%
N=2000; %数据总个数
M=1500; %训练数据
%%%%%%%%%%%%%训练数据%%%%%%%%%%%%%%
for i=1:N
input(i,1)=-5+rand*10;
input(i,2)=-5+rand*10;
end
output=input(:,1).^2+input(:,2).^2;
save data input output
load data.mat
%从1到N随机排序
k=rand(1,N);
[m,n]=sort(k);
%找出训练数据和预测数据
input_train=input(n(1:M),:)';
output_train=output(n(1:M),:)';
input_test=input(n((M+1):N),:)';
output_test=output(n((M+1):N),:)';
%数据归一化
[inputn,inputs]=mapminmax(input_train);
[outputn,outputs]=mapminmax(output_train);
%构建BP神经 ***
net=newff(inputn,outputn,5);
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.0000004;
%BP神经 *** 训练
net=train(net,inputn,outputn);
%测试样本归一化
inputn_test=mapminmax('apply',input_test,inputs);
%BP神经 *** 预测
an=sim(net,inputn_test);
%% *** 得到数据反归一化
BPoutput=mapminmax('reverse',an,outputs);
figure(1)
%plot(BPoutput,':og');
scatter(1:(N-M),BPoutput,'rx');
hold on;
%plot(output_test,'-*');
scatter(1:(N-M),output_test,'o');
legend('预测输出','期望输出','fontsize',12);
title('BP *** 预测输出','fontsize',12);
xlabel('样本','fontsize',12);
xlabel('优化前输出的误差','fontsize',12);
figure(2)
error=BPoutput-output_test;
plot(1:(N-M),error);
xlabel('样本','fontsize',12);
ylabel('优化前输出的误差','fontsize',12);
%save net net inputs outputs
2、遗传算法优化的BP神经 *** 建模
(1)主程序
%清空环境变量
clc
clear
%读取数据
load data.mat
%节点个数
inputnum=2;
hiddennum=5;
outputnum=1;
%训练数据和预测数据
input_train=input(1:1500,:)';
input_test=input(1501:2000,:)';
output_train=output(1:1500)';
output_test=output(1501:2000)';
%选连样本输入输出数据归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%构建 ***
net=newff(inputn,outputn,hiddennum);
%% 遗传算法参数初始化
maxgen=10; %进化代数,即迭代次数
sizepop=30; %种群规模
pcross=[0.3]; %交叉概率选择,0和1之间
pmutation=[0.1]; %变异概率选择,0和1之间
%节点总数
numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
lenchrom=ones(1,numsum);
bound=[-3*ones(numsum,1) 3*ones(numsum,1)]; %数据范围
%------------------------------------------------------种群初始化------------------------------%------------------
--------
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,inputnum,hiddennum,outputnum,net,inputn,outputn); %染色体的适应度
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,inputnum,hiddennum,outputnum,net,inputn,outputn);
end
%找到最小和更大适应度的染色体及它们在种群中的位置
[newbestfitness,newbestindex]=min(individuals.fitness);
[worestfitness,worestindex]=max(individuals.fitness);
% 代替上一次进化中更好的染色体
if bestfitnessnewbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
%avgfitness=sum(individuals.fitness)/sizepop;
% trace=[trace;avgfitness bestfitness]; %记录每一代进化中更好的适应度和平均适应度
end
%% 遗传算法结果分析
%figure(3)
%[r c]=size(trace);
%plot([1:r]',trace(:,2),'b--');
%title(['适应度曲线 ' '终止代数=' num2str(maxgen)]);
%xlabel('进化代数');ylabel('适应度');
%legend('平均适应度','更佳适应度');
disp('适应度 变量');
x=bestchrom;
%% 把更优初始阀值权值赋予 *** 预测
% %用遗传算法优化的BP *** 进行值预测
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x
(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2;
%% BP *** 训练
% *** 进化参数
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
%net.trainParam.goal=0.00001;
% *** 训练
[net,per2]=train(net,inputn,outputn);
%% BP *** 预测
%数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
an=sim(net,inputn_test);
test_simu=mapminmax('reverse',an,outputps);
error=test_simu-output_test;
%figure(4);
hold on;plot(1:500,error,'r');
legend('优化前的误差','优化后的误差','fontsize',12)
(2)编码子程序code.m
function ret=Code(lenchrom,bound)
%本函数将变量编码成染色体,用于随机初始化一个种群
% lenchrom input : 染色体长度
% bound input : 变量的取值范围
% ret output: 染色体的编码值
flag=0;
while flag==0
pick=rand(1,length(lenchrom));
ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %线性插值,编码结果以实数向量存入ret中
flag=test(lenchrom,bound,ret); %检验染色体的可行性
end
(3)适应度函数fun.m
function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)
%该函数用来计算适应度值
%x input 个体
%inputnum input 输入层节点数
%outputnum input 隐含层节点数
%net input ***
%inputn input 训练输入数据
%outputn input 训练输出数据
%error output 个体适应度值
%提取
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
net=newff(inputn,outputn,hiddennum);
% *** 进化参数
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;
% *** 权值赋值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2;
% *** 训练
net=train(net,inputn,outputn);
an=sim(net,inputn);
error=sum(abs(an-outputn));
(4)选择操作Select.m
function ret=select(individuals,sizepop)
% 该函数用于进行选择操作
% individuals input 种群信息
% sizepop input 种群规模
% ret output 选择后的新种群
%求适应度值倒数
[a bestch]=min(individuals.fitness);
%b=individuals.chrom(bestch);
%c=individuals.fitness(bestch);
fitness1=10./individuals.fitness; %individuals.fitness为个体适应度值
%个体选择概率
sumfitness=sum(fitness1);
sumf=fitness1./sumfitness;
%采用轮盘赌法选择新个体
index=[];
for i=1:sizepop %sizepop为种群数
pick=rand;
while pick==0
pick=rand;
end
for i=1:sizepop
pick=pick-sumf(i);
if pick0
index=[index i];
break;
end
end
end
%index=[index bestch];
%新种群
individuals.chrom=individuals.chrom(index,:); %individuals.chrom为种群中个体
individuals.fitness=individuals.fitness(index);
%individuals.chrom=[individuals.chrom;b];
%individuals.fitness=[individuals.fitness;c];
ret=individuals;
(5)交叉操作cross.m
function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
%本函数完成交叉操作
% pcorss input : 交叉概率
% lenchrom input : 染色体的长度
% chrom input : 染色体群
% sizepop input : 种群规模
% ret output : 交叉后的染色体
for i=1:sizepop %每一轮for循环中,可能会进行一次交叉操作,染色体是随机选择的,交叉位置也是随机选择的,%但该轮for循环中是否进行交叉操作则由交叉概率决定(continue控制)
% 随机选择两个染色体进行交叉
pick=rand(1,2);
while prod(pick)==0
pick=rand(1,2);
end
index=ceil(pick.*sizepop);
% 交叉概率决定是否进行交叉
pick=rand;
while pick==0
pick=rand;
end
if pickpcross
continue;
end
flag=0;
while flag==0
% 随机选择交叉位
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同
pick=rand; %交叉开始
v1=chrom(index(1),pos);
v2=chrom(index(2),pos);
chrom(index(1),pos)=pick*v2+(1-pick)*v1;
chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束
flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性
flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性
if flag1*flag2==0
flag=0;
else flag=1;
end %如果两个染色体不是都可行,则重新交叉
end
end
ret=chrom;
(6)变异操作Mutation.m
function ret=Mutation(pmutation,lenchrom,chrom,sizepop,num,maxgen,bound)
% 本函数完成变异操作
% pcorss input : 变异概率
% lenchrom input : 染色体长度
% chrom input : 染色体群
% sizepop input : 种群规模
% opts input : 变异 *** 的选择
% pop input : 当前种群的进化代数和更大的进化代数信息
% bound input : 每个个体的上届和下届
% maxgen input :更大迭代次数
% num input : 当前迭代次数
% ret output : 变异后的染色体
for i=1:sizepop %每一轮for循环中,可能会进行一次变异操作,染色体是随机选择的,变异位置也是随机选择的,
%但该轮for循环中是否进行变异操作则由变异概率决定(continue控制)
% 随机选择一个染色体进行变异
pick=rand;
while pick==0
pick=rand;
end
index=ceil(pick*sizepop);
% 变异概率决定该轮循环是否进行变异
pick=rand;
if pickpmutation
continue;
end
flag=0;
while flag==0
% 变异位置
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick*sum(lenchrom)); %随机选择了染色体变异的位置,即选择了第pos个变量进行变异
pick=rand; %变异开始
fg=(rand*(1-num/maxgen))^2;
if pick0.5
chrom(i,pos)=chrom(i,pos)+(bound(pos,2)-chrom(i,pos))*fg;
else
chrom(i,pos)=chrom(i,pos)-(chrom(i,pos)-bound(pos,1))*fg;
end %变异结束
flag=test(lenchrom,bound,chrom(i,:)); %检验染色体的可行性
end
end
ret=chrom;
遗传算法跟神经 *** 之间是什么关系
神经 *** 的设计要用到遗传算法,遗传算法在神经 *** 中的应用主要反映在3个方面: *** 的学习, *** 的结构设计, *** 的分析。
1.遗传算法在 *** 学习中的应用
在神经 *** 中,遗传算法可用于 *** 的学习。这时,它在两个方面起作用
(1)学习规则的优化
用遗传算法对神经 *** 学习规则实现自动优化,从而提高学习速率。
(2) *** 权系数的优化
用遗传算法的全局优化及隐含并行性的特点提高权系数优化速度。
2.遗传算法在 *** 设计中的应用
用遗传算法设计一个优秀的神经 *** 结构,首先是要解决 *** 结构的编码问题;然后才能以选择、交叉、变异操作得出更优结构。编码 *** 主要有下列3种:
(1)直接编码法
这是把神经 *** 结构直接用二进制串表示,在遗传算法中,“染色体”实质上和神经 *** 是一种映射关系。通过对“染色体”的优化就实现了对 *** 的优化。
(2)参数化编码法
参数化编码采用的编码较为抽象,编码包括 *** 层数、每层神经元数、各层互连方式等信息。一般对进化后的优化“染色体”进行分析,然后产生 *** 的结构。
(3)繁衍生长法
这种 *** 不是在“染色体”中直接编码神经 *** 的结构,而是把一些简单的生长语法规则编码入“染色体”中;然后,由遗传算法对这些生长语法规则不断进行改变,最后生成适合所解的问题的神经 *** 。这种 *** 与自然界生物地生长进化相一致。
3.遗传算法在 *** 分析中的应用
遗传算法可用于分析神经 *** 。神经 *** 由于有分布存储等特点,一般难以从其拓扑结构直接理解其功能。遗传算法可对神经 *** 进行功能分析,性质分析,状态分析。
遗传算法虽然可以在多种领域都有实际应用,并且也展示了它潜力和宽广前景;但是,遗传算法还有大量的问题需要研究,目前也还有各种不足。首先,在变量多,取值范围大或无给定范围时,收敛速度下降;其次,可找到更优解附近,但无法精确确定最扰解位置;最后,遗传算法的参数选择尚未有定量 *** 。对遗传算法,还需要进一步研究其数学基础理论;还需要在理论上证明它与其它优化技术的优劣及原因;还需研究硬件化的遗传算法;以及遗传算法的通用编程和形式等。
关于神经 *** ,蚁群算法和遗传算法
神经 *** 并行性和自适应性很强,应用领域很广,在任何非线性问题中都可以应用,如控制、信息、预测等各领域都能应用。
蚁群算法最开始应用于TSP问题,获得了成功,后来又广泛应用于各类组合优化问题。但是该算法理论基础较薄弱,算法收敛性都没有得到证明,很多参数的设定也仅靠经验,实际效果也一般,使用中也常常早熟。
遗传算法是比较成熟的算法,它的全局寻优能力很强,能够很快地趋近较优解。主要应用于解决组合优化的NP问题。
这三种算法可以相互融合,例如GA可以优化神经 *** 初始权值,防止神经 *** 训练陷入局部极小且加快收敛速度。蚁群算法也可用于训练神经 *** ,但一定要使用优化后的蚁群算法,如更大-最小蚁群算法和带精英策略。
0条大神的评论