下面介绍的函数都是Sheriffed大学遗传算法工具包内的常用函数

  • 复制矩阵
B=rep(A,RepN)
  • 1

A表示要被复制的矩阵,RepN包含每个方向的复制次数,RepN(1)代表纵向复制次数,RepN(2)代表横向复制次数 
比如

A=[1,2;3,4];
B=rep(A,[1,2])
B=[1,2,1,2
3,4,3,4]
  • 1
  • 2
  • 3
  • 4

如果是

B=rep(A,[2,1])
B=[1,2
3,4
1,2
3,4]
  • 1
  • 2
  • 3
  • 4
  • 5

=-= 教材里介绍了这个,但之后没有用到哎……

  • 创造种群
Chrom=crtbp(n,b)
  • 1

n代表染色体个数,b代表二进制数的位数(可以理解为基因数)

  • 二进制转十进制数
bs2rv(Chrom,Field)
  • 1

Field是个矩阵,有如下参数

Field=[b;lowerbound;upperbound;code;scale;lbin;ubin]
  • 1

各个参数的意义如下: 
 b代表二进制数串的长度,后面那俩表示原来十进制数的上下界 
 code代表编码方式,1表示二进制编码 
 scale表示每个串的刻度,0代表算数刻度,1代表对数刻度 
 lbin和ubin表示参数的取值是否包括边界,0表示不包括,1表示包括

 bs2rv(Chrom,Field)返回的是个列向量,其中每行就是原来Chrom里每行对应的十进制数

  • 计算适应度值
FitnV=ranking(ObjV)
  • 1

 ObjV是定义好的目标函数 
 老实讲,我没搞懂它这个ranking的返回值是什么意思。但就把它当做可以计算出各个染色体的适应值,并表明他们被传递到下一代的概率为多少的函数吧 
 就是执行算出我笔记中那张表的函数? 
 这里需要强调一点。ranking默认的是求最小,如果你要求的问题是最大,那就写成ranking(-ObjV) 
+ 根据适应度值通过选择来得到新种群

SelCh=select(SEL_F,Chrom,FitnV,GGAP)
  • 1

 SEL_FeL_是个字符串,表明调用的选择函数,可以用rws(轮盘选择)或者sus(随机遍历采样) 
 GGAP代表这一代传到下一代的概率,就是新种群中的个体数为现在的几分之几 
 =-= 既然咱看的教程是拿rws讲的,那就用rws来搞

  • 令新种群进行交配
SelCh = recombin(REC_F,SelCh,px)
  • 1

 REC_F是个字符串,是指定交配的方式,可以用recdis或xovsp函数 
 px代表交配概率,可能就是教程里指的那个概率吧 
 recdis代表离散重组,xovsp是单点交叉 
 感觉xovsp跟之前原理中的交配方式有点像?

  • 令新种群进行变异
SelCh = mut(SelCh,pm)
  • 1

 pm代表变异概率,如果直接用Selch = mut(SelCh),它会被设为缺省值0.7

  • 子代插入父代 
     呃…………这个,可以理解为是父代便当了一部分,子代出生了一部分,这个操作代表的就是在子代出生父代便当后的新子群,它是把子代中的一部分和父代中的一部分混合了。混合完后得到的种群染色体总数是不变的
[Chrom,ObjVCh] = reins(Chrom, SelCh,SUBPOP,InsOpt,ObjVCh,ObjVSel)
  • 1

 里面各个参数意义如下: 
 Chrom是父代,SelCh是子代 
 SUBPOP一般作为1,指明Chrom和SelCh中子种群的个数 
 InsOpt是一个最多有俩参数的向量,Insopt(1)如果是0,代表子代代替父代使用均匀随机选择,Insopts(1)如果是1,代表子代代替父代是基于适应度选择,子代代替父代中适应度最小的个体 
 Insopt(2)表示每个子种群中重插入的子代个体在整个子种群中个体的比率,如果没写,默认为1 
 ObjVCh代表Chrom里个体的目标值,ObjVSel代表SelCh中的目标值,如果子代的数量大于重插入种群中的子代数量,则ObjVSel是必需的,这种情况子代将按它们的适应度大小选择插入

值得注意的是,如果是多变量的最优化问题,那在初始化种群时虽然是把俩变量对应的基因拼在一起初始化的,但在转化为二进制,计算适应度函数时,都是分开来算的。看下面两段代码

