在matlab中使用遗传算法执行最优化

  遗传算法是一种通用的最优化方法,具体原理可以看:遗传算法详解与实验。下面记录在Matlab中如何使用遗传算法来做优化。

用法

  调用方式如下:

 1 x = ga(fun,nvars)
 2 x = ga(fun,nvars,A,b)
 3 x = ga(fun,nvars,A,b,Aeq,beq)
 4 x = ga(fun,nvars,A,b,Aeq,beq,lb,ub)
 5 x = ga(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon)
 6 x = ga(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,options)
 7 x = ga(fun,nvars,A,b,[],[],lb,ub,nonlcon,IntCon)
 8 x = ga(fun,nvars,A,b,[],[],lb,ub,nonlcon,IntCon,options)
 9 x = ga(problem)
10 [x,fval] = ga(___)
11 [x,fval,exitflag,output] = ga(___)
12 [x,fval,exitflag,output,population,scores] = ga(___)

参数解释

  fun: 要执行最优化的函数,用于输入待优化变量$x$。只能包含一个参数,可以是单个标量,也可以是向量。输出一个标量。

  nvars: 最优化函数传入向量的元素数量。

  A, b: 线性不等式约束的系数。即待优化变量$x$要满足$Acdot x le b$。

  Aeq, beq: 线性等式约束的系数。即待优化变量$x$要满足$Aeqcdot x = beq$。

  lb, ub: 传入向量的取值范围。即待优化变量$x$要满足$lble xle ub$。

  nonlcon: 定义非线性不等式约束和等式约束的函数。该函数只能包含一个参数用于接受待优化变量$x$,然后输出不等式约束值$C(x)$和等式约束值$Ceq(x)$。约束$x$满足$C(x)le 0$和$Ceq(x)=0$。

  IntCon: 限制待优化参数为整数,传入需要限制为整数的待优化参数的位置。如对于3维变量$x$,设置IntCon为$[1,3]$表示第一和第三维的元素被限制为整数。

  options: 遗传算法的设置,设置初始化、迭代次数、种群大小等。具体请看链接

  []: 对于不想使用的约束,可以用中括号[]省略。

传出参数

  x: 最优化后的变量。

  fval: $x$对应的函数值。

  exitflag: 遗传算法结束标志,一个整数。分别解释如下:

  output: 遗传算法的优化过程信息。

  population: 遗传迭代最后的种群。数组每行表示一个函数变量。

  scores: 最后种群的个体值。也就是数组中各个变量的函数值。

例子

  首先定义待优化函数:

 1 function outp = func(varargin)
 2     narginchk(1,2);
 3     if nargin == 1
 4         x = varargin{1}(1);
 5         y = varargin{1}(2);  
 6     elseif nargin == 2 
 7         x = varargin{1};
 8         y = varargin{2};   
 9     end 
10     outp = 2*exp((-(x+3).^2-(y-3).^2)/10) + 1.2*exp((-(x-3).^2-(y+3).^2)/10) + exp(-cos(3*x)-sin(3*y));
11     outp = -outp;
12 end

  然后是该函数的可视化和优化:

 1 %% 函数可视化
 2 x = linspace(-5,0,500);
 3 y = linspace(0,5,500);
 4 [X, Y] = meshgrid(x, y); 
 5 
 6 Z = func(X, Y); 
 7 mesh (X,Y,Z);
 8 
 9 %% 优化
10 [x, f] = ga(@func, 2);

  通过可视化可以看到最小值大概在$(-3.14, 3.66)$附近:

  优化结果也是如此:

原文地址:https://www.cnblogs.com/qizhou/p/15103375.html