遗传算法中mut变异算子函数说明
- 格式:docx
- 大小:16.52 KB
- 文档页数:4
GATBX遗传算法工具箱函数及实例讲解基本原理:遗传算法是一种典型的启发式算法,属于非数值算法范畴。
它是模拟达尔文的自然选择学说和自然界的生物进化过程的一种计算模型。
它是采用简单的编码技术来表示各种复杂的结构,并通过对一组编码表示进行简单的遗传操作和优胜劣汰的自然选择来指导学习和确定搜索的方向。
遗传算法的操作对象是一群二进制串(称为染色体、个体),即种群,每一个染色体都对应问题的一个解。
从初始种群出发,采用基于适应度函数的选择策略在当前种群中选择个体,使用杂交和变异来产生下一代种群。
如此模仿生命的进化进行不断演化,直到满足期望的终止条件。
运算流程:Step 1:对遗传算法的运行参数进行赋值。
参数包括种群规模、变量个数、交叉概率、变异概率以及遗传运算的终止进化代数。
Step 2:建立区域描述器。
根据轨道交通与常规公交运营协调模型的求解变量的约束条件,设置变量的取值范围。
Step 3:在Step 2的变量取值范围内,随机产生初始群体,代入适应度函数计算其适应度值。
Step 4:执行比例选择算子进行选择操作。
Step 5:按交叉概率对交叉算子执行交叉操作。
Step 6:按变异概率执行离散变异操作。
Step 7:计算Step 6得到局部最优解中每个个体的适应值,并执行最优个体保存策略。
Step 8:判断是否满足遗传运算的终止进化代数,不满足则返回Step 4,满足则输出运算结果。
运用遗传算法工具箱:运用基于Matlab的遗传算法工具箱非常方便,遗传算法工具箱里包括了我们需要的各种函数库。
目前,基于Matlab的遗传算法工具箱也很多,比较流行的有英国设菲尔德大学开发的遗传算法工具箱GATBX、GAOT以及Math Works公司推出的GADS。
实际上,GADS就是大家所看到的Matlab中自带的工具箱。
我在网上看到有问为什么遗传算法函数不能调用的问题,其实,主要就是因为用的工具箱不同。
因为,有些人用的是GATBX带有的函数,但MATLAB自带的遗传算法工具箱是GADS,GADS当然没有GATBX里的函数,因此运行程序时会报错,当你用MATLAB来编写遗传算法代码时,要根据你所安装的工具箱来编写代码。
遗传算法遗传算法是一种借鉴生物遗传和进化机制寻求最优解的计算方法。
该方法模拟生物进化中的复制、交换、变异等过程,并通过模拟自然选择压力的方式推动问题解集向最优解方向移动。
遗传算法为解决多种难以采用传统数学方法求解的复杂问题提供了新的思路。
1. 遗传算法的发展历史研究者采用计算机模拟生物进化过程并解决优化问题的尝试始于20世纪40至50年代。
20世纪60年代中期,美国密歇根大学的Holland教授提出了位串编码技术,这种编码技术适用于变异操作和交叉操作,他指出在研究和设计人工自适应系统时可借鉴生物遗传的机制,以群体的方式进行自适应搜索。
70年代中期,Holland提出遗传算法的模式定理(Schema Theorem),奠定了遗传算法的理论基础。
11967年,Holland教授的学生De Jong首次将遗传算法应用于函数优化中,2设计了遗传算法执行策略和性能评价指标。
他挑选的5个专门用于遗传算法数值实验的函数至今仍被频繁使用,而他提出的在线(on-line)和离线(off-line)指标则仍是目前衡量遗传算法优化性能的主要手段。
1989年,Goldberg出版专著“Genetic Algorithm in Search, Optimization, and Machine learning”3。
该书全面阐述了遗传算法的基本原理及应用,并系统总结了遗传算法的主要研究成果。
该书对遗传算法科学基础的奠定做出了重要贡献。
1991年,Davis编辑出版了专著“Handbook of Genetic Algorithms”,该书中介绍了遗传算法在工程技术和社会生活中的大量应用实例。
41992年,美国斯坦福大学的Koza出版专著“Genetic Programming, on the Programming of Computers by Means of Natural Selection”,在此书中,他将遗传算法应用于计算机程序的优化设计和自动生成,并在此基础上提出遗传编程(Genetic Programming, GP)的概念5。
遗传算法(GA)解决TSP问题 遗传算法解决TSP问题遗传算法遗传算法的基本原理是通过作⽤于染⾊体上的基因寻找好的染⾊体来求解问题,它需要对算法所产⽣的每个染⾊体进⾏评价,并基于适应度值来选择染⾊体,使适应性好的染⾊体有更多的繁殖机会,在遗传算法中,通过随机⽅式产⽣若⼲个所求解问题的数字编码,即染⾊体,形成初始种群;通过适应度函数给每个个体⼀个数值评价,淘汰低适应度的个体,选择⾼适应度的个体参加遗传操作,经过遗产操作后的个体集合形成下⼀代新的种群,对这个新的种群进⾏下⼀轮的进化。
TSP问题TSP问题即旅⾏商问题,经典的TSP可以描述为:⼀个商品推销员要去若⼲个城市推销商品,该推销员从⼀个城市出发,需要经过所有城市后,回到出发地。
应如何选择⾏进路线,以使总的⾏程最短。
从图论的⾓度来看,该问题实质是在⼀个带权完全⽆向图中,找⼀个权值最⼩的哈密尔顿回路。
遗传算法解决TSP问题概念介绍:种群 ==> 可⾏解集个体 ==> 可⾏解染⾊体 ==> 可⾏解的编码基因 ==> 可⾏解编码的分量基因形式 ==> 遗传编码适应度 ==> 评价的函数值(适应度函数)选择 ==> 选择操作交叉 ==> 编码的交叉操作变异 ==> 可⾏解编码的变异遗传操作:就包括优选适应性强的个体的“选择”;个体间交换基因产⽣新个体的“交叉”;个体间的基因突变⽽产⽣新个体的“变异”。
其中遗传算法是运⽤遗传算⼦来进⾏遗传操作的。
即:选择算⼦、变异算⼦、交叉算⼦。
遗传算法的基本运算过程(1)种群初始化:个体编码⽅法有⼆进制编码和实数编码,在解决TSP问题过程中个体编码⽅法为实数编码。
对于TSP问题,实数编码为1-n的实数的随机排列,初始化的参数有种群个数M、染⾊体基因个数N(即城市的个数)、迭代次数C、交叉概率Pc、变异概率Pmutation。
(2)适应度函数:在TSP问题中,对于任意两个城市之间的距离D(i,j)已知,每个染⾊体(即n个城市的随机排列)可计算出总距离,因此可将⼀个随机全排列的总距离的倒数作为适应度函数,即距离越短,适应度函数越好,满⾜TSP要求。
第二章 遗传算法的基本原理2.1 遗传算法的基本描述2.1.1 全局优化问题全局优化问题的定义:给定非空集合S 作为搜索空间,f :S —>R 为目标函数,全局优化问题作为任务)(max x f Sx ∈给出,即在搜索空间中找到至少一个使目标函数最大化的点。
全局最大值(点)的定义:函数值+∞<=)(**x f f 称为一个全局最大值,当且仅当x ∀S x ∈,(ρi i b a <,i 12)定义适应度函数f(X);3)确定遗传策略,包括群体规模,选择、交叉、变异算子及其概率。
4)生成初始种群P ;5)计算群体中各个体的适应度值;6)按照遗传策略,将遗传算子作用于种群,产生下一代种群;7)迭代终止判定。
遗传算法涉及六大要素:参数编码,初始群体的设定,适应度函数的设计,遗传操作的设计,控制参数的设定,迭代终止条件。
2.1.3 遗传编码由于GA 计算过程的鲁棒性,它对编码的要求并不苛刻。
原则上任何形式的编码都可以,只要存在合适的对其进行操作的遗传算子,使得它满足模式定理和积木块假设。
由于编码形式决定了交叉算子的操作方式,编码问题往往称作编码-交叉问题。
对于给定的优化问题,由GA 个体的表现型集合做组成的空间称为问题(参数)空间,由GA 基因型个体所组成的空间称为GA 编码空间。
遗传算子在GA 编码空间中对位串个体进行操作。
定义:由问题空间向GA 编码空间的映射称为编码,而有编码空间向问题空间的映射成为译码。
1)2)3)它们对1)2)k =1,2,…,K; l =1,2,…,L; K=2L其中,个体的向量表示为),,,(21kL k k k a a a a =,其字符串形式为kL k k k a a a s 21=,s k 称为个体a k 对应的位串。
表示精度为)12/()(--=∆L u v x 。
将个体又位串空间转换到问题空间的译码函数],[}1,0{:v u L →Γ的公式定义为:对于n 维连续函数),,2,1](,[),,,,(),(21n i v u x x x x x x f i i i n =∈=,各维变量的二进制编码位串的长度为l i ,那么x 的编码从左到右依次构成总长度为∑==ni i l L 1的二进制编码位串。
遗传算法中交叉算子和变异算子的作用全文共四篇示例,供读者参考第一篇示例:遗传算法(Genetic Algorithm,简称GA)是一种基于生物进化原理的优化算法,其主要思想是模拟生物进化的过程,通过模拟遗传、突变和自然选择等操作来寻找问题的最优解。
在遗传算法中,交叉算子和变异算子是两个重要的操作,它们分别负责遗传信息的交换与改变,对算法的性能和收敛速度有着重要的影响。
交叉算子是遗传算法中处理遗传信息的重要操作之一。
它模拟了生物界中的杂交现象,通过交叉操作可以将两个个体的染色体信息重新组合,产生新的个体。
这种重新组合的过程可以带来某种程度上的多样性,从而有利于保持种群的多样性,防止算法过早陷入局部最优解。
交叉算子通常包括单点交叉、多点交叉、均匀交叉等不同的方法,其中单点交叉是最常用的一种。
以一个简单的二进制编码的遗传算法为例,假设染色体长度为5,两个个体分别为10011和01100,进行单点交叉,则可得到如下的交叉结果:父代1:1 0 0 1 1父代2:0 1 1 0 0交叉点:↑交叉后:1 0 0 0 0交叉后:0 1 1 1 1通过交叉算子的作用,可以看到新个体的染色体信息是两个父代的信息进行重新组合得到的,从而带来了新的遗传信息。
这种信息的重新组合可以增加种群的多样性,有助于增加算法的全局搜索能力,使得算法更有可能找到最优解。
相对于交叉算子,变异算子是一种更为局部的操作。
变异算子的作用是在种群中对个体的染色体信息进行随机的变动,以增加种群的多样性。
变异操作可以在一定程度上破坏个体的优势结构,引入新的遗传信息,从而有助于避免陷入局部最优解。
变异算子通常包括比特翻转、基因插入、基因删除等不同的方法。
以前文的例子为例,如果对新个体进行一次比特翻转的变异操作,则可能得到如下的结果:变异前:1 0 0 0 0变异后:1 0 0 1 0通过变异操作,原本的个体信息得到了一定的改变,引入了新的遗传信息。
这种变化有助于增加种群的多样性,使得算法更有可能跳出局部最优解,向全局最优解前进。
种群表示和初始化函数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或susGGAP指出了代沟,默认为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, xovsprsrecdis: 离散重组NewChrom=recdis(OldChorm)recint: 中间重组NewChrom=recint(OldChorm)reclin: 线性重组NewChrom=reclin(OldChorm)xovdp: 两点交叉NewChrom=xovdp(OldChrom, XOVR)XOVR为交叉概率,默认为0.7Xovdprs: 减少代理的两点交叉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, recmutmut: 离散变异算子NewChrom=mut(OldChorm, Pm)NewChrom=mut(OldChorm, Pm, BaseV)Pm为变异概率,默认为Pm=0.7/Lindmutbga: 实值种群的变异(遗传算法育种器的变异算子)NewChrom=mutbga(OldChorm, FieldDR)NewChrom=mubga(OldChorm, FieidDR, MutOpt)MutOpt(1)是在[ 0 1]间的重组概率的标量,默认为1MutOpt(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为基于适应度的选择,默认为0InsOpt(2)指明在[0 1]间每个子种群中重插入的子代个体在整个子种群的中个体的比率,默认为1 ObjVch包含Chorm中个体的目标值,对基于适应度的重插入是必需的ObjVSel包含Selch中个体的目标值,如子代数量大于重插入种群的子代数量是必需的其他函数矩阵复试函数rep: MatOut=rep(MatIn, REPN) REPN为复制次数。
% MUT.m
%
% This function takes the representation of the current population,
% mutates each element with given probability and returns the resulting
% population.
%这个函数代表当前种群,其中的每一个元素在变异概率下发生变化,并返回新的种群。
% Syntax: NewChrom = mut(OldChrom,Pm,BaseV)
%语法:新种群=mut(当前种群,变异概率,染色体个体元素的变异的基本字符)
%注意:变异概率省略时为0.7/Lind(Lind为染色体长度),BaseV省略时种群为二进制编码% Input parameters:
%输入参数:
%
% OldChrom - A matrix containing the chromosomes of the
% current population. Each row corresponds to
% an individuals string representation.
%当前种群-一个矩阵包含当前人口的染色体。
每一行对应一个字符串表示。
%
% Pm - Mutation probability (scalar). Default value
% of Pm = 0.7/Lind, where Lind is the chromosome
% length is assumed if omitted.
%变异概率-变异概率(标量)。
假定如果省略时,其默认值为0.7/Lind(Lind是染色体长度)%
% BaseV - Optional row vector of the same length as the
% chromosome structure defining the base of the
% individual elements of the chromosome. Binary
% representation is assumed if omitted.
%染色体个体元素的变异的基本字符-染色体的单个元素的字符由染色体结构(相同长度的行%向量)定义的,假定如果省略时,默认为是二进制的。
%
% Output parameter:
%输出参数:
% NewChrom - A Matrix containing a mutated version of
% OldChrom.
%新种群-当前种群变异后的矩阵。
% Author: Andrew Chipperfield
% Date: 25-Jan-94
%
% Tested under MATLAB v6 by Alex Shenfield (21-Jan-03)
%举例说明该函数,利用OldChrom=crtbp(5,5)得到OldChrom=
1 1 0 0 1
0 0 0 0 0
0 1 0 1 1
0 1 0 0 0
0 0 1 1 0
function NewChrom = mut(OldChrom,Pm,BaseV)
%新种群=mut(当前种群,变异概率,染色体个体元素的变异的基本字符).
% get population size (Nind) and chromosome length (Lind)
%得到个体数(Nind)和染色体长度(Lind)。
[Nind, Lind] = size(OldChrom) ; %返回值为Nind=5,Lind=5
% check input parameters
%检查输入参数
if nargin < 2, Pm = 0.7/Lind ; end
if isnan(Pm), Pm = 0.7/Lind; end
%上面2个if条件用来确定Pm的值。
%第一个if:如果输入参数个数小于2,返回Pm为0.7/Lind。
%第二个if:如果输入的Pm不是数,返回Pm为0.7/Lind。
%注:nargin是用来判断输入变量个数的函数。
Isnan的函数功能:判断函数组的元素是否是%NaN(Not a Number)。
例如输入isnan(NaN),返回值为1;输入isnan(3),返回值为0.
if (nargin < 3), BaseV = crtbase(Lind); end
if (isnan(BaseV)), BaseV = crtbase(Lind); end
if (isempty(BaseV)), BaseV = crtbase(Lind); end
%上面的3个if条件用来确定BaseV的值。
%第一个if:如果输入参数个数小于3,则执行BaseV= crtbase(Lind)的命令,并返回BaseV %的值。
%第二个if:如果输入的BaseV不是数(如:NaN),则也执行BaseV = crtbase(Lind)的命令,%并返回BaseV的值。
%第三个if:如果输入的BaseV为空(如:[]),则也执行BaseV = crtbase(Lind)的命令,并返%回BaseV的值。
%注:isempty的函数功能:判断一个数组是否为空。
如果为空,返回值为1;如果非空,返%回值为0.例如输入isempty([]),返回值为1,;输入isempty(1),返回值为0。
if (nargin == 3) & (Lind ~= length(BaseV))
error('OldChrom and BaseV are incompatible'), end
%如果输入参数个数为3,而且矩阵列数不等于BaseV的长度,则会出现‘当前种群和基本%字符不匹配’的错误
% create mutation mask matrix
%创建突变掩模矩阵
BaseM = BaseV(ones(Nind,1),:) ;
%ones(5,1)=
1
1
1
1
1
%由BaseM = BaseV(ones(Nind,1),:) 得到BaseM=
BaseM=
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
% perform mutation on chromosome structure
%在染色体结构上执行突变
NewChrom = rem(OldChrom+(rand(Nind,Lind)<Pm).*ceil(rand(Nind,Lind).*(BaseM-1)),BaseM);
%分布计算上式如下rand(5,5)=
0.9631 0.6241 0.0377 0.2619 0.1068
0.5468 0.6791 0.8852 0.3354 0.6538
0.5211 0.3955 0.9133 0.6797 0.4942
0.2316 0.3674 0.7962 0.1366 0.7791
0.4889 0.9880 0.0987 0.7212 0.7150
%注:rand(m,n)是返回一个m行n列的随机矩阵,其中每个元素都小于1且大于0。
% rand(Nind,Lind)<Pm=
0 0 1 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
0 0 1 0 0
% ceil(rand(Nind,Lind)=
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
%注:ceil函数功能是把矩阵中所有元素取整,且不小于原来元素的最小整数。
%BaseM-1=
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
%由上可知rand(Nind,Lind)<Pm).*ceil(rand(Nind,Lind).*(BaseM-1)=
0 0 1 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
0 0 1 0 0
%故有
NewChrom = rem(OldChrom+(rand(Nind,Lind)<Pm).*ceil(rand(Nind,Lind).*(BaseM-1)),BaseM)=
1 1 1 0 0
0 0 0 0 0
0 1 0 1 1
0 1 0 1 0
0 0 0 1 0
%注:rem在上面运算中的函数功能是:2个相同结构的矩阵取模,即其中每一个元素对应取模。