gusucode.com > 十大算法matlab程序说明 > 十大算法matlab程序说明/遗传退火法/isItTimeToStop.m
function reasonToStop = isItTimeToStop(options,state) % Check to see if any of the stopping criteria have been met. % isItTimeToStop(options,state); is a string containing the reason the ga % should be stopped. The empty string means that it is not time to stop. % Copyright 2003-2005 The MathWorks, Inc. % $Revision: 1.6.4.4 $ $Date: 2005/06/21 19:21:42 $ funChange = Inf; Gen = state.Generation; GenomeLength = size(state.Population,2); PopSize = size(state.Population,1); if any(strcmpi(options.Display, {'iter','diagnose'})) FunEval = Gen*length(state.Score); BestFval = state.Best(Gen); MeanFval = meanf(state.Score); StallGen = Gen - state.LastImprovement; fprintf('%5.0f %5.0f %12.4g %12.4g %5.0f\n', ... Gen, FunEval, BestFval, MeanFval, StallGen); end % Window used to get best fval Window = options.StallGenLimit; Weight = 0.5; % Compute change in fval and individuals in last 'Window' generations if Gen > Window Bestfvals = state.Best((Gen-Window):end); funChange = 0; for i = 1:Window-1 funChange = funChange + Weight^(Window-i)*(abs(Bestfvals(i+1) - Bestfvals(i))/(abs(Bestfvals(i))+1)); end % Take an average of function value change funChange = funChange/Window; end reasonToStop = []; if(state.Generation >= options.Generations) reasonToStop = sprintf(['Optimization terminated: ','maximum number of generations exceeded.']); elseif((cputime-state.StartTime) > options.TimeLimit) reasonToStop = sprintf(['Optimization terminated: ','time limit exceeded.']); elseif((cputime-state.LastImprovementTime) > options.StallTimeLimit) reasonToStop = sprintf(['Optimization terminated: ','stall time limit exceeded.']); elseif((state.Generation - state.LastImprovement) > options.StallGenLimit) reasonToStop = sprintf(['Optimization terminated: ','stall generations limit exceeded.']); elseif(min(min(state.Score)) <= options.FitnessLimit ) reasonToStop = sprintf(['Optimization terminated: ','minimum fitness limit reached.']); elseif(~isempty(state.StopFlag)) reasonToStop = sprintf(['Optimization terminated: ',state.StopFlag]); elseif funChange <= options.TolFun reasonToStop = sprintf(['Optimization terminated: average change in the fitness value less than options.TolFun.']); end % If it is a constrained problem and we want to check linear % constraints (when GA is terminating) if ~isempty(reasonToStop) && isfield(options,'LinearConstr') linCon = options.LinearConstr; if linCon.linconCheck && ~feasibleLinearConstraints reasonToStop = [reasonToStop,... sprintf('\n%s','Linear constraints are not satisfied within constraint tolerance.')]; end end if ~isempty(reasonToStop) && any(strcmpi(options.Display, {'iter','diagnose','final'})) fprintf('%s\n',reasonToStop); return; end % Print header again if any(strcmpi(options.Display, {'iter','diagnose'})) && rem(Gen,30)==0 && Gen > 0 fprintf('\n Best Mean Stall\n'); fprintf('Generation f-count f(x) f(x) Generations\n'); end %------------------------------------------------ function feasible = feasibleLinearConstraints % Function to check if linear constraints are satisfied at final point % If it is a constrained problem and we want to check linear constraints A = linCon.A; L = linCon.L; U = linCon.U; IndEqcstr = linCon.IndEqcstr; tol = sqrt(options.TolCon); [FVAL,best] = min(state.Score); X = state.Population(best,:); feasible = isfeasible(X',A,L,U,tol,IndEqcstr); end % End of feasibleLinearConstraints %------------------------------------------------ function m = meanf(x) nans = isnan(x); x(nans) = 0; n = sum(~nans); n(n==0) = NaN; % prevent divideByZero warnings % Sum up non-NaNs, and divide by the number of non-NaNs. m = sum(x) ./ n; end end