应用遗传算法求函数最小值

1、遗传算法概论

       遗传算法(GA)可能是最早开发出来的模拟生物遗传系统的算法模型。它首先由Fraser提出,后来有Bremermann和Reed等人

 再次提出。最后,Holland对遗传算法做了大量工作并使之推广,因此被认为是遗传算法的奠基人。遗传算法模拟了基因进化,在这

个模型中,个体的性状通过基因型表达。选择算子(模拟适者生存)与交叉算子(模拟繁殖),是遗传算法的主要驱动算法。

2遗传算法的基本运算过程如下:

a)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。
b)个体评价:计算群体P(t)中各个个体的适应度




c)选择运算将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。
d)交叉运算:将交叉算子作用于群体。遗传算法中起核心作用的就是交叉算子。
e)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。
群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t+1)。
f)终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。
3、应用遗传算法求解函数最小值

     使用的函数为f(x)=7*sin(6*x)+6*cos(5*x),x∈[0,2*pi]

    遗传算法的MATLAB实现如下:

  

L=16;  %编码长度,即用16位二进制表示
N=32;  %种群数目
M=48;  %M>=N,M个中间体,运用算子选择出M/2对母体,进行交叉;对M个中间体进行变异
T=100; %最大繁殖代数
Pc=0.8;  %交叉概率
Pm=0.03;  %变异概率

x1=zeros(1,N);
x2=zeros(1,N);
x4=zeros(1,N);
%grayCode=zeros(1,N)';
grayCode=cell(N,1);
grayCodeNew=cell(N,1);
for i=1:1:N %初始化种群N
    x1(1,i)=rand()*2*pi;
    x2(1,i)=uint16(x1(1,i)/(2*pi)*65535);
    %grayCode(i,:)=num2gray(x2(1,i),L); 
    grayCode{i}=num2gray(x2(1,i),L);
end
%=========进化,开始进行遗传算子操作
for t=1:1:T
    y1=7*sin(6*x1)+6*cos(5*x1);
    for i=1:1:M/2    
        [~,b]=min(y1);
        %grayCodeNew(i,:)=grayCode(b,:);
        grayCodeNew{i}=grayCode{b};
        %grayCodeNew(i+M/2,:)=grayCode(b,:);
        grayCodeNew{i+M/2}=grayCode{b};
        y1(1,b)=inf;
    end
    for i=1:1:M/2  
        p=unidrnd(L);    
        if rand()< Pc %rand()产生一个随机数          
            for j=p:1:L               
                temp=grayCodeNew{i}(j);               
                grayCodeNew{i}(j)=grayCodeNew{M-i+1}(j);              
                grayCodeNew{M-i+1}(j)=temp;
            end
        end
    end
    %将全部染色体按概率进行变异
    for i=1:1:M      
        for j=1:1:L
            if rand()< Pm               
                grayCodeNew{i}(j)=dec2bin(1-bin2dec(grayCodeNew{i}(j)));
            end
        end
    end
    for i=1:1:M
        %x4(1,i)=gray2num(grayCodeNew(i,:));
        x4(1,i)=gray2num(grayCodeNew{i});
    end
    x3=double(x4)*2*pi/65535;
    y3=11*sin(6*x3)+7*cos(5*x3);
    for i=1:1:N  %更新种群
        %[a,b]=min(y3);
        [~,b]=min(y3);
        x1(1,i)=x3(1,b);
        %grayCode(i,:)=grayCodeNew(b,:);
        grayCode{i}=grayCodeNew{b};
        y3(1,b)=inf;
    end
end
%经过第T代后,由x1计算出y1,找出最小者
%x1
y1=11*sin(6*x1)+7*cos(5*x1);
[a,b]=min(y1);
x0=x1(1,b); 
y0=a;      
disp(['x0=',num2str(x0)]);
disp(['y0=',num2str(y0)]);

运行结果如下:

《应用遗传算法求函数最小值》

    原文作者:遗传算法
    原文地址: https://blog.csdn.net/yi_tech_blog/article/details/53336499
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