matlab-genetic-toolbox-1

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:创建任意进制的离散随机种群。这个函数可有三种格式。

  1. [Chrom, Lind, BaseV] = crtbp(Nind, Lind)。 创建一个Nind*Lind的随机二进制矩阵。Nind与Lind都是标量,Nind表示种群中个体数量,Lind表示基因长度。
  2. [Chrom, Lind, BaseV] = crtbp(Nind, Base)。创建一个Nind*Base长度的矩阵。Nind是标量,Base是矢量,base中的值,表示基因位的进制数。或者Nind是矢量,第一位表示个数,第二位表示基因长度Base是矢量,base中的值,表示基因位的进制数。
  3. [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工具箱中的种群随机生成函数就这么多了。