www.pudn.com > GA_Toolbar.rar > NONUNIFM.M, change:1997-04-07,size:1309b


function [parent] = nonUnifMutate(parent,bounds,Ops) 
 
% Non uniform mutation changes one of the parameters of the parent 
% based on a non-uniform probability distribution.  This Gaussian 
% distribution starts wide, and narrows to a point distribution as the 
% current generation approaches the maximum generation. 
% function [newSol] = multiNonUnifMutate(parent,bounds,Ops) 
% parent  - the first parent ( [solution string function value] ) 
% bounds  - the bounds matrix for the solution space 
% Ops     - Options for nonUnifMutate[gen #NonUnifMutations maxGen b] 
 
cg=Ops(1); 				% Current Generation 
mg=Ops(3);                              % Maximum Number of Generations 
b=Ops(4);                               % Shape parameter 
df = bounds(:,2) - bounds(:,1); 	% Range of the variables 
numVar = size(parent,2)-1; 		% Get the number of variables 
% Pick a variable to mutate randomly from 1 to number of vars 
mPoint = round(rand * (numVar-1)) + 1; 
md = round(rand); 			% Choose a direction of mutation 
if md 					% Mutate towards upper bound 
  newValue=parent(mPoint)+delta(cg,mg,bounds(mPoint,2)-parent(mPoint),b); 
else 					% Mutate towards lower bound 
  newValue=parent(mPoint)-delta(cg,mg,parent(mPoint)-bounds(mPoint,1),b); 
end 
parent(mPoint) = newValue; 		% Make the child 
end