gusucode.com > 十大算法matlab程序说明 > 十大算法matlab程序说明/遗传退火法/PopAnneal3.m
function [Population,Score] = PopAnneal(options,GenomeLength,FitnessFcn, ... state,thisScore,thisPopulation) R=10;L=GenomeLength*100; %T0=1000;alpha=0.8; %t = T0 * alpha^(state.Generation); nParents = size(thisPopulation,1); nAnneal = ceil(nParents / R /2); [Score,k] = sort(thisScore); Population = thisPopulation(k,:); t = min(1/sqrt(eps),(Score(nAnneal*R)-Score(1))/log(2));%ta = 0.85; t = max(sqrt(eps),t); if isfield(options,'LinearConstr') % Extract information about constraints linCon = options.LinearConstr; type = linCon.type; % Sub-problem type is constrained? if ~strcmpi(type,'unconstrained') A = linCon.A; LB = linCon.L; UB = linCon.U; Lbnd = LB((end-GenomeLength)+1:end); Ubnd = UB((end-GenomeLength)+1:end); else % Or unconstrained sub-problem Lbnd = -(1e+20)*ones(GenomeLength,1); Ubnd = (1e+20)*ones(GenomeLength,1); end else % Unconstrained 'main' problems; type = 'unconstrained'; Lbnd = -(1e+20)*ones(GenomeLength,1); Ubnd = (1e+20)*ones(GenomeLength,1); end Lbnd2 = min(Population(1:nParents/2,:));%(1:nParents/2,:) Ubnd2 = max(Population(1:nParents/2,:)); k2 = state.Generation; shrink = 0.95; stepSize = max(sqrt(eps),shrink^k2); Lbnd = (Lbnd2' + stepSize*Lbnd) / (1+stepSize); Ubnd = (Ubnd2' + stepSize*Ubnd) / (1+stepSize); Bound = [Lbnd';Ubnd']; ta = 0.78; ta = max(sqrt(eps),ta^(k2^(1/2))); shrink = 0.95; stepSize = max(sqrt(eps),shrink^k2); PopAnneal = []; ScoreAnneal = []; for i = 1:nAnneal x = Population(i,:); fx = Score(i); [X2,fX2] = Anneal(x,fx,FitnessFcn,Bound,stepSize,A,LB,UB,R,L,t*ta);% PopAnneal = [PopAnneal;X2]; ScoreAnneal = [ScoreAnneal;fX2]; end x = mean(Population(1:nAnneal*R,:));% fx = feval(FitnessFcn,x); PopAnneal = [PopAnneal;x]; ScoreAnneal = [ScoreAnneal;fx]; [X2,fX2] = Anneal(x,fx,FitnessFcn,Bound,stepSize,A,LB,UB,R,L,t*ta);% PopAnneal = [PopAnneal;X2]; ScoreAnneal = [ScoreAnneal;fX2]; Population = [PopAnneal;Population]; Score = [ScoreAnneal;Score]; [Score,k] = sort(Score); Population = Population(k,:); Population = Population(1:nParents,:); Score = Score(1:nParents,:);