%求sin(10*pi*X)/X的最小值
lb=1;ub=2; %函数自变量范围【1,2】
ezplot('sin(10*pi*X)/X',[lb,ub]); %画出函数曲线
xlabel('自变量/X')
ylabel('函数值/Y')
%% 定义遗传算法参数
NIND=40; %个体数目
MAXGEN=20; %最大遗传代数
PRECI=20; %变量的二进制位数
GGAP=0.95; %代沟
px=0.7; %交叉概率
pm=0.01; %变异概率
trace=zeros(2,MAXGEN); %寻优结果的初始值
FieldD=[PRECI;lb;ub;1;0;1;1]; %区域描述器
Chrom=crtbp(NIND,PRECI); %初始种群
%% 优化
gen=0; %代计数器
X=bs2rv(Chrom,FieldD); %计算初始种群的十进制转换
ObjV=sin(10*pi*X)./X; %计算目标函数值
while gen<MAXGEN
FitnV=ranking(ObjV); %分配适应度值
SelCh=select('sus',Chrom,FitnV,GGAP); %选择
SelCh=recombin('xovsp',SelCh,px); %重组
SelCh=mut(SelCh,pm); %变异
X=bs2rv(SelCh,FieldD); %子代个体的十进制转换
ObjVSel=sin(10*pi*X)./X; %计算子代的目标函数值
[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群
X=bs2rv(Chrom,FieldD);
gen=gen+1; %代计数器增加 [Y,I]=min(ObjV); %Y是ObjV里最小的值,I是表示它是第几个,这样就可以找出使Y最小的X
trace(1,gen)=X(I); %记下每代最优值对应的X
trace(2,gen)=Y; %记下每代目标函数的最优值
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

 对于下面这段代码,需要强调这么一点: 
 它这个工具包是默认求ObjV的最小值的,如果你要求最大值,那么在ranking时就应该按照-ObjV来分配适应度值,筛选染色体 
 这样筛选出来的染色体是能让ObjV取最大值的染色体,所以在获取最优解参数时,是用 [Y,I]=max(ObjV); 而不是 [Y,I]=min(ObjV);

%求y*sin(2*pi*x)+x*cos(2*pi*y)的最大值

lbx=-2;ubx=2; %函数自变量x范围【-2,2】
lby=-2;uby=2; %函数自变量y范围【-2,2】
ezmesh('y*sin(2*pi*x)+x*cos(2*pi*y)',[lbx,ubx,lby,uby],50); %画出函数曲线
hold on;
%% 定义遗传算法参数
NIND=40; %个体数目
MAXGEN=50; %最大遗传代数
PRECI=20; %变量的二进制位数
GGAP=0.95; %代沟
px=0.7; %交叉概率
pm=0.01; %变异概率
trace=zeros(3,MAXGEN); %寻优结果的初始值
FieldD=[PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1]; %区域描述器
Chrom=crtbp(NIND,PRECI*2); %初始种群
%% 优化
gen=0; %代计数器
XY=bs2rv(Chrom,FieldD); %计算初始种群的十进制转换
X=XY(:,1);Y=XY(:,2);
ObjV=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %计算目标函数值
while gen<MAXGEN
FitnV=ranking(-ObjV); %分配适应度值
SelCh=select('sus',Chrom,FitnV,GGAP); %选择
SelCh=recombin('xovsp',SelCh,px); %重组
SelCh=mut(SelCh,pm); %变异
XY=bs2rv(SelCh,FieldD); %子代个体的十进制转换
X=XY(:,1);Y=XY(:,2);
ObjVSel=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %计算子代的目标函数值
[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群
XY=bs2rv(Chrom,FieldD);
gen=gen+1; %代计数器增加
%获取每代的最优解及其序号,Y为最优解,I为个体的序号
[Y,I]=max(ObjV);
trace(1:2,gen)=XY(I,:); %记下每代的最优值
trace(3,gen)=Y; %记下每代的最优值
end
代码运行过程中,可能会出现未定义函数“rep”“crtbp”问题,其原因是没有安装MATLAB遗传工具箱,具体下载:

详见http://www.ilovematlab.cn/thread-28448-1-1.html

添加路径方法

   1. 以gatbx工具箱为例,先将gatbx文件夹复制到MATLAB安装目录下的toolbox下,然后打开MATLAB,点击菜单中file ->set path,选ADD FOLDER,选择你刚才复制的那个文件夹就OK

2 .直接把文件夹添加在运行目录里面。

遗传算法MATLAB工具包简介的更多相关文章

  1. Windows Phone 8初学者开发—第17部分:Coding4Fun工具包简介

    原文 Windows Phone 8初学者开发—第17部分:Coding4Fun工具包简介 第17部分:Coding4Fun工具包简介 原文地址:  http://channel9.msdn.com/ ...

  2. 遗传算法matlab实现

    我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下运用MATLAB实现遗传算法:   clc clear   %参数 a = 0 ; b = 4 ; e ...

  3. MATLAB工具包——curvelet变换的理解(转)

    curvelet下载的curvelet工具包,有以下三个文件:fdct_usfft_matlab.fdct_wrapping_matlab.mecv三个文件夹添加到matlab路径中即可. curve ...

  4. 遗传算法MATLAB实现(2):一元函数优化举例

    遗传算法提供了一种求解非线性.多模型.多目标等复杂系统优化问题的通用框架. 先从例子开始,慢慢再总结理论... [例]利用遗传算法计算函数f(x)=x*cos(5*pi*x)+3.5在区间[-1,2. ...

  5. Apache commons (Java常用工具包)简介

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...

  6. Python之关于工具包简介

    1.Pandas Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的 ...

  7. 遗传算法MATLAB实现(3):多元函数优化举例

    多峰的Shubert为: 求f(x,y)在[-10,10]x[-10,10]上的最大值. MATLAB代码: fun_mutv函数为: function my=fun_mutv(x,y) t1=zer ...

  8. 遗传算法MATLAB实现(1):工具箱下载及安装

    到官网下载谢菲尔德大学的GA工具箱:http://codem.group.shef.ac.uk/index.php/ga-toolbox(其实蛮不懂为什么有人把这个传到某个网上还需要积分才能下载,人家 ...

  9. 遗传算法Matlab源程序

    参考自: http://blog.163.com/zhaoshuyu_thomas/blog/static/461929072009103034816716/ 大家内容上可以参考上述文章,但其代码有很 ...

随机推荐

  1. Web前端基础——jQuery(一)

    前几天回老家呆了几天,几乎没有怎么学习新的知识,这期间一直有断断续续的看<Java编程思想>,还刷了一些前沿消息,也算没闲着.今天开始学习jQuery啦,继续前进. 在网上查了,买了这本书 ...

  2. 【Json】1、JSON 数据格式

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易 ...

  3. module.exports和exports.md

    推荐写法 具体解释可以往后看. 'use strict' let app = { // 注册全局对象 ... } ... // 封装工具箱 exports = module.exports = app ...

  4. setTimeout.js

    var cyn = function(){ console.log("我是延时输出的函数") } setTimeout(cyn,5000)

  5. Archlinux/Manjaro使用笔记-报错:一个或多个 PGP 签名无法校验!的解决方法

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 解决办法:添加无法校验的pgp签名为信任 gpg --recv-keys xxxxxx xxxxxx为无法校验的gpg值

  6. layui 图片上传+表单提交+ Spring MVC

    Layui 的上传是最常用的, 不可或缺, 记录一下代码, 以后复制都能用!! 1.前端HTML: <div class="layui-form-item"> < ...

  7. git命令详解( 八)

    此为记录git的第八篇,前七篇为远程篇,工作中最常用的都在前七篇,因为要在远程分支上合作开发     在提交树上移动 撤销变更 在提交树上移动 在接触 Git 更高级功能之前,我们有必要先学习在你项目 ...

  8. docker 安装jenkins

    基于docker 进行安装 软件,首先需要有docker环境. 1.docker 下载 jenkins 镜像 指定版本 ,因为低版本的后面安装 软件会失败(亲测). docker pull jenki ...

  9. flume组件汇总 source、sink、channel

    Flume Source Source类型 说明 Avro Source 支持Avro协议(实际上是Avro RPC),内置支持 Thrift Source 支持Thrift协议,内置支持 Exec  ...

  10. JavaScript大杂烩4 - 理解JavaScript对象的继承机制

    JavaScript是单根的完全面向对象的语言 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承.而在JavaScript的 ...