计算智能——基于遗传算法的函数优化

1. 遗传算法

1.1 遗传算法简介

遗传算法是通过模拟自然界中生物的遗传进化过程,对优化问题的最优解进行搜索。算法维护一个代表问题潜在解的群体,对于群体的进化,算法引入了类似自然进化中选择、交配以及变异等算子。
遗传算法搜索全局最优解的过程是一个不断迭代的过程(每一次迭代相当于生物进化中的一次循环),直到满足算法的终止条件为止。

1.2 遗传算法原理

在利用遗传算法求解问题时,问题的每一个可能解都被编码成一个“染色体”,即个体,若干个个体构成了群体(所有可能解)。在遗传算法开始时,总是随机的产生一些个体(即初始解),根据预定的目标函数对每一个个体进行评估,给出一个适应度值,基于此适应度值,选择一些个体用来产生下一代,选择操作体现了“适者生存”的原理,“好”的个体被用来产生下一代,“坏”的个体则被淘汰,然后选择出来的个体,经过交叉和变异算子进行再组合生成新的一代,这一代的个体由于继承了上一代的一些优良性状,因而在性能上要优于上一代,这样逐步朝着最优解的方向进化。

遗传算法的基本思想是从初始种群出发,采用优胜劣汰、 适者生存的自然法则选择个体,并通过杂交、变异来产生新 一代种群,如此逐代进化,直到满足目标为止。
遗传算法所 涉及到的基本概念主要有以下几个:
• 种群(Population):种群是指用遗传算法求解问题时, 初始给定的多个解的集合。遗传算法的求解过程是从这个子 集开始的。
•个体(Individual):个体是指种群中的单个元素,它通常 由一个用于描述其基本遗传结构的数据结构来表示。例如, 可以用0、1组成的长度为l的串来表示个体。
• 染色体(Chromosome):染色体是指对个体进行编码后 所得到的编码串。染色体中的每1位称为基因,染色体上由 若干个基因构成的一个有效信息段称为基因组。
• 适应度(Fitness)函数:适应度函数是一种用来对种群中 各个个体的环境适应性进行度量的函数。其函数值是遗传 算法实现优胜劣汰的主要依据 • 遗传操作(Genetic Operator):遗传操作是指作用于种 群而产生新的种群的操作。标准的遗传操作包括以下3种基本形式:
– 选择(Selection)
– 杂交(Crosssover)
– 变异(Mutation)

1.3 遗传算法的基本流程

遗传算法的基本步骤:

Step1. 初始化规模为N的群体,其中染色体每个基因的值采用随机数产生器生成并满足问题定义的范围。当前进化代数Generation=0。
Step2. 采用评估函数对群体中所有染色体进行评价,分别计算每个染色体的适应值,保存适应值最大的染色体Best。
Step3. 采用轮盘赌选择算法对群体的染色体进行选择操作,产生规模同样为N的种群。
Step4. 按照概率Pc从种群中选择染色体进行交配。每两个进行交配的父代染色体,交换部分基因,产生两个新的子代染色体,子代染色体取代父代染色体进入新种群。没有进行交配的染色体直接复制进人新种群。
Step5. 按照概率 Pm对新种群中染色体的基因进行变异操作。发生变异的基因数值发生改变。变异后的染色体取代原有染色体进人新群体,未发生变异的染色体直接进人新群体。
Step6. 变异后的新群体取代原有群体,重新计算群体中各个染色体的适应值。倘若群体的最大适应值大于Best 的适应值,则以该最大适应值对应的染色体替代Best。
Step7. 当前进入代数Generation加1.如果Generation超过规定的最大进化代数或Best达到规定的误差要求,算法结束。否则返回Step3.

遗传算法流程图:
在这里插入图片描述
遗传算法伪代码:

/*  P(t)表示某一代的群体,t为当前进化代数
Best表示目前已找到的最优解  */
Procedure GA
begin
  t←0;
  initialize(P(t));
  evaluate(P(t));
  keep_best(P(t));
  while(不满足终止条件) do
  begin
  	P(t)←selection(P(t));
  	P(t)←crossover(P(t));
  	P(t)←mutation(P(t));
  	t←t+1;
  	P(t)←P(t-1);
  	evaluate(P(t));
  	if (P(t)的最优适应值大于Best的适应值)
  		//以P(t)的最优染色体替代Best
  		replace(Best);
  		end if
  	end
 end

1.4 遗传算法Matlab实现

GA:

