遗传算法是一种通用的最优化方法,具体原理可以看:遗传算法详解与实验。下面记录在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$要满足$A\cdot x \le b$。

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

  lb, ub: 传入向量的取值范围。即待优化变量$x$要满足$lb\le x\le 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)$附近:

  优化结果也是如此:

在matlab中使用遗传算法执行最优化的更多相关文章

  1. Matlab中的一些小技巧

    (转于它处,仅供参考) 1.. Ctrl+C 中断正在执行的操作 如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断.MATLAB这时可能正疲于应付,响应会有些滞后. ...

  2. 【matlab】将matlab中数据输出保存为txt或dat格式

    将matlab中数据输出保存为txt或dat格式 总结网上各大论坛,主要有三种方法. 第一种方法:save(最简单基本的) 具体的命令是:用save *.txt -ascii x x为变量 *.txt ...

  3. 在matlab中配置vlfeat

    [转自]http://cnyubin.com/?p=85 在VLFeat官网上是这么介绍VLFeat的:VLFeat开源库实现了很多著名的机器视觉算法,如HOG, SIFT, MSER, k-mean ...

  4. matlab中subplot函数的功能

    转载自http://wenku.baidu.com/link?url=UkbSbQd3cxpT7sFrDw7_BO8zJDCUvPKrmsrbITk-7n7fP8g0Vhvq3QTC0DrwwrXfa ...

  5. 将matlab中数据输出保存为txt或dat格式

    :FID= FOPEN(filename,permission) 用指定的方式打开文件 FID=+N(N是正整数):表示文件打开成功,文件代号是N. FID=-1            : 表示文件打 ...

  6. Matlab中reshape函数的使用

    reshape把指定的矩阵改变形状,但是元素个数不变, 例如,行向量: a = [1 2 3 4 5 6] 执行下面语句把它变成3行2列: b = reshape(a,3,2) 执行结果: b = 1 ...

  7. Matlab中的数据类型

    Matlab中有15种基本数据类型,主要是整型.浮点.逻辑.字符.日期和时间.结构数组.单元格数组以及函数句柄等.         1.整型:(int8:uint8:int16:uint16:int3 ...

  8. 关于MATLAB中的tic toc的问题

    关于MATLAB中的tic toc的问题 其一) MATLAB实际单位时间计时函数的具体应用,在编写程序时,经常需要获知代码的执行实际时间,这就需要在程序中用到计时函数,matlab中提供了以下三种方 ...

  9. MATLAB中的函数的归总

    字符串操作函数 1.        函数eval可以用来执行用字符串表示的表达式 2.        函数deblank可以去掉字符串末尾的所有空格 3.        函数findstr可以用来在长 ...

  10. MATLAB中多行注释的三种方法

    MATLAB中多行注释的三种方法 A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...

随机推荐

  1. ChatGPT 客户端推荐

    通过按量计费的 Token 使用 ChatGPT 可以获得比免费 ChatGPT 更快的响应速度,但又不必支付昂贵的每月 20 美金订阅费用.下面是一些我个人喜欢的支持 Token 的 ChatGPT ...

  2. 【Mac + Appium + Java1.8(三)】之IOS自动化环境安装配置以及简单测试用例编写(模拟器、真机)

    前提条件: =========================================== 1.Xcode版本为Xcode10及以上2.Appium版本必须为1.9及以上,因为Xcode为10 ...

  3. 【openGauss】运维常用的SQL

    一.查模式 SELECT pn.oid AS schema_oid, iss.catalog_name, iss.schema_owner, iss.schema_name FROM informat ...

  4. 互联网医疗|基于音视频SDK和即时通讯IM技术实现线上问诊功能

    近期,包括北上广深在内的国内多个城市相继推动线上医保购药试点,实施进展备受网民关注. 不止于线上买药,包括健康咨询.在线问诊在内的互联网医疗服务进一步满足了人们对便捷医疗服务的需求,得到了相关政策的积 ...

  5. migration to end point routing

    花了几个小时,记入一下吧. 1. odata https://devblogs.microsoft.com/odata/enabling-endpoint-routing-in-odata/ 找着弄就 ...

  6. Identity – Introduction & Scaffold

    主要参考: Introduction to Identity on ASP.NET Core Start by command dotnet new webapp --auth Individual ...

  7. EntityFramework Core并发迁移解决方案

    场景 目前一个项目中数据持久化采用EF Core + MySQL,使用CodeFirst模式开发,并且对数据进行了分库,按照目前颗粒度分完之后,大概有一两百个库,每个库的数据都是相互隔离的. 借鉴了G ...

  8. 5G网络架构的演进趋势

    5G网络架构的演进趋势 概述 5G移动通信网络系统包括5GC(5G Core Network,5G核心网)和NG-RAN(Next Generation Radio Access Network,5G ...

  9. Docker基本操作(端口?网络模式?)(五)

    一.端口暴露 Docker 容器更多情况下是用来运行 Web 应用的,所以要如何访问到容器中的 Web 服务呢?比如我们现在运行一个 nginx 容器服务: $ docker run --name w ...

  10. 【赵渝强老师】什么是Oracle的数据字典?

    数据字典是oracle存放有关数据库信息的地方,几乎所有的系统信息和对象信息都可在数据字典中进行查询.数据字典是oracle数据库系统的信息核心,它是一组提供有关数据库信息的表和视图的集合,这些表和视 ...