遗传算法

一、遗传算法简介

1.实现

在计算机上模拟生物的进化过程和基因的操作(选择、 交叉、变异)。

2.目的

(1)抽象和严谨地解释自然界的适应过程;
(2)将自然生物系统的重要机理运用到人工系统的设计中。

3.遗传算法概述

遗传算法的基本思想是从初始种群出发,采用优胜劣汰、 适者生存的自然法则选择个体,并通过杂交、变异来产生新 一代种群,如此逐代进化,直到满足目标为止。遗传算法所 涉及到的基本概念主要有以下几个:
• 种群(Population):种群是指用遗传算法求解问题时, 初始给定的多个解的集合。遗传算法的求解过程是从这个子 集开始的。

•个体(Individual):个体是指种群中的单个元素,它通常 由一个用于描述其基本遗传结构的数据结构来表示。例如, 可以用0、1组成的长度为l的串来表示个体。

• 染色体(Chromosome):染色体是指对个体进行编码后 所得到的编码串。染色体中的每1位称为基因,染色体上由 若干个基因构成的一个有效信息段称为基因组。

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

• 遗传操作(Genetic Operator):遗传操作是指作用于种 群而产生新的种群的操作。标准的遗传操作包括以下3种基本形式:
– 选择(Selection)
– 杂交(Crosssover)
– 变异(Mutation)

二、基本遗传算法

在这里插入图片描述

1.编码表示

常用的遗传编码算法有二进制码、实数编码。

(1)二进制编码(Binary encoding)

二进制编码是将原问题的结构变换为染色体的位串结构。在 二进制编码中,首先要确定二进制字符串的长度l,该长度与 变量的定义域和所求问题的计算精度有关。

例 假设变量x的定义域为[4,10],要求的计算精度为10-5, 则需要将[4,10]至少分为600000个等长小区间,每个小区间 用一个二进制串表示。于是,串长至少等于20,原因是: 524288=219<600000<220=1048576 这样,对应于区间[4,10]内满足精度要求的每个值x,都可用 一个20位编码的二进制串<b19,b18,…,b0>来表示。

(2) 实数编码(Real encoding)

实数编码是将每个个体的染色体都用某一范围的一个实 数(浮点数)来表示,其编码长度等于该问题变量的个数。

这种编码方法是将问题的解空间映射到实数空间上,然 后在实数空间上进行遗传操作。由于实数编码使用的是变量 的真实值,因此这种编码方法也叫做真值编码方法。实数编码适应于那种多维、高精度要求的连续函数优化 问题。

2.适应性的度量

个体的适应值即是它繁殖的能力,它将直接 关系到其后代的数量,在遗传算法中,适应 函数是用来区分群体中个体好坏的标准,是 算法演化过程的驱动力,同时也是进行自然 选择的唯一依据。
适应函数
适应值会出现两种情形,一是极小情形即原始适 应值越小个体性能越好;另一种是极大化情形即 原始适应值越大个体性能越好 。
遗传算法中的某些选择策略则要求适应函数是非 负的,而且适应值越大表明个体的性能越好。
对于极小化情形,标准适应值可定义为 :在这里插入图片描述

3.选择策略

不同的选择策略将导致不同的选择压力,即下一代 中父代个体的复制数目的不同分配关系。

转盘式选择 (轮赌)
转盘式选择是基于适应值比例的选择中比较重要 的选择策略。 l 先计算个体的相对适应值在这里插入图片描述
根据选择概率pi把一个圆盘分成N份
在这里插入图片描述
从统计角度看,个体 的适应度值越大,其对 应的扇区的面积越大, 被选中的可能性也越大。这种方法有点类似于发 放奖品使用的轮盘,并 带有某种赌博的意思,因此亦被称为轮盘赌选择。
遗传算子的设计

4.遗传算子的设计

(1)杂交算子

杂交运算是指对两个相互配对的染色体按某种 方式相互交换其部分基因,从而形成两个新的 个体。
① 单点杂交:称为简单杂交,它是指在个体编码 串中只随机设计一个杂交点,然后在该点相互 交换两个配对个体的部分染色体。
② 双点杂交与多点杂交 • 双点杂交是指在个体编码串中设置了二个杂交点, 然后再进行部分基因交换。
③ 均匀杂交 l 均匀杂交是指两个配对个体每一个基因座上的基 因都以相同的杂交概率进行交换,从而形成两个 新的个体。 l 均匀杂交实际上可归属于多点杂交的范围 .

(2)变异算子

