编辑: XR30273052 2019-07-15

1 1 kj kj lj lj lj kj a a b a b a a b a b = ? + ? ? ? = ? + ? ? 式中,b 是[0,1] 间的随机数.

5、变异操作 选取第i 个个体的第 j 个基因 ij a 进行变异,变异操作方法如下: ( ) ( ) ( ) ( ) max min 0.5 0.5 ij ij ij ij ij a a a f g r a a a a f g r ? = ? + ? * ≤ ? ? 式中, max a 为基因 ij a 的上界;

min a 为基因 ij a 的下界;

( )

2 2 max

1 g f g r G ? ? = ? ? ? ? ? ;

2 r 为一 个随机数;

g 为当前迭代次数;

max G 为最大进化次数;

r 为[0,1] 间的随机数.

3、MatLab 实现 3.1 程序代码 -

4 - 3.1.1 染色体编码 function ret=Code(lenchrom,bound) %本函数将变量编码成染色体,用于随机初始化一个种群 % lenchrom input : 染色体长度 % bound input : 变量的取值范围 % ret output: 染色体的编码值 pick=rand(1,length(lenchrom));

ret=bound(:,1)'

+(bound(:,2)-bound(:,1))'

.*pick;

%线性插值,编码结果以实数 向量存入ret中3.1.2 适应度函数 function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn) %该函数用来计算适应度值 %x input 个体 %inputnum input 输入层结点数 %outputnum input 输出层结点数 %net input 网络 %inputn input 训练输入数据 %outputn input 训练输出数据 %error output 个体适应度值 %提取 BP神经网络初始权值和阈值,x为个体 w1=x(1:inputnum*hiddennum);

B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);

w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hidd ennum*outputnum);

B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hidd ennum+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;

-

5 - %BP神经网络预测 an=sim(net,inputn);

error=sum(abs(an-outputn));

3.1.3 选择操作 function ret=select(individuals,sizepop) % 该函数用于进行选择操作 % individuals input 种群信息 % sizepop input 种群规模 % ret output 选择后的新种群 % 求适应度值倒数 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 pickpcross continue;

end % 随机选择交叉位置 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;

%交叉结束 end ret=chrom;

3.1.5 变异操作 function ret=Mutation(pmutation,lenchrom,chrom,sizepop,num,maxgen,bound) % 本函数完成变异操作 % pmutation input : 变异概率 % lenchrom input : 染色体长度 % chrom input : 染色体群 -

7 - % sizepop input : 种群规模 % num input : 当前迭代次数 % maxgen input :最大迭代次数 % bound input : 每个个体的上界和下界 % ret output : 交叉后的染色体 for i=1:sizepop %每一轮for循环中,可能会进行一次变异操作,染色体是随机选择的, 变异位置也是随机选择的,但该轮for循环中是否进行变异则由变异概率决定(continue控制). % 随机选择一个染色体进行变异 pick=rand;

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题