计算智能——遗传算法

 遗传算法

       遗传算法是一种通过模拟自然进化过程搜索最优解的方法。遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体。在一开始需要实现从表现型到基因型的映射编码工作。通过二进制编码仿造基因编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并进行组合交叉和变异,产生出代表新的解集的种群。

1.算法概述

遗传算法的基本思想是从初始种群出发,采用优胜劣汰、适者生存的自然法则选择个体,并通过杂交、变异来产生新一代种群,如此逐代进化,直到满足目标为止。遗传算法所涉及到的基本概念主要有以下几个:

• 种群:种群是指用遗传算法求解问题时, 初始给定的多个解的集合。遗传算法的求解过程是从这个子 集开始的。

•个体:个体是指种群中的单个元素,它通常 由一个用于描述其基本遗传结构的数据结构来表示。例如,可以用0、1组成的长度为l的串来表示个体。    
遗传算法概述
• 染色体:染色体是指对个体进行编码后 所得到的编码串。染色体中的每1位称为基因,染色体上由若干个基因构成的一个有效信息段称为基因组。

• 适应度函数:适应度函数是一种用来对种群中各个个体的环境适应性进行度量的函数。其函数值是遗传算法实现优胜劣汰的主要依据

• 遗传操作:遗传操作是指作用于种 群而产生新的种群的操作。标准的遗传操作包括以下3种基本形式:

– 选择 – 杂交 – 变异

2.算法步骤

开始循环直至找到满意的解。

1.评估每条染色体所对应个体的适应度。

2.遵照适应度越高,选择概率越大的原则,从种群中选择两个个体作为父方和母方。

3.抽取父母双方的染色体,进行交叉,产生子代。

4.对子代的染色体进行变异。

5.重复2,3,4步骤,直到新种群的产生。

结束循环。

3.算法实例

  建立了Griewank、Rastrigin、Schaffer三个适应度函数,通过matlab编程实现对应的遗传算法,找到函数的极小值点既图像的低谷

算法代码

GA.m

% Optimizing a function  using Simple Genetic Algorithm with elitist preserved

%Max f(x1,x2)=100*(x1*x1-x2).^2+(1-x1).^2; -2.0480<=x1,x2<=2.0480


%下面为代码。函数最大值为3904.9262,此时两个参数均为-2.0480,有时会出现局部极值,此时一个参数为-2.0480,一个为2.0480。变
%异概率pm=0.05,交叉概率pc=0.8。

clc;clear all;

format long;%设定数据显示格式

%初始化参数

T=500;%仿真代数

N=80;% 群体规模

pm=0.05;pc=0.8;%交叉变异概率

umax=30;umin=-30;%参数取值范围

L=10;%单个参数字串长度,总编码长度Dim*L
Dim=5;%Dim维空间搜索

bval=round(rand(N,Dim*L));%初始种群,round函数为四舍五入

bestv=-inf;%最优适应度初值
funlabel=2;       %选择待优化的函数,1为Rastrigin,2为Schaffer,3为Griewank
Drawfunc(funlabel);%画出待优化的函数,只画出二维情况作为可视化输出

%迭代开始

for ii=1:T

%解码,计算适应度

    for i=1:N  %对每一代的第i个粒子
        for k=1:Dim
            y(k)=0;
            for j=1:1:L  %从1到L,每次加以1

               y(k)=y(k)+bval(i,k*L-j+1)*2^(j-1);%把第i个粒子转化为十进制的值,例如y1是第一维

            end 
            x(k)=(umax-umin)*y(k)/(2^L-1)+umin;%转化为实际的x1
        end

  %     obj(i)=100*(x1*x1-x2).^2+(1-x1).^2; %目标函数 
       obj(i)=fun(x,funlabel);
       xx(i,:)=x;

    end

    func=obj;%目标函数转换为适应度函数

    p=func./sum(func);

    q=cumsum(p);%累加

    [fmax,indmax]=max(func);%求当代最佳个体

   if fmax>=bestv

      bestv=fmax;%到目前为止最优适应度值

      bvalxx=bval(indmax,:);%到目前为止最佳位串

      optxx=xx(indmax,:);%到目前为止最优参数

   end   

   Bfit1(ii)=bestv; % 存储每代的最优适应度

%%%%遗传操作开始

%轮盘赌选择

 for i=1:(N-1)

    r=rand;

    tmp=find(r<=q);

    newbval(i,:)=bval(tmp(1),:);

 end

  newbval(N,:)=bvalxx;%最优保留

  bval=newbval;

