使用遗传算法求二元函数的最小值


Posted in Python onFebruary 11, 2020

二元函数为y=x1^2+x2^2,x∈[-5,5]

NIND=121;  %初始种群的个数(Number of individuals)
NVAR=2;   %一个染色体(个体)有多少基因
PRECI=20;  %变量的二进制位数(Precision of variables)
MAXGEN=200;  %最大遗传代数(Maximum number of generations)
GGAP=0.8;  %代沟(Generation gap),以一定概率选择父代遗传到下一代
trace=zeros(MAXGEN,2);   %寻优结果的初始值

Chrom=crtbp(NIND,PRECI*NVAR); %初始种群

%区域描述器(Build field descriptor)
%确定每个变量的二进制位数,取值范围,及取值范围是否包括边界等。
FieldD=[rep([PRECI],[1,NVAR]);rep([-5;5],[1,NVAR]);rep([1;0;1;1],[1,NVAR])];
Objv=objfun(bs2rv(Chrom,FieldD))
gen=1;     %代计数器
while gen<=MAXGEN
 Fitv=ranking(Objv); %分配适应度值(Assign fitness values)
 SelCh=select('sus',Chrom,Fitv,GGAP); %选择
 SelCh=recombin('xovsp',SelCh,1);  %重组
 SelCh=mut(SelCh);      %变异
 ObjVSel=objfun(bs2rv(SelCh,FieldD));%子代个体的十进制转换
 %重插入子代的新种群
 [Chrom,Objv]=reins(Chrom,SelCh,1,1,Objv,ObjVSel);
 trace(gen,1)=min(Objv);   %遗传算法性能跟踪
 trace(gen,2)=sum(Objv)/length(Objv);
  gen=gen+1;     %代计数器增加
end
plot(trace(:,1));
hold on
plot(trace(:,2),'.')
grid
legend('最优解的变化','解的平均值的变化')

使用遗传算法求二元函数的最小值

根据上面的求解模型,可以写出模型的.M文件如下,即适应度函数

% OBJFUN.M  
% Syntax: ObjVal = objfun1(Chrom,rtn_type)
%
% Input parameters:
% Chrom  - Matrix containing the chromosomes of the current
%    population. Each row corresponds to one individual's
%    string representation.
%    if Chrom == [], then special values will be returned
% rtn_type - if Chrom == [] and
%    rtn_type == 1 (or []) return boundaries
%    rtn_type == 2 return title
%    rtn_type == 3 return value of global minimum
%
% Output parameters:
% ObjVal - Column vector containing the objective values of the
%    individuals in the current population.
%    if called with Chrom == [], then ObjVal contains
%    rtn_type == 1, matrix with the boundaries of the function
%    rtn_type == 2, text for the title of the graphic output
%    rtn_type == 3, value of global minimum
% Author:  YQ_younger

function ObjVal = objfun(Chrom,rtn_type);

% Dimension of objective function
 Dim = 2; 
% Compute population parameters
 [Nind,Nvar] = size(Chrom);
% Check size of Chrom and do the appropriate thing
 % if Chrom is [], then define size of boundary-matrix and values
 if Nind == 0
  % return text of title for graphic output
  if rtn_type == 2
   ObjVal = ['DE JONG function 1-' int2str(Dim)];
  % return value of global minimum
  elseif rtn_type == 3
   ObjVal = 0;
  % define size of boundary-matrix and values
  else 
   % lower and upper bound, identical for all n variables  
   ObjVal = 1*[-5; 5];
   ObjVal = ObjVal(1:2,ones(Dim,1));
  end
 % if Dim variables, compute values of function
 elseif Nvar == Dim
  % function 1, sum of xi^2 for i = 1:Dim (Dim=30)
  % n = Dim, -5 <= xi <= 5
  % global minimum at (xi)=(0) ; fmin=0
  ObjVal = sum((Chrom .* Chrom)')';
  % ObjVal = diag(Chrom * Chrom'); % both lines produce the same
 % otherwise error, wrong format of Chrom
 else
  error('size of matrix Chrom is not correct for function evaluation');
 end 
% End of function

注释:
种群表示和初始化函数 bs2rv:
二进制串到实值的转换
Phen=bs2rv(Chrom,FieldD) FieldD=[len, lb, ub, code, scale, lbin, ubin]
code(i)=1为标准的二进制编码,code(i)=0为格雷编码
scale(i)=0为算术刻度,scale(i)=1为对数刻度
函数 crtbp:
创建初始种群
[Chrom,Lind,BaseV]=crtbp(Nind,Lind)

[Chrom,Lind,BaseV]=crtbp(Nind,BaseV)
[Chrom,Lind,BaseV]=crtbp(Nind,Lind,BaseV)

Nind指定种群中个体的数量,Lind指定个体的长度
函数 crtrp:
创建实值原始种群
Chrom=crtrp(Nind,FieldDR)

适应度计算函数 ranking:
基于排序的适应度分配(此函数是从最小化方向对个体进行排序的)
FitV=ranking(ObjV)
FitV=ranking(ObjV, RFun)
FitV=ranking(ObjV, RFun, SUBPOP)
Rfun(1)线性排序标量在[1 2]间为,非线性排序在[1 length(ObjV)-2]
Rfun(2)指定排序方法,0为线性排序,1为非线性排序
SUBPOP指明ObjV中子种群的数量,默认为1

选择高级函数 select:
从种群中选择个体
SelCh=select(SEL_F, Chrom, FitnV)
SelCh=select(SEL_F, Chrom, FitnV, GGAP)
SelCh=select(SEL_F, Chrom, FitnV, GGAP, SUBPOP)

SEL_F是一字符串,为一低级选择函数名,如rws或sus
GGAP指出了代沟,默认为1;也可大于1,允许子代数多于父代的数量
rws: 轮盘赌选择
NewChrIx=rws(FitnV, Nsel) 使用轮盘赌选择从一个种群中选择Nsel个个体
NewChrIx 是为育种选择的个体的索引值
sus:
随机遍历抽样
NewChrIx=sus(FitnV, Nsel)

交叉高级函数 recombin:
重组个体
NewChrom=recombin(REC_F, Chrom)
NewChrom=recombin(REC_F, Chrom, RecOpt)
NewChrom=recombin(REC_F, Chrom, RecOpt, SUBPOP)
REC_F是包含低级重组函数名的字符串,例如recdis,recint,reclin,xovdp, xovdprs, xovmp, xovsh, xovshrs, xovsp, xovsprs
recdis:
离散重组
NewChrom=recdis(OldChorm)
recint:
中间重组
NewChrom=recint(OldChorm)
reclin:
线性重组
NewChrom=reclin(OldChorm)
xovdp:

两点交叉

NewChrom=xovdp(OldChrom, XOVR)

XOVR为交叉概率, 默认为0.7
Xovdprs:
减少代理的两点交叉
NewChrom=xovdprs(OldChrom, XOVR)
Xovmp:

多点交叉

NewChrom=xovmp(OldChrom, XOVR, Npt, Rs)

Npt指明交叉点数, 0 洗牌交叉;1 单点交叉;2 两点交叉;
默认为0

Rs指明使用减少代理, 0 不减少代理;1 减少代理;
默认为0
Xovsh:

洗牌交叉

NewChrom=xovsh(OldChrom, XOVR)
Xovshrs:
减少代理的洗牌交叉
NewChrom=xovshrs(OldChrom, XOVR)
Xovsp:
单点交叉
NewChrom=xovsp(OldChrom, XOVR)
Xovsprs:
减少代理的单点交叉
NewChrom=xovsprs(OldChrom, XOVR)

变异高级函数 mutate:
个体的变异
NewChorm=mutate(MUT_F, OldChorm, FieldDR) NewChorm=mutate(MUT_F, OldChorm, FieldDR, MutOpt) NewChorm=mutate(MUT_F, OldChorm, FieldDR, MutOpt, SUBPOP) MUT_F为包含低级变异函数的字符串,例如mut, mutbga, recmut
mut:
离散变异算子
NewChrom=mut(OldChorm, Pm) NewChrom=mut(OldChorm, Pm, BaseV)
Pm为变异概率,默认为Pm=0.7/Lind
mutbga:
实值种群的变异(遗传算法育种器的变异算子) NewChrom=mutbga(OldChorm, FieldDR)
NewChrom=mubga(OldChorm, FieidDR, MutOpt)
MutOpt(1)是在[ 0 1]间的重组概率的标量,默认为1
MutOpt(2)是在[0 1]间的压缩重组范围的标量,默认为1(不压缩)
recmut:
具有突变特征的线性重组
NewChrom=recmut(OldChorm, FieldDR)
NewChrom=recmut(OldChorm, FieidDR, MutOpt)

重插入函数 reins:
重插入子群到种群
Chorm=reins(Chorm, SelCh)
Chorm=reins(Chorm, SelCh, SUBPOP)
Chorm=reins(Chorm, SelCh, SUBPOP, InsOpt, ObjVch)
[Chorm, ObjVch]=reins(Chorm, SelCh, SUBPOP, InsOpt, ObjVch, ObjVSel)
InsOpt(1)指明用子代代替父代的选择方法,0为均匀选择,1为基于适应度的选择,默认为0
InsOpt(2)指明在[0 1]间每个子种群中重插入的子代个体在整个子种群的中个体的比率,默认为1

ObjVch包含Chorm中个体的目标值,对基于适应度的重插入是必需的
ObjVSel包含Selch中个体的目标值,如子代数量大于重插入种群的子代数量是必需的

其他函数矩阵复试函数 rep:
MatOut=rep(MatIn, REPN)
REPN为复制次数

以上这篇使用遗传算法求二元函数的最小值就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用ConfigParser解析ini配置文件实例
Aug 30 Python
Python使用logging结合decorator模式实现优化日志输出的方法
Apr 16 Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 Python
Python实现爬虫爬取NBA数据功能示例
May 28 Python
python设置值及NaN值处理方法
Jul 03 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
在notepad++中实现直接运行python代码
Dec 18 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
python 如何设置守护进程
Oct 29 Python
Pytorch可视化的几种实现方法
Jun 10 Python
Python for循环搭配else常见问题解决
Feb 11 #Python
Python获取二维数组的行列数的2种方法
Feb 11 #Python
使用Puppeteer爬取微信文章的实现
Feb 11 #Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 #Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 #Python
如何通过python实现全排列
Feb 11 #Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
Feb 11 #Python
You might like
生成静态页面的php函数,php爱好者站推荐
2007/03/19 PHP
flash用php连接数据库的代码
2011/04/21 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
js动态生成指定行数的表格
2013/07/11 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
python之import机制详解
2014/07/03 Python
简单介绍Python中的JSON模块
2015/04/08 Python
详解Python的Django框架中的中间件
2015/07/24 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
python树的同构学习笔记
2019/09/14 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
UNIX文件名称有什么规定
2013/03/25 面试题
庆七一活动方案
2014/01/25 职场文书
关于元旦的广播稿
2014/02/16 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android