📄 mutbga.m
字号:
% MUTBGA.M (real-value MUTation like Breeder Genetic Algorithm)%% This function takes a matrix OldChrom containing the real% representation of the individuals in the current population,% mutates the individuals with probability MutR and returns% the resulting population.%% This function implements the mutation operator of the Breeder Genetic% Algorithm. (Muehlenbein et. al.)%% Syntax: NewChrom = mutbga(OldChrom, FieldDR, MutOpt)%% Input parameter:% OldChrom - Matrix containing the chromosomes of the old% population. Each line corresponds to one individual.% FieldDR - Matrix describing the boundaries of each variable.% MutOpt - (optional) Vector containing mutation rate and shrink value% MutOpt(1): MutR - number containing the mutation rate -% probability for mutation of a variable% if omitted or NaN, MutR = 1/variables per individual% is assumed% MutOpt(2): MutShrink - (optional) number for shrinking the% mutation range in the range [0 1], possibility to% shrink the range of the mutation depending on,% for instance actual generation.% if omitted or NaN, MutShrink = 1 is assumed%% Output parameter:% NewChrom - Matrix containing the chromosomes of the population% after mutation in the same format as OldChrom.% Author: Hartmut Pohlheim% History: 23.11.93 file created% 24.11.93 function optimised (for,for-loop to for-loop)% mutation rate included% style improved% 06.12.93 change of function name% check of boundaries after mutation out of loop% 16.12.93 NewMutMat and OldMutMat included for compability% 16.02.94 preparation for multi-subpopulations at once% 25.02.94 NewMutMat and OldMutMat removed (now in mutran10.m)% clean up% change of function name in mutbga.m% 03.03.94 Lower and Upper directly used (less memory)% 19.03.94 multipopulation support removed% more parameter checks% 27.03.94 Delta exact calculated, for loop savedfunction NewChrom = mutbga(OldChrom, FieldDR, MutOpt);% Check parameter consistency if nargin < 2, error('Not enough input parameter'); end % Identify the population size (Nind) and the number of variables (Nvar) [Nind,Nvar] = size(OldChrom); [mF, nF] = size(FieldDR); if mF ~= 2, error('FieldDR must be a matrix with 2 rows'); end if Nvar ~= nF, error('FieldDR and OldChrom disagree'); end if nargin < 3, MutR = 1/Nvar; MutShrink = 1; elseif isempty(MutOpt), MutR = 1/Nvar; MutShrink = 1; elseif isnan(MutOpt), MutR = 1/Nvar; MutShrink = 1; else if length(MutOpt) == 1, MutR = MutOpt; MutShrink = 1; elseif length(MutOpt) == 2, MutR = MutOpt(1); MutShrink = MutOpt(2); else, error(' Too many parameter in MutOpt'); end end if isempty(MutR), MutR = 1/Nvar; elseif isnan(MutR), MutR = 1/Nvar; elseif length(MutR) ~= 1, error('Parameter for mutation rate must be a scalar'); elseif (MutR < 0 | MutR > 1), error('Parameter for mutation rate must be a scalar in [0, 1]'); end if isempty(MutShrink), MutShrink = 1; elseif isnan(MutShrink), MutShrink = 1; elseif length(MutShrink) ~= 1, error('Parameter for shrinking mutation range must be a scalar'); elseif (MutShrink < 0 | MutShrink > 1), error('Parameter for shrinking mutation range must be a scalar in [0, 1]'); end % the variables are mutated with probability MutR% NewChrom = OldChrom (+ or -) * Range * MutShrink * Delta% Range = 0.5 * (upperbound - lowerbound)% Delta = Sum(Alpha_i * 2^-i) from 0 to ACCUR; Alpha_i = rand(ACCUR,1) < 1/ACCUR% Matrix with range values for every variable Range = rep(0.5 * MutShrink *(FieldDR(2,:)-FieldDR(1,:)),[Nind 1]);% zeros and ones for mutate or not this variable, together with Range Range = Range .* (rand(Nind,Nvar) < MutR);% compute, if + or - sign Range = Range .* (1 - 2 * (rand(Nind,Nvar) < 0.5));% used for later computing, here only ones computed ACCUR = 20; Vect = 2 .^ (-(0:(ACCUR-1))'); Delta = (rand(Nind,ACCUR) < 1/ACCUR) * Vect; Delta = rep(Delta, [1 Nvar]);% perform mutation NewChrom = OldChrom + Range .* Delta;% Ensure variables boundaries, compare with lower and upper boundaries NewChrom = max(rep(FieldDR(1,:),[Nind 1]), NewChrom); NewChrom = min(rep(FieldDR(2,:),[Nind 1]), NewChrom);% End of function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -