改进的遗传算法
基于上一篇文章的遗传算法,在交叉和变异算子上进行改进
交叉算子
配对方式
在上一节中,父代个体按照顺序依次两两配对,在此,先将父代以适应度函数(目标函数)值进行排序,目标函数值小的与小的配对,大的与大的配对。
交叉点的选取
上一节中随机产生交叉点,在此,使用Logistics混沌序列确定交叉点位置。即取一个(0,1)区间上的随机数作为初值,然后利用x(n)=4*x(n-1)(1-x(n-1))迭代产生一个(0,1)区间的混沌值,保存以上混沌值作为产生下一代交叉项的混沌迭代初值,再把这个值分别乘以100再加上2,最后取整作为交叉点,得到整个混沌序列,互换交叉点的基因,形成新的子代,仅仅更换部分点基因,没有连成片段,改动较小,这样可以避免遗传算法在组合优化应用中产生的寻优抖振问题。
变异算子
上一节中,随机产生三个2~101之间的整数u、v、w,随后把把u,v之间(包括u和v)的基因段插到w后面进行换位变异。在此,首先根据给定的变异率,随机选取两个2~101之间的整数,对这两个数对应位置的基因进行变异,把这两个基因替换成利用混沌序列产生的新的基因值,从而得到新的染色体,进行移位变异。(数学建模算法与应用第二版称之为移位变异,第一版改进的遗传算法中却还是沿用的换位变异)
交叉变异代码
(在此只贴出交叉变异的代码,可以直接替换上一章交叉变异部分的代码)
%遗传算法实现过程
A=J;
for k=1:dai %产生 0~1 间随机数列进行编码
B=A; %交配产生子代 B
for i=1:2:w
ch0=rand;ch(1)=4*ch0*(1-ch0); %产生混沌序列的初始值
for j=2:50
ch(j)=4*ch(j-1)*(1-ch(j-1)); %产生混沌序列
end
ch=2+floor(100*ch); %产生交叉点
temp=B(i,ch);
B(i,ch)=B(i+1,ch);
B(i+1,ch)=temp; %交叉
end
%变异产生子代 C
by=[ ]; %为了防止下面产生空地址,这里先初始化
while ~~isempty(by)
by=find(rand(1,w)<0.1);%产生变异操作地址
end
num1=length(by);
C=A(by,:);%产生变异操作的初始染色体
ch2=rand;%产生混沌序列的初始值
for t=2:2*num1
ch2(t)=4*ch2(t-1)*(1-ch2(t-1));%产生混沌序列
end
for j=1:num1
bw=sort(2+floor(100*rand(1,2)));%随机产生变异操作的两个地址
C(j,bw)=ch2([j,j+1]);%对bw处的两个基因发生了变异
end
G=[A;B;C];