遗传(GA)函数优化

Deadly 提交于 2019-12-03 03:57:25

                  遗传(GA)函数优化 

基本原理:

遗传算法是一种典型的启发式算法,属于非数值算法范畴。它是模拟达尔文的自然选择学说和自然界的生物进化过程的一种计算模型。它是采用简单的编码技术来表示各种复杂的结构,并通过对一组编码表示进行简单的遗传操作和优胜劣汰的自然选择来指导学习和确定搜索的方向。遗传算法的操作对象是一群二进制串(称为染色体、个体),即种群,每一个染色体都对应问题的一个解。从初始种群出发,采用基于适应度函数的选择策略在当前种群中选择个体,使用杂交和变异来产生下一代种群。如此模仿生命的进化进行不断演化,直到满足期望的终止条件。借助遗传学的原理,经过自然选择、遗传、变异等作用机制进而筛选出具有适应性更高的个体(适者生存)。遗传算法从20世纪七八十年代的诞生到现在主要集中的适用范围为:NP问题(指存在多项式算法能够解决的非决定性问题)、非线性、多峰函数优化和多目标优化问题等等。同时在机器学习、模式识别和神经网络及社会科学中的应用也显得非常出色。

 

 

GA算法流程:

1 :在论域空间U上定义一个适应度函数f(x),给定种群规模N,交叉率Pc,变异率Pm,代数Gen

2: 随机产生U中的N个染色体s1,s2…sN, 组成初始种群S={s1,s2…sN},置代
         数t=1
3:若终止条件满足,则取S中适应度最大的染色体作为所求结果,算法结束
4:计算S中每个染色体的适应度f()
5: 按选择概率p(si)所决定的选中机会,每次从S中随机选中1个染色体并将
         其复制,共做N次,然后将复制得到的N染色体组成群体S1
6 :按Pc所决定的参加交叉的染色体数c,从S1中随机确定c个染色体,配对
          进行交叉操作,并用产生的染色体代替原染色体,组成群体S2
7 :按Pm所决定的变异次数m,从S2中随机确定m个染色体,分别进行变异
          操作,并用产生的新染色体代替原染色体,组成群体S3
8 :将群体S3作为新种群,即用S3代替S, Gen = Gen +1,转3

 

遗传算法初始化参数:

(1)编码长度L。使用二进制编码时,L通常由对问题的求解精度决定,编码长度L越长,可期望的最优解的精度也就越高,但应注意过大的L会增大运算量。

(2)种群规模N。种群规模N表示每一代种群中所含个体数目。当N取之较小时,可提高遗传算法的运算速度,但却降低种群的多样性,容易引起算法早熟,出现假收敛;而N取值较大时,又会使得遗传算法效率降低。一般建议的取值范围是20~100.

(3)交叉概率Pc。在遗传算法中交叉算子被认为是主要搜索算子,因而一般取较大值。一般说,较大的Pc容易破坏群体中已经形成的优良模式,使得搜索的随机性太大了,而较小的Pc使发现新个体(特别是优良个体)的速度太慢了。一般建议的取值范围是0.4~0.99.另外,比较理想的方式是非一致地使用交叉概率,例如在遗传算法的前期使用较大的Pc,后期降低Pc以保留优良个体。

(4)变异概率Pm。较大的变异概率Pm使得遗传算法在整个搜索空间中大部跳跃,而小的变异概率使得遗传算法聚焦在特别区域作局部搜索。一般在不使用交叉算子的情形(演化策略算法,进化程序算法),变异算子作主要搜索算子,Pm取较大值(0.4~1);而在于交叉算子联合使用的情形(遗传算法),Pm通常取较小值(0.0001~0.5).

(5)终止进化代数T。遗传算法不同于传统优化算法,它很难有明确的搜索终止规则(特别是对于非数值优化问题),于是通常需指定一个终止进化代数赖终止算法,一般设T属于【100,1000】。为了获得较高精度解,通常可以根据种群适应度的稳定情况来实时调整T的设置。

 

遗传算法基本术语介绍:

种群 ==> 可行解集
个体 ==> 可行解
染色体 ==> 可行解的编码
基因 ==> 可行解编码的分量
基因形式 ==> 遗传编码
适应度 ==> 评价的函数值(适应度函数)
选择 ==> 选择操作
交叉 ==> 编码的交叉操作
变异 ==> 可行解编码的变异

遗传操作:就包括优选适应性强的个体的“选择”;个体间交换基因产生新个体的“交叉”;个体间的基因突变而产生新个体的“变异”。其中遗传算法是运用遗传算子来进行遗传操作的。即:选择算子、变异算子、交叉算子。

1.选择算子:根据个体的适应度,按照一定的规则,从第n代群体中选择出一些具有优良性状的个体遗传到下一代(n+1)群体中。在这一选择过程中,个体适应度越大,则被选择到下一代的机会越大。某个体i的适应度fi,种群大小NP

2.交叉算子:将群体P(n)中选中的各个个体随机搭配,对于每一个个体,以某一特定概率(交叉概率Pc(0.25-1.0取值))交换他们之间的部分染色体(编码位串的部分位置)。交叉算法是的,遗传算法的搜索能力得到更好的延伸。

3.交叉操作的具体步骤可以表述为:1.在交配池中随机取出要交配的一对个体;2,根据编码位串长度L,对要交配的一对个体,随机选取[1,L-1]中的一个或者多个整数k作为交叉位置处,相互交换各自的部分基因,由此形成新的个体。

4.变异操作:对群体的每个个体,以某一个概率(变异概率Pm(0.01-0.1取值))将某一个或者某些基因座上的基因值改变为其他的等位基因值,根据个体的编码方式不同,可以将变异分为实值变异和二进制变异。

 运行结果:

维空间:5   种群数量:80

 

 

 维空间:2  种群数量:10

 

 

 

 

 维空间:5  种群数量:10

 

 

 

维空间:10  种群数量:10

 

 

 

 维空间:20  种群数量:10

 

 

 

  维空间:20  种群数量:20

 

 

 

 

   维空间:20  种群数量:60

 

 

 

   维空间:5   种群数量:100

 

 

 

 

遗传算法的主要特点:

• 智能性
– 遗传算法具有自组织、自适应和自学习等特性。
• 灵活的个体编码
– 灵活的个体编码使遗传算法可直接对结构对象进行描述和操作。
• 多点搜索能力
– 遗传算法是同时对多个解进行处理、评估,并行地爬多个峰。这一特点使遗传算法具有较好的全局搜索能力,减少了陷于局部优解的风险。
• 并行性
– 遗传算法是内在并行的。演化计算适合在并行机或分布式系统中做大规模的并行处理。
– 遗传算法是内含并行性的。由于遗传算法采用种群的方式组织搜索,从而可同时搜索空间内的多个区域,并相互交流信息。

 

 

matlab代码:

GA

% 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;
close all;
format long;%设定数据显示格式

%初始化参数

T=500;%仿真代数

N=100;% 群体规模

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

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;

 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;

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;

fun

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

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  

 

 

 

 

 

 

参考网址:

https://blog.csdn.net/google19890102/article/details/45622307

https://blog.csdn.net/sinat_38321889/article/details/79001599

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!