数学建模(2)——改进的遗传算法(GA)

来源:互联网 发布:航拍视频软件 编辑:程序博客网 时间:2024/06/06 07:47

改进的遗传算法

基于上一篇文章的遗传算法,在交叉和变异算子上进行改进

交叉算子

配对方式

在上一节中,父代个体按照顺序依次两两配对,在此,先将父代以适应度函数(目标函数)值进行排序,目标函数值小的与小的配对,大的与大的配对。

交叉点的选取

上一节中随机产生交叉点,在此,使用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处的两个基因发生了变异    endG=[A;B;C]; 
阅读全文
0 0