前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >人工智能算法:Matlab遗传算法工具箱使用方法

人工智能算法:Matlab遗传算法工具箱使用方法

作者头像
用户1143655
发布2023-02-23 11:53:08
3K0
发布2023-02-23 11:53:08
举报
文章被收录于专栏:全栈之殇

一、遗传算法的理论基础

作为一种进化算法,遗传算法(GA, Genetic Algorithm)的基本原理是将问题参数编码为染色体,进而利用优化迭代的方法进行选择、交叉和变异算子操作来交换种群中染色体的信息,最终生成符合优化目标的染色体。

为了更好地理解与运用遗传算法解决实际问题,结合求解如下所示二元函数的最小值为例,理解如下相关专业术语:

f(x_1, x_2) = (x_1+1)^2 + (2x_2-3)^2
  • (1)个体(Individual):个体就是问题的一个解,比如上式的
(1,2)

就是以个体,即

x_1=1,x_2=2

  • (2)适应度函数(Fitness Function)与适应度函数值(Fitness Value):适应度函数就是待优化的函数,比如上面的二元函数
f(x_1, x_2)

就是一个适应度函数。适应度函数值表示一个代优化问题一个解对应的函数值。比如,对于上面的适应度函数

f(x_1,x_2)

的一个解

(1,2)

,对应的适应度函数值为

f(1,2)=(1+1)^2+(2\times 2 -3)^2 = 5

。因此,对于求解最小值的优化问题,某个个体的适应度数值越小,则该个体(解)越适应环境。

  • (3)种群(Population)与种群大小(Population Size):种群是由若干个体组成的集合;种群大小就是一个和种群所包含个体的数量,对于
n

m

列的种群,

n

表示种群的大小,

m

表示适应度函数的自变量个数。以上面的问题为例,矩阵

[1,2;3,4;5,6;7,8;9,10]

则表示一个大小为

5

的种群,其个体依次为

(1,2)、(3,4)、(5,6)、(7,8)、(9,10)

  • (4)代(Generation)、父代(Parents)与子代(Children):遗传算法作为一种迭代优化算法,每次迭代产生的新种群就是新的一代;子代为遗传算法每次迭代产生的新种群,而父代则为产生子代的种群。
  • (5)选择(Selection)、交叉(Crossover)与变异(Mutation):
    • 选择:选取种群中适应度函数值较小的若干个体作为父代,进而作为父代为下一代繁衍子孙。对于适应度函数值太大的个体表示不适应环境,则会被淘汰;
    • 交叉:是遗传算法中最重要的遗传操作,通过交叉操作可以得到新一代个体,新个体组合其父代的个体特性;
    • 变异:在群体中随机选择一个个体,对其中个体以一定概率随机的改变串结构数据中某个基因值。
  • (6)精英数目(EliteCount)与交叉后代比例(Crossover Fraction):
    • 精英数目:表示某个种群中适应度函数值最低的若干个体,为了保证算法收敛性,遗传算法采用精英保留策略,即父代中的精英直接传给子代,而不经过交叉与变异操作;
    • 交叉后代比例:为一个
    (0,1)

    之间的数,表示子代中由交叉产生的个体占父代中非精英个体的比例。比如,如果种群大小为

    20

    ,精英数目为

    2

    ,交叉后代比例是

    0.8

    ,那么在子代中,将有

    2

    个保留的精英,则由交叉产生的后代将有

    (20-2) \times 0.8 = 14.4

    14

    个。

二、使用GADST工具箱实现遗传算法实例

本文使用Matlab子代的遗传算法工具箱GADST,该工具箱目前已经继承到Global Optimization Toolbox中。该部分主要介绍如何使用该工具箱,具体使用细节可以参考本文第三部分。

2.1 问题描述

该小节使用GADST求解如下所示的非线性方程组:

\begin{cases} 4x_1^3 + 4x_1x_2 + 2x_2^2 - 42x_1 - 14 = 0 \newline 4x_2^3 + 4x_1x_2 + 2x_1^2 - 26x_1 - 22 = 0 \end{cases}

为了能够使用遗传算法,将上面的非线性方程组的求解转化为求解函数最小值的问题,如下所示:

\begin{cases} f_1(x_1,x_2) = 4x_1^3 + 4x_1x_2 + 2x_2^2 - 42x_1 - 14 \newline f_2(x_1,x_2) = 4x_2^3 + 4x_1x_2 + 2x_1^2 - 26x_1 - 22 \newline {\rm min} f(x_1,x_2) = f_1^2(x_1,x_2) + f_2^2(x_1,x_2) \end{cases}

2.2 基于GADST工具箱实现遗传算法的实现

本小节基于GADST工具箱实现遗传算法求解2.1部分的问题。

1、目标函数M文件编写

使用GADST求解优化问题首先需要编写适应度函数的M文件。对于上面的问题适应度函数GA_FitFun.m如下所示:

代码语言:javascript
复制
function f = GA_FitFun(x)
% 自适应度函数:待优化的目标函数

f1 = 4 * x(1).^3 + 4 * x(1) * x(2) + 2 * x(2).^2 - 42 * x(1) - 14;
f2 = 4 * x(2).^3 + 4 * x(1) * x(2) + 2 * x(1).^2 - 26 * x(1) - 22;
f = f1.^2 + f2.^2;