clc;clear all;
format long;%设定数据显示格式
%初始化参数
T=500;%仿真代数
N=80;% 群体规模
pm=0.05;pc=0.8;%交叉变异概率
umax=30;umin=-30;%参数取值范围
L=10;%单个参数字串长度,总编码长度Dim*L
Dim=2;%Dim维空间搜索
bval=round(rand(N,Dim*L));%初始种群,round函数为四舍五入
bestv=-inf;%最优适应度初值
funlabel=1;       %选择待优化的函数,1为Rastrigin,2为Schaffer,3为Griewank
Drawfunc(funlabel);%画出待优化的函数,只画出二维情况作为可视化输出
%迭代开始
tic;
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
fprintf('当目标函数的解空间维度为Dim= %d 且群体规模为N= %d 时所消耗的时间资源为:',Dim,N);
toc;
%输出
figure;
plot(-Bfit1);% 绘制最优适应度进化曲线
bestv   %输出最优适应度值
optxx    %输出最优参数

计算粒子适应度值的函数fun():

function y = fun(x,label)
%函数用于计算粒子适应度值
%x           input           输入粒子 
%y           output          粒子适应度值 
if label==1
    y=-Rastrigin(x);
elseif label==2
    y=-Schaffer(x);
elseif label==3
    y=-Griewank(x);