%单点交叉

    for i=1:2:(N-1)

       cc=rand;

       if cc<pc

           point=ceil(rand*(2*L-1));%取得一个1到2L-1的整数

           ch=bval(i,:);

           bval(i,point+1:2*L)=bval(i+1,point+1:2*L);

           bval(i+1,point+1:2*L)=ch(1,point+1:2*L);

        end

    end   

    bval(N,:)=bvalxx;%最优保留

    %位点变异

    mm=rand(N,Dim*L)<pm;%N行

    mm(N,:)=zeros(1,Dim*L);%最后一行是精英不变异,强制赋0

    bval(mm)=1-bval(mm); 

end

%输出
figure;

plot(-Bfit1);% 绘制最优适应度进化曲线

bestv   %输出最优适应度值

optxx    %输出最优参数
 

fun.m

function y = fun(x,label)
%函数用于计算粒子适应度值
%x           input           输入粒子 
%y           output          粒子适应度值 
if label==1
    y=-Rastrigin(x);
elseif label==2
    y=-Schaffer(x);
else
    y=-Griewank(x);
end

Drawfunc.m

function Drawfunc(label)

x=-5:0.05:5;%41列的向量
if label==1
    y = x;
    [X,Y] = meshgrid(x,y);
    [row,col] = size(X);
    for  l = 1 :col
         for  h = 1 :row
            z(h,l) = Rastrigin([X(h,l),Y(h,l)]);
        end
    end
    surf(X,Y,z);
    shading interp
    xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis'); 
    title('mesh'); 
end

if label==2
    y = x;
    [X,Y] = meshgrid(x,y);
    [row,col] = size(X);
    for  l = 1 :col
         for  h = 1 :row
            z(h,l) = Schaffer([X(h,l),Y(h,l)]);
        end
    end
    surf(X,Y,z);
    shading interp 
    xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis'); 
    title('mesh'); 
end

if label==3
    y = x;
    [X,Y] = meshgrid(x,y);
    [row,col] = size(X);
    for  l = 1 :col
         for  h = 1 :row
            z(h,l) = Griewank([X(h,l),Y(h,l)]);
        end
    end
    surf(X,Y,z);
    shading interp 
    xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis'); 
    title('mesh'); 
end



    

Griewank.m

function y=Griewank(x)
%Griewan函数
%输入x,给出相应的y值,在x=(0,0,…,0)处有全局极小点0.
%编制人:
%编制日期:
[row,col]=size(x);
if row>1
    error('输入的参数错误');
end
y1=1/4000*sum(x.^2);
y2=1;
for h=1:col
    y2=y2*cos(x(h)/sqrt(h));
end
y=y1-y2+1;
%y=-y;

Rastrigin.m

function y = Rastrigin(x)
% Rastrigin函数
% 输入x,给出相应的y值,在x = ( 0 , 0 ,…, 0 )处有全局极小点0.
% 编制人:
% 编制日期:
[row,col] = size(x);
if  row > 1 
    error( ' 输入的参数错误 ' );
end
y =sum(x.^2-10*cos(2*pi*x)+10);
%y =-y;

Schaffer.m

function y=Schaffer(x)

[row,col]=size(x);
if row>1
    error('输入的参数错误');
end
y1=x(1,1);
y2=x(1,2);
temp=y1^2+y2^2;
y=0.5-(sin(sqrt(temp))^2-0.5)/(1+0.001*temp)^2;
y=-y;

实验结果

因为初始的种群是随机生成的,所以需要将每个适应度函数都运行5遍,以观察遗传算法的效果

在最优适应度进化曲线图当中,横坐标是遗传代数,纵坐标是每代最优适应度

1.Rastrigin适应度函数

2.Schaffer适应度函数

3.Griewank适应度函数

实验结果分析

因为我们设定的三个适应度函数都是求极小值的,所以可以看到最优适应度进化曲线都是呈梯度下降的趋势,

而且基本上在300代后趋于稳定最优。 遗传算法和传统的迭代算法比较有更高的效率, 在传统算法中, 需要3重

for循环, 冗余度大,耗时长,而遗传算法通过变异、 选择、 杂交可以大大缩短搜索时间。

算法比较

传统优化算法

优点:1:利用了解空间的特性,如可微等。2:理论较为完善,计算量小。3:收敛速度快。4:具有确定的终止准则。

缺点:1:仅能求出优化问题的局部最优解。2:求解的结果强烈依赖于初始值。

 

遗传算法

优点:1:能够求出优化问题的全局最优解。2:优化结果与初始条件无关。3:算法独立于求解域。。4:适合于求解复杂的优化问题。5:应用较为广泛。

缺点:1:收敛速度慢2:局部搜索能力差。3:控制变量较多。4:无确定的终止准则。


 

发布了14 篇原创文章 · 获赞 8 · 访问量 1595

猜你喜欢

转载自blog.csdn.net/qq_42678341/article/details/102864272