matlab-genetic-toolbox-1 Jan 13, 2016 · matlab 算法 · 分享到: MatLab遗传算法工具箱(Sheffield)源码解析(1) 创建种群相关函数 crtbase:创建一个包含基因基因座信息的向量。 crtbase crtbase:创建一个包含基因基因座信息的向量。 关于这个函数的释义,原文文档解释如下: 1% CRTBASE.m - Create base vector 2% 3% This function creates a vector containing the base of the loci 4% in a chromosome. 5% 6% Syntax: BaseVec = crtbase(Lind, Base) 7% 8% Input Parameters: 9% 10% Lind - A scalar or vector containing the lengths 11% of the alleles. Sum(Lind) is the length of 12% the corresponding chromosome.这句话很重要Lind的和是基因的长度。 13% 14% Base - A scalar or vector containing the base of 15% the loci contained in the Alleles. 16% 17% Output Parameters: 18% 19% BaseVec - A vector whose elements correspond to the base 20% of the loci of the associated chromosome structure. 21 22% Author: Andrew Chipperfield 23% Date: 19-Jan-94 但是看了源码之后,我发现一些疑似bug的地方,下文用将会标注出来,我自己修正了一下。这个项目是九几年的,而且matlab也出了自己的遗传算法工具箱gatool,所以这个bug权当是学习了。 1function BaseVec = crtbase(Lind, Base) 2%使用逗号区分返回值 3[ml,LenL] = size(Lind); 4if nargin <2 % 只有一个参数执行 5 %这里ones()的行列是相反的 6 Base = 2 * ones(1,LenL); 7end 8%使用逗号区分返回值 9[mb,LenB] = size(Base); 10 11% check parameter consistency 12% 使用||和&&替换|和& 13if ml >1 || mb > 1 % 限定必须都是一维行向量 14 error('Lind or Base is not a vector'); 15elseif (LenL > 1 && LenB > 1 && LenL ~= LenB) || (LenL == 1 && LenB >1) 16 error('Vector dimension must agree'); 17elseif LenB == 1 && LenL >1 18 %这里的ones()行列是相反的 19 Base = Base * ones(1,LenL); 20end 21 22BaseVec = []; 23for i = 1:LenL 24 %这里ones()的行列是相反的 25 BaseVec = [BaseVec, Base(i)*ones(1,Lind(i))]; 26end crtbp crtbp:创建任意进制的离散随机种群。这个函数可有三种格式。 [Chrom, Lind, BaseV] = crtbp(Nind, Lind)。 创建一个Nind*Lind的随机二进制矩阵。Nind与Lind都是标量,Nind表示种群中个体数量,Lind表示基因长度。 [Chrom, Lind, BaseV] = crtbp(Nind, Base)。创建一个Nind*Base长度的矩阵。Nind是标量,Base是矢量,base中的值,表示基因位的进制数。或者Nind是矢量,第一位表示个数,第二位表示基因长度Base是矢量,base中的值,表示基因位的进制数。 [Chrom, Lind, BaseV] = crtbp(Nind, Lind, Base)。创建一个Nind*Lind的随机矩阵,每一位的进制数由Base决定。 关于这个函数的释义,原文文档解释如下: 1% crtbp.m - Create an initial population 2% 3% This function creates a binary population of given size and structure. 4% 5% Syntax: [Chrom Lind BaseV] = crtbp(Nind, Lind, Base) 6% 7% Input Parameters: 8% 9% Nind - Either a scalar containing the number of individuals 10% in the new population or a row vector of length two 11% containing the number of individuals and their length. 12% 13% Lind - A scalar containing the length of the individual 14% chromosomes. 15% 16% Base - A scalar containing the base of the chromosome 17% elements or a row vector containing the base(s) 18% of the loci of the chromosomes. 19% 20% Output Parameters: 21% 22% Chrom - A matrix containing the random valued chromosomes 23% row wise. 24% 25% Lind - A scalar containing the length of the chromosome. 26% 27% BaseV - A row vector containing the base of the 28% chromosome loci. 29 30% Author: Andrew Chipperfield 31% Date: 19-Jan-94 源码解析如下: 1function [Chrom, Lind, BaseV] = cxcrtbp(Nind, Lind, Base) 2nargs = nargin; 3 4%~表示这个变量后面不会用到 5if nargs >= 1, [~, nN] = size(Nind) ; end 6if nargs >= 2, [~, nL] = size(Lind) ; end 7if nargs == 3, [~, nB] = size(Base) ; end 8 9if nN == 2 %Nind是一个向量,第一位Nind(1)表示种群数量,第二位Nind(2)表示基因长度。 10 if(nargs == 1)%仅有一个参数 11 Lind = Nind(2); 12 Nind = Nind(1); 13 BaseV = cxcrtbase(Lind); 14 elseif (nargs == 2 && nL == 1)%Nind是一个向量,两个参数的时候,第二个参数必然是基因位的进制数,并且是一个标量 15 BaseV = cxcrtbase(Nind(2),Lind); 16 Lind = Nind(2);%Nind(2)其实是基因的长度,Lind原来值是进制数 17 Nind = Nind(1); 18 elseif (nargs == 2 && nL > 1)%Nind是一个向量,两个参数的时候,第二个参数必然是基因位的进制数,是一个向量 19 %BUG 原来的代码if Lind ~= length(Lind), error('Lind and Base disagree'); end 20 %这里是想做一个判断,看看基因的长度和基向量的长度是否一致,但是长度应该是Nind(2)而不是Lind,Lind在这个分值里BaseV 21 if Nind(2) ~= length(Lind), error('Lind and Base disagree'); end 22 BaseV = Lind ; Lind = Nind(2) ; Nind = Nind(1) ; 23 end 24elseif nN == 1 %Nind是一个标量,表示种群数量 25 if (nargs == 1)%仅有一个参数 26 error('Not enough input arguments.') ; 27 elseif nargs == 2 %两个参数,需要看看第二位是标量还是向量 28 if nL == 1 %第二个参数是标量。说明是基因长度 29 BaseV = cxcrtbase(Lind); 30 else % 第二个参数是向量,表示他是基向量 31 BaseV = Lind; 32 Lind = nL;%基向量的长度表示基因的长度 33 end 34 elseif nargs == 3 % 第二位 Lind 标量,第三位基因进制信息 35 if nB == 1 36 BaseV=cxcrtbase(Lind,Base);%第三位标量,表示基因有统一的进制base 37 elseif nB ~= Lind 38 error('Lind and Base disagree') ;%第三位向量,看看长度是否匹配 39 else 40 BaseV=Base;%标准形式,第一位Nind,第二位Lind,第三位BaseV 41 end 42 end 43end 44 45% Create a structure of random chromosomes in row wise order, dimensions 46% Nind by Lind. The base of each chromosomes loci is given by the value 47% of the corresponding element of the row vector base. 48 49%BaseV(ones(Nind,1),:)表示向量扩展成矩阵,重复扩展Nind行 50%floor 向下取整 51Chrom = floor(rand(Nind,Lind).*BaseV(ones(Nind,1),:)); crtrp crtrp的功能是产生一个实数值种群,crtbp可以产生一定进制的种群,但都是离散值,crtrp是产生连续值(相对的)的种群。 crtrp的参数相对固定,必须要有两个,第一个Nind表示种群的个数,第二个参数为一个2*Lind的矩阵,分别代表着上下界,Lind为基因的长度。函数的源码介绍如下: 1% crtrp.m (CReaTe an initial (Real-value) Population) 2% 3% This function creates a population of given size of random real-values. 4% 5% Syntax: Chrom = crtrp(Nind,FieldDR); 6% 7% Input parameters: 8% Nind - A scalar containing the number of individuals in the new 9% population. 10% 11% FieldDR - A matrix of size 2 by number of variables describing the 12% boundaries of each variable. It has the following structure: 13% [lower_bound; (vector with lower bound for each veriable) 14% upper_bound] (vector with upper bound for each veriable) 15% [lower_bound_var_1 lower_bound_var_2 ... lower_bound_var_Nvar; 16% upper_bound_var_1 upper_bound_var_2 ... upper_bound_var_Nvar] 17% example - each individuals consists of 4 variables: 18% FieldDR = [-100 -50 -30 -20; % lower bound 19% 100 50 30 20] % upper bound 20% 21% Output parameter: 22% Chrom - A matrix containing the random valued individuals of the 23% new population of size Nind by number of variables. 24 25% Author: Hartmut Pohlheim 26% History: 23.11.93 file created 27% 25.02.94 clean up, check parameter consistency 源码中输入参数处理的部分比上两个函数简单很多,却有一个明显bug,很多人也提过,就是nargin赋值的问题。同时将rep函数替换成系统自带的repmat函数,提高可靠性与性能。 1function Chrom = crtrp(Nind,FieldDR) 2 3 nargs = nargin 4 5 % Check parameter consistency 6 if nargs < 2, error('parameter FieldDR missing'); end 7 %下面这句明显是个错误,nargin是个函数,不能赋值。注释掉,不需要 8 % BUG 9 %if nargs > 2, nargin = 2; end 10 11 [mN, nN] = size(Nind); 12 [mF, Nvar] = size(FieldDR); 13 14 %Nind必须是个标量,表示种群个数 15 if (mN ~= 1 & nN ~= 1), error('Nind has to be a scalar'); end 16 % FieldDR必须是个2行矩阵,第一行为下界,第二行为上界 17 if mF ~= 2, error('FieldDR must be a matrix with 2 rows'); end 18 19 % Compute Matrix with Range of variables and Matrix with Lower value 20 % 用来生成制定范围的随机数,使用matlab自带的repmat函数代替工具箱中的rep函数 21 % repmat(arg1,arg2)函数:将矩阵arg1,扩展行arg2(1)次,列arg2(2)次 22 Range = repmat((FieldDR(2,:)-FieldDR(1,:)),[Nind 1]); 23 Lower = repmat(FieldDR(1,:), [Nind 1]); 24 25 % Create initial population 26 % Each row contains one individual, the values of each variable uniformly 27 % distributed between lower and upper bound (given by FieldDR) 28 Chrom = rand(Nind,Nvar) .* Range + Lower; 29 30% End of function 至此,Sheffield工具箱中的种群随机生成函数就这么多了。