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


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自动调用IE打开某个网站的方法
Jun 03 Python
python实现按行切分文本文件的方法
Apr 18 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
Python格式化日期时间操作示例
Jun 28 Python
python实现从pdf文件中提取文本,并自动翻译的方法
Nov 28 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
Python中extend和append的区别讲解
Jan 24 Python
Python列表切片操作实例总结
Feb 19 Python
python多线程实现代码(模拟银行服务操作流程)
Jan 13 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
Python 实现键盘鼠标按键模拟
Nov 18 Python
解决numpy数组互换两行及赋值的问题
Apr 17 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项目打包方法
2008/02/18 PHP
php实现的简单压缩英文字符串的代码
2008/04/24 PHP
php中++i 与 i++ 的区别
2012/08/08 PHP
19个超实用的PHP代码片段
2014/03/14 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
使用JS动态显示文本
2017/09/09 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
JS写滑稽笑脸运动效果
2020/05/28 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
python生成随机mac地址的方法
2015/03/16 Python
python实现2048小游戏
2015/03/30 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
Python_LDA实现方法详解
2017/10/25 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
会计助理的岗位职责
2013/11/29 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
高中同学会致辞
2015/08/01 职场文书
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python
MySQL数据库简介与基本操作
2022/05/30 MySQL
Redis基本数据类型哈希Hash常用操作命令
2022/06/01 Redis