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

改进的遗传算法

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

交叉算子

配对方式

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

交叉点的选取

上一节中随机产生交叉点,在此,使用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]; 
    原文作者:遗传算法
    原文地址: https://blog.csdn.net/longxinghaofeng/article/details/77584952
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