end

编写好适应度函数M文件后,就可以使用GADST工具箱使用遗传进行优化了。

2、遗传算法代码编写

具体的参数含义可以参考本文第三部分。

代码语言:javascript
复制
fitness_fun = @GA_FitFun;    % 适应度函数句柄
nvars = 2;                   % 个体所包含的变量数目

% 下面设置参数
options = gaoptimset('PopulationSize', 100, ...     % 种群包含个体数目
                     'EliteCount', 10, ...          % 种群中精英个体数目
                     'CrossoverFraction', 0.75, ... % 交叉后代比率
                     'Generations', 500, ...        % 迭代代数
                     'StallGenLimit', 500, ...      % 停止代数
                     'TolFun', 1e-100, ...          % 适应度函数偏差
                     'PlotFcns', {@gaplotbestf, @gaplotbestindiv}); % 绘制最优个体适应度函数与最优个体

% 调用函数ga,计算最优解x_best与最优值fval
[x_best, fval] = ga(fitness_fun, nvars, [], [], [], [], [], [], [], options);

注意: 适应度函数GA_FitFun.m文件必须在当前目录文件内。

3、结果分析

在遗传算法的运行过程,GADST调用gadsplot函数绘制名为Genetic Algorithm的图,且随着种群不断进化,该图也实时更新。当遗传算法完成时,得到如下图所示的最优个体适应度函数值变化曲线及最优个体。

上图中第一个图片最优个体适应度函数变化曲线的横坐标为进化代数(Generation),纵坐标为适应度函数值包括:种群的平均适应度函数值(Mean fitness)以蓝色点表示;最优个体对应的适应度函数值(Best fitness)以黑色线条表示。

当种群进化结束后,可以得到如上图第二个图片所示的最优个体的值

[2.8917, 2.3698]

,则对应的最优适应度函数值为

0.0429

。最优个体的值存储在x_best变量中,最优适应度函数值存储在fval变量中。

三、GADST遗传算法工具箱用法

3.1 GADST遗传工具箱简介

GADST遗传工具箱目前已经继承到Global Optimization Toolbox中,我们可以很方便地通过GUI界面或者命令行方式在Matlab中实现遗传算法,其位置在Matlab安装目录的/toolbox/globaloptim文件夹中。GADST是一个函数库,其中包含了遗传算法的主函数、各个子函数和一些绘图函数。GADST的组织结构及各个函数之间的关系如下图所示:

由上图可以看出,GADST的主函数为gagacommon函数可以确定优化问题的类型,ga进而分别调用如下三个函数:

  • gaunc函数:求解无约束优化问题;
  • galincon函数:求解线性约束优化问题;
  • gacon函数:求解非线性约束优化问题。

遗传算法使用函数makeState函数产生初始种群,然后判断是否退出算法,如果退出,则得到最优个体;如果不退出,则调用stepGA函数使得种群进化到下一代,同时调用gadsplot函数与isItTimeToStop函数分别进行绘图与判断终止条件。

3.2 GADST函数命令行使用方法

使用GADST实现遗传算法非常简单只需要了解如下两个函数:

  • gaoptimset函数:遗传算法参数设定函数;
  • ga函数:遗传算法实现函数。

1、gaoptimset函数

调用方法如下所示:

options = gaoptimset('Param', value, ...);

其中,Param等是需要设定参数,常用的设置参数如下所示:

  • (1)PopulationSize:种群包含个体数目;
  • (2)EliteCount:种群中精英个体数目;
  • (3)CrossoverFraction:交叉后代比率;
  • (4)Generations:迭代代数;
  • (5)StallGenLimit:终止迭代代数;
  • (6)TolFun:适应度函数偏差;
  • (7)PlotFcns:绘图结果句柄:
    • @gaplotbestf:绘制最优适应度函数值;
    • @gaplotbestindiv:绘制最优个体值。

2、ga函数

函数调用方法如下所示:

[x_best, fval] = ga(fitnessfcn, nvars, A, b, Aeq, beq, lb, ub, nonlcon, options);

其中,

  • (1)ga函数返回值:
    • x_best:遗传算法得到的最优个体;
    • fval:最优个体x_best对应的适应度函数值;
  • (2)ga函数的输入参数:
    • fitnessfcn:适应度函数句柄;
    • nvars:变量数目;
    • A、b、Aeq、beq:线性约束,可以表示为A*X <= b, Aeq * X = beq;
    • lb、ub:为上下限约束,可以表述为lb<=X<=ub
    • nonlcon:为非线性约束,需要使用M文件编写,该M文件返回的是CCeq,非线性约束可以表示为C(X)<=0, Ceq(X)=0。当没有约束时可使用[]表示;
    • options:为gaoptimset函数所设置的参数。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人工智能技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、遗传算法的理论基础
  • 二、使用GADST工具箱实现遗传算法实例
    • 2.1 问题描述
      • 2.2 基于GADST工具箱实现遗传算法的实现
      • 三、GADST遗传算法工具箱用法
        • 3.1 GADST遗传工具箱简介
          • 3.2 GADST函数命令行使用方法
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档