2010-12-01 2 views
1

J'essaie de trouver une bonne solution avec une stratégie d'évolution pour un problème de minimisation 30 dimensions. Maintenant, j'ai développé avec succès un ES simple (1,1) et aussi un ES auto-adaptatif (1, lambda) avec une taille de pas.Stratégie d'évolution avec échelons individuels

L'étape suivante consiste à créer un ES (1, lambda) avec des échelons individuels par dimension. Le problème est que mon code MATLAB ne fonctionne pas encore. Je teste sur la fonction objectif sphère:

function f = sphere(x) 
    f = sum(x.^2); 
end 

Le tracé des résultats des ES avec un pas de progression par rapport à celui avec stepsizes individuels:

results

La ligne bleue est la performance de l'ES avec des tailles de pas individuels et le rouge est pour l'ES avec une taille de pas.

Le code pour la (1, lambda) ES avec plusieurs stepsizes:

% Strategy parameters 
tau = 1/sqrt(2 * sqrt(N)); 
tau_prime = 1/sqrt(2 * N); 
lambda = 10; 

% Initialize 
xp = (ub - lb) .* rand(N, 1) + lb; 
sigmap = (ub - lb)/(3 * sqrt(N)); 
fp = feval(fitnessfct, xp'); 
evalcount = 1; 

% Evolution cycle 
while evalcount <= stopeval 

    % Generate offsprings and evaluate 
    for i = 1 : lambda 
     rand_scalar = randn(); 

     for j = 1 : N 
      Osigma(j,i) = sigmap(j) .* exp(tau_prime * rand_scalar + tau * randn()); 
     end 

     O(:,i) = xp + Osigma(:,i) .* rand(N,1); 
     fo(i) = feval(fitnessfct, O(:,i)'); 
    end 

    evalcount = evalcount + lambda; 

    % Select best 
    [~, sortindex] = sort(fo); 
    xp = O(:,sortindex(1)); 
    fp = fo(sortindex(1)); 
    sigmap = Osigma(:,sortindex(1)); 
end 

-ce que quelqu'un voit le problème?

Répondre

0

Vos mutations ont un biais: elles ne peuvent que toujours augmenter les paramètres, jamais les diminuer. sigmap est un vecteur de bornes inférieures (inférieures) minuscules (graduées): toutes positives. exp (...) est toujours positif. Les éléments d'Osigma sont donc toujours positifs. Ensuite, votre changement est Osigma. * Rand (N, 1), et rand (N, 1) est également toujours positif. Avez-vous voulu dire utiliser randn (N, 1) au lieu de rand (N, 1)? Avec ce changement de caractère, je trouve que votre code optimise plutôt que pessimiser :-).