编辑: 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;