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


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实现问号表达式(?)的方法
Nov 27 Python
Python 专题一 函数的基础知识
Mar 16 Python
python利用Guetzli批量压缩图片
Mar 23 Python
浅谈python连续赋值可能引发的错误
Nov 10 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
Feb 26 Python
Python使用修饰器进行异常日志记录操作示例
Mar 19 Python
用Cython加速Python到“起飞”(推荐)
Aug 01 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
Oct 21 Python
tensorflow指定GPU与动态分配GPU memory设置
Feb 03 Python
pytorch加载自己的图像数据集实例
Jul 07 Python
Python使用DFA算法过滤内容敏感词
Apr 22 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学习教程之第2天
2008/06/15 PHP
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
javascript常见操作汇总
2014/09/03 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
2017/02/20 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
详解webpack的配置文件entry与output
2017/08/21 Javascript
javascript input输入框模糊提示功能的实现
2017/09/25 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
详解Python3 pandas.merge用法
2019/09/05 Python
python数字类型math库原理解析
2020/03/02 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
大四学年自我鉴定
2013/11/13 职场文书
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
党员自我评价范文2015
2015/03/03 职场文书
微信早安问候语
2015/11/10 职场文书