else
    y=-Ackley(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

if label==4
    y = x;
    [X,Y] = meshgrid(x,y);
    [row,col] = size(X);
    for  l = 1 :col
         for  h = 1 :row
            z(h,l) = Ackley([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

2. Griewank函数优化

2.1 Griewank函数原型

GRIEWANK FUNCTION 点击可查看Griewank函数的更多信息。
在这里插入图片描述

2.2 Griewank的绘制结果

在这里插入图片描述

2.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;

2.4 GA优化的运行结果

2.4.1 Dim=2 N=80

  1. 运行结果:
当目标函数的解空间维度为Dim= 2 且群体规模为N= 80 时所消耗的时间资源为:0.527370 秒。
输出最优适应度值:
bestv =
  -0.007424952499097
输出最优参数:
optxx =
  -3.137829912023459  -4.428152492668623
>> 
  1. 最优适应度进化曲线
    在这里插入图片描述

2.4.2 Dim=5 N=80

  1. 运行结果:
当目标函数的解空间维度为Dim= 5 且群体规模为N= 80 时所消耗的时间资源为:0.756145 秒。
输出最优适应度值:
bestv =
  -0.270427781527473
输出最优参数:
optxx =
  21.906158357771261   8.533724340175951   4.897360703812318   0.557184750733139   0.322580645161292
>> 

  1. 最优适应度进化曲线
    在这里插入图片描述

2.4.3 Dim=2 N=20

  1. 运行结果:
当目标函数的解空间维度为Dim= 2 且群体规模为N= 20 时所消耗的时间资源为:0.154992 秒。
输出最优适应度值:
bestv =
  -0.010262924724034
输出最优参数:
optxx =
   3.137829912023463   4.545454545454547
>> 
  1. 最优适应度进化曲线
    在这里插入图片描述

2.4.4 Dim=5 N=20

  1. 运行结果:
当目标函数的解空间维度为Dim= 5 且群体规模为N= 20 时所消耗的时间资源为:0.201569 秒。
输出最优适应度值:
bestv =
  -0.170506022226074
输出最优参数:
optxx =
  -6.598240469208211   0.029325513196483 -15.923753665689150  -5.953079178885631   0.029325513196483
>> 
  1. 最优适应度进化曲线
    在这里插入图片描述

2.5 运行结果说明

对比四种不同参数设置的运行结果可得:

  1. 当目标函数的解空间维度较大时,消耗的时间资源较多且准确率不能趋于稳定。当N=80时,Dim=2的最优适应度进化曲线在第200代附近已趋于稳定,而Dim=5的最优适应度进化曲线在第500代结束时还未趋于稳定。
  2. 维数的增大对于遗传算法精度的影响很大,经查阅资料可得:在实数型变异中,随机值以低概率加入变量中,变量变异的概率与变量维数成反比列关系,个体的变量维数越多变异概率越小。得此启发,将GA算法中的变异概率Pc由原来的0.8更改为0.05,运行发现最优适应度进化曲线在第300代左右趋于稳定。

3. Rastrigin函数优化

3.1 Rastrigin函数原型

RASTRIGIN FUNCTION 点击可查看Rastrigin函数的更多信息。
在这里插入图片描述

3.2 Rastrigin的绘制结果

在这里插入图片描述

3.3 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;

3.4 GA优化的运行结果

3.4.1 Dim=2 N=80

  1. 运行结果:
当目标函数的解空间维度为Dim= 2 且群体规模为N= 80 时所消耗的时间资源为: 0.493056 秒。
输出最优适应度值:
bestv =
  -1.311359672053284
输出最优参数:
optxx =
   0.029325513196483  -0.967741935483872
>> 
  1. 最优适应度进化曲线
    在这里插入图片描述

3.4.2 Dim=5 N=80

  1. 运行结果:
当目标函数的解空间维度为Dim= 5 且群体规模为N= 80 时所消耗的时间资源为:0.728897 秒。
输出最优适应度值:
bestv =
    -1.116636425397291e+02
输出最优参数:
optxx =
   7.243401759530791   0.850439882697948  -0.850439882697948   4.956011730205276   0.674486803519063
>> 
  1. 最优适应度进化曲线
    在这里插入图片描述

3.4.3 Dim=2 N=20

  1. 运行结果:
当目标函数的解空间维度为Dim= 2 且群体规模为N= 20 时所消耗的时间资源为: 0.153193 秒。
输出最优适应度值:
bestv =
  -2.741442067565775
输出最优参数:
optxx =
  -1.085043988269796   0.029325513196483
>> 
  1. 最优适应度进化曲线
    在这里插入图片描述

3.4.4 Dim=5 N=20

  1. 运行结果:
当目标函数的解空间维度为Dim= 5 且群体规模为N= 20 时所消耗的时间资源为: 0.206011 秒。
输出最优适应度值:
bestv =
    -1.341034172832627e+02
输出最优参数:
optxx =
   8.826979472140764  -0.029325513196483   4.076246334310852   1.495601173020528  -3.079178885630498
>> 
  1. 最优适应度进化曲线
    在这里插入图片描述

3.5 运行结果说明

对比四种不同参数设置的运行结果可得如下结论:

  1. 当目标函数的解空间维度较大时,最优适应度曲线趋于稳定需要设置较大的遗传进化代数。当N=80时,Dim=2的最优适应度进化曲线在第100代右部已趋于稳定,而Dim=5的最优适应度进化曲线在第300代附近时趋于稳定,相差较大,可见维度越大,需要遗传进化的代数需更多才能得到较准确的最优值。
  2. 目标函数的解空间维度和种群数量都影响着遗传算法的精度,在对Rastrigin函数进行优化的过程中,当维数变多之后趋于稳定的代数在300代附近,而在此基础上减少种群数量的值,将其设置为20,由最优化适应度曲线可看到在遗传算法中结束时的第500代还未趋于稳定,所以种群数量应在维数增大时相应增大,才能保证遗传算法的精度。

4. Ackley函数优化

4.1 Ackley函数原型

ACKLEY FUNCTION 点击可查看Ackley函数的更多信息。
在这里插入图片描述

4.2 Ackley的绘制结果

在这里插入图片描述

4.3 Ackley适应度函数

function result=Ackley(x)
%Ackley 函数
%输入x,给出相应的y值,在x=(0,0,…,0) 处有全局极小点0,为得到最大值,返回值取相反数
%编制人:
%编制日期:
[row,col]=size(x);
if row>1
    error('输入的参数错误');
end
result=-20*exp(-0.2*sqrt((1/col)*(sum(x.^2))))-exp((1/col)*sum(cos(2*pi.*x)))+exp(1)+20;
result=-result;

4.4 GA优化的运行结果

4.4.1 Dim=2 N=80

  1. 运行结果:
当目标函数的解空间维度为Dim= 2 且群体规模为N= 80 时所消耗的时间资源为:0.546779 秒。
输出最优适应度值:
bestv =
  22.289642531756776
输出最优参数:
optxx =
  29.472140762463340 -29.472140762463344
>> 
  1. 最优适应度进化曲线
    在这里插入图片描述

4.4.2 Dim=5 N=80

  1. 运行结果:
当目标函数的解空间维度为Dim= 5 且群体规模为N= 80 时所消耗的时间资源为:时间已过 0.808950 秒。
输出最优适应度值:
bestv =
  22.247963558862615
输出最优参数:
optxx =
  27.536656891495603 -24.486803519061581  26.480938416422291 -27.478005865102638  29.589442815249264
>> 
  1. 最优适应度进化曲线
    在这里插入图片描述

4.4.3 Dim=2 N=20

  1. 运行结果:
当目标函数的解空间维度为Dim= 2 且群体规模为N= 20 时所消耗的时间资源为:0.162487 秒。
输出最优适应度值:
bestv =
  22.289642531756776
输出最优参数:
optxx =
 -29.472140762463344  29.472140762463340
>> 
  1. 最优适应度进化曲线
    在这里插入图片描述

4.4.4 Dim=5 N=20

  1. 运行结果:
当目标函数的解空间维度为Dim= 5 且群体规模为N= 20 时所消耗的时间资源为: 0.263552 秒。
输出最优适应度值:
bestv =
  22.262829111685726
输出最优参数:
optxx =
  29.530791788856305  29.472140762463340  20.557184750733136 -29.530791788856305 -28.475073313782993
>> 
  1. 最优适应度进化曲线
    在这里插入图片描述

4.5 运行结果说明

对比四种不同参数设置的运行结果可得如下结论:

  1. 对于Ackley函数,对比不同参数设置下的最优适应度进化曲线虽然偏差较大,但最终输出的最优适应度值偏差较小。可以得到结论:无论多么复杂的函数使用遗传算法进行优化,只要设置较大的进化代数,最终都会趋向稳定并输出最优适应度值。
  2. 目标函数的解空间维度和种群数量都影响着最优适应度进化曲线的波动。在对Ackley函数进行优化的过程中,当维数变多之后趋于稳定的代数在50代附近,而在此基础上减少种群数量的值,将其设置为20,最优化适应度曲线波动较大,所以种群数量应在维数增大时相应增大,才能保证最优化适应度在算法迭代截止时趋于稳定。

5.遗传算法参数经验设置

  1. 群体规模 N
    若N设置较大,一次进化所覆盖的模式较多,可以保证群体的多样性,从而提高算法的搜索能力,但是由于群体中染色体的个数较多,势必增加算法的计算群体规模N 的计算量,降低了算法的运行效率。
    若N设置较小,虽然降低了计算量,但是同时降低了每次进化中群体包含更多较好染色体的能力。
    N的设置一般为20~100
  2. 染色体长度 L
    L的设置跟优化问题密切相关,一般由问题定义的解的形式和选择的编码方法决定。
    对于二进制编码方法染色体的长度L根据解的取值范围和规定精度要求选择大小。
    对于浮点数编码方法,染色体的长度L跟问题定义的解的维数D相同。
  3. 基因的取值范围 R
    对于二进制编码方法,R={0,1},而对于浮点数编码方法,R与优化问题定义的解每一维变量的取值范围相同。
  4. 交配概率 Pc
    Pc的取值一般为0.4~0.99
    也可采用自适应的方法调整算法运行过程中的Pc值.
  5. 变异概率 Pm
    Pm的值不宜过大。因为变异对已找到的较优解具有一定的破坏作用,如果Pm的值太大,可能会导致算法目前所处的较好的搜索状态倒退回原来较差的情况。
    Pm的取值一般为0. 001~0.1
    也可采用自适应的方法调整算法运行过程中的Pm值。
  6. 终止条件
    采用何种终止条件,跟具体问题的应用有关。
    可以使算法在达到最大进化代数时停止,最大进化代数一般可设置为100~1000,根据具体问题可对该建议值作相应的修改。
    ===也可以通过考察找到的当前最优解的情况来控制算法的停止。==例如,当目前进化过程算法找到的最优解达到一定的误差要求,则算法可以停止。误差范围的设置同样跟具体的优化问题相关。或者是算法在持续很长的段进化时间内,所找到的最优解没有得到改善时,算法可以停止。
  • 11
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MATLAB 中使用遗传算法进行优化时,可以使用约束函数来限制搜索空间。约束函数可以将不符合约束条件的个体的适应度设为一个较差的值,从而防止这些个体被选中进入下一代。 下面是一个简单的例子,演示如何在 MATLAB 中使用遗传算法和约束函数来求解一个约束优化问题: ```matlab function [x,fval] = constrained_ga() % Define the objective function and constraints fun = @(x) x(1)^2 + x(2)^2; nonlcon = @(x) deal([], [x(1) + x(2) - 1; -x(1) - x(2) - 2]); % Set up the GA options options = gaoptimset('Display', 'iter', 'PopulationSize', 50, ... 'Generations', 100, 'StallGenLimit', 50, 'PlotFcns', @gaplotbestf); % Run the GA with the constraints [x,fval] = ga(fun, 2, [], [], [], [], [], [], nonlcon, options); end ``` 在上面的例子中,我们定义了一个目标函数,它是一个简单的二次函数,以及两个约束条件。第一个约束条件是 $x_1 + x_2 \leq 1$,第二个约束条件是 $-x_1 - x_2 \leq -2$。我们还设置了一些 GA 的选项,如种群大小、迭代次数等。 然后,我们调用 MATLAB 中的 `ga` 函数来运行遗传算法。这个函数接受目标函数、变量个数、约束条件等参数,然后返回最优解和最优解对应的函数值。 在本例中,我们还传递了一个非线性约束函数 `nonlcon`,它将不符合约束条件的个体的适应度设为一个较差的值。这个函数返回两个值,第一个是空数组,表示没有线性约束条件;第二个是一个列向量,表示非线性约束条件。 通过使用约束函数,我们可以将遗传算法应用于更广泛的优化问题,包括带有约束条件的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值