变异运算是指将个体染色体编码串中的某些基 因座上的基因值用该基因座的其它等为基因来 替换,从而形成一个新的个体。
遗传算法中使用变异算子主要有以下两个目的: 1)改善遗传算法的局部搜索能力。 2)维持群体的多样性,防止出现早熟现象。
①基本位变异
对个体的每一个基因座,依变异概率Pm指定其为变异点。
对每一个指定的变异点,对其基因值做取反运算 或用其他等位基因值来代替,从而产生出一个新 的个体。
②均匀变异
• 依次指定个体编码串中的每个基因座为变异点。
• 对每一个变异点,以变异概率Pm从对应基因的取值范围内取一随机数来替代原有基因值。

三、函数优化

在这里插入图片描述
在这里插入图片描述

四、代码实现

1.相关参数

T 仿真代数

N 群体规模

pm pc 交叉变异概率

umax umin 参数取值范围

L 单个参数字串长度
总编码长度Dim*L

Dim维空间搜索

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

bestv=-inf; 最优适应度初值

2.相关代码

% 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    %输出最优参数

3.结果展示

1.对Schaffer函数优化
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;
(1)种群数量N=80,维度Dim=5:
bestv =

   0.990283826870370


optxx =

  -3.137829912023459  -0.029325513196483  -2.199413489736070  10.410557184750736  21.085043988269796

在这里插入图片描述
在这里插入图片描述

(2)种群数量N=80,维度Dim=2:

输出结果为:

bestv =

   0.990283826870370


optxx =

   3.020527859237539   0.850439882697948

曲线:
在这里插入图片描述

(3)种群数量N=80,维度Dim=10:

输出结果为:

bestv =

   0.998279300372192


optxx =

  1 至 7 列

  -0.029325513196483  -0.029325513196483   3.020527859237539  -6.070381231671554  18.797653958944281   7.067448680351909  17.390029325513197

  8 至 10 列

  16.158357771260995  19.501466275659823 -15.630498533724341

曲线:
在这里插入图片描述

(4)种群数量N=40,维度Dim=5:
bestv =

   0.998279300372192


optxx =

  -0.029325513196483   0.029325513196483  -8.123167155425222   1.788856304985337  20.674486803519059

在这里插入图片描述

(5)种群数量N=40,维度Dim=2:

bestv =

   0.990283826870370


optxx =

  -3.020527859237536   0.850439882697948

在这里插入图片描述

(6)种群数量N=40,维度Dim=10:

bestv =

   0.990283762014982


optxx =

  1 至 7 列

  -2.727272727272727  -1.554252199413490  28.826979472140764  -5.718475073313783  -8.357771260997069   1.495601173020528  13.519061583577709

  8 至 10 列

 -23.782991202346039  29.824046920821111   1.730205278592376

在这里插入图片描述

(7)种群数量N=100,维度Dim=5:

bestv =

   0.990283826870370


optxx =

   1.906158357771261  -2.492668621700879  -4.428152492668623  -4.134897360703814  -2.492668621700879

在这里插入图片描述

(8)种群数量N=100,维度Dim=2:

bestv =

   0.990283826870370


optxx =

   3.020527859237539  -0.850439882697948

在这里插入图片描述

(9)种群数量N=100,维度Dim=10:
bestv =

   0.998279300372192


optxx =

  1 至 7 列

  -0.029325513196483  -0.029325513196483  22.785923753665692  23.607038123167158   7.829912023460409  21.964809384164219 -10.000000000000000

  8 至 10 列

  19.501466275659823  16.803519061583579 -21.260997067448681

在这里插入图片描述

2.对Rastrigin函数优化

函数代码:

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;
(1)种群数量N=80,维度Dim=5:
bestv =

 -62.479602222108497


optxx =

  -0.850439882697948   0.439882697947215  -2.199413489736070   2.023460410557185  -3.782991202346039
  

在这里插入图片描述
在这里插入图片描述

(2)种群数量N=80,维度Dim=2:

bestv =

  -4.274062572600121


optxx =

  -0.029325513196483   1.964809384164223

在这里插入图片描述

(3)种群数量N=80,维度Dim=10:
bestv =

    -5.029817842908374e+02


optxx =

  1 至 7 列

  -3.782991202346039  -6.950146627565982  -7.829912023460409   3.782991202346039  10.997067448680355  -0.909090909090910  -5.249266862170089

  8 至 10 列

  10.000000000000000   6.422287390029325  -3.782991202346039

在这里插入图片描述

(4)种群数量N=40,维度Dim=5:
bestv =

    -1.128024604198187e+02


optxx =

   4.428152492668623   2.023460410557185  -1.319648093841643   4.017595307917887   6.070381231671554

在这里插入图片描述

(5)种群数量N=40,维度Dim=2:

bestv =

  -1.360803368822516


optxx =

  -1.026392961876834   0.029325513196483

在这里插入图片描述

(6)种群数量N=40,维度Dim=10:

bestv =

    -2.816915713946689e+02


optxx =

  1 至 7 列

   4.838709677419352   1.730205278592376  -2.551319648093841   1.964809384164223   0.733137829912025  -7.419354838709676  -1.495601173020528

  8 至 10 列

   0.263929618768330  -3.137829912023459  -8.240469208211145

在这里插入图片描述

(7)种群数量N=100,维度Dim=5:
bestv =

    -1.457406142456419e+02


optxx =

  -6.715542521994134  -0.146627565982406   4.956011730205276  -0.615835777126101  -5.307917888563050

在这里插入图片描述

(8)种群数量N=100,维度Dim=2:

bestv =

  -1.667155637436144


optxx =

   0.087976539589445   0.029325513196483

在这里插入图片描述

(9)种群数量N=100,维度Dim=10:

bestv =

    -3.277187543431874e+02


optxx =

  1 至 7 列

   0.791788856304986   1.964809384164223  -1.202346041055719   4.193548387096776   8.005865102639298  10.234604105571847  -2.492668621700879

  8 至 10 列

  -4.076246334310852   2.668621700879768   4.604105571847505

在这里插入图片描述

3.对Griewank函数优化

函数代码:

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;
(1)种群数量N=80,维度Dim=5:

bestv =

  -0.220954713374530


optxx =

  -9.002932551319649   0.087976539589445 -16.041055718475072  -0.087976539589445  -0.615835777126101

在这里插入图片描述
在这里插入图片描述

(2)种群数量N=80,维度Dim=2:

bestv =

  -0.010262924724034


optxx =

  -3.137829912023459  -4.545454545454547

在这里插入图片描述

(3)种群数量N=80,维度Dim=10:

bestv =

  -0.743678828318803


optxx =

  1 至 7 列

   3.313782991202345   0.322580645161292  21.847507331378296  -4.897360703812318  13.753665689149557 -14.985337243401759   7.008797653958943

  8 至 10 列

  -8.123167155425222   8.181818181818180   9.530791788856305

在这里插入图片描述

(4)种群数量N=40,维度Dim=5:

bestv =

  -0.264051426836767


optxx =

 -12.639296187683286   0.381231671554254  15.865102639296190   5.953079178885631 -14.457478005865102

在这里插入图片描述

(5)种群数量N=40,维度Dim=2:

bestv =

  -0.022366638205714


optxx =

   3.137829912023463   4.193548387096776

在这里插入图片描述

(6)种群数量N=40,维度Dim=10:

bestv =

  -0.889135000860089


optxx =

  1 至 7 列

 -19.325513196480941  12.991202346041057  -1.143695014662757   6.011730205278596  -7.126099706744867   1.143695014662757   9.589442815249264

  8 至 10 列

 -15.747800586510264   9.413489736070382 -10.175953079178885

在这里插入图片描述

(7)种群数量N=100,维度Dim=5:

bestv =

  -0.104165691537920


optxx =

  -3.255131964809383  -8.944281524926687   5.366568914956012  -0.322580645161292 -13.812316715542522

在这里插入图片描述

(8)种群数量N=100,维度Dim=2:

bestv =

  -0.002365624260429


optxx =

  -0.029325513196483  -0.087976539589445

在这里插入图片描述

(9)种群数量N=100,维度Dim=10:
bestv =

  -0.813898470475840


optxx =

  1 至 7 列

   3.372434017595310   4.780058651026394   0.205278592375368   0.967741935483872  -5.131964809384165   8.240469208211145   8.357771260997069

  8 至 10 列

   6.070381231671554  -1.436950146627566  -1.026392961876834

在这里插入图片描述

四、结果分析

1.从最优适应度值分析

(1)对于Schaffer函数来说,迭代的次数随着维度增加而增加,但维度变化时最优适应度值变化很小,最优参数较为准确。
(2)对于Rastrigin函数来说,当种群数量N不变时,最优适应度进化曲线已迭代次数随着维度的增加先减少后增加。
(3)对于Griewank函数来说,与Rastrigin函数相反,已迭代的次数随维度的增加先增加后减少,最优参数随维度的增加而减小。

2.从运行所需时间上分析

以函数Griewank为例:
(1)种群数量N=80不变,变化维度
维度Dim=2:
在这里插入图片描述
维度Dim=5:
在这里插入图片描述
维度Dim=10:
在这里插入图片描述
由结果可知:当种群数量不变时,运行时间随着维度的增加而增加。
(2)维度Dim=5不变,变化种群数量N
N=40:
在这里插入图片描述
N=80:
在这里插入图片描述
N=100:
在这里插入图片描述
由结果可知:当维度不变时,运行时间随着种群数量的增加而增加。


版权声明:本文为Potattto原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。