// NonElitistES.java
//
// Author:
// Antonio J. Nebro <antonio@lcc.uma.es>
// Juan J. Durillo <durillo@lcc.uma.es>
//
// Copyright (c) 2011 Antonio J. Nebro, Juan J. Durillo
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package jmetal.metaheuristics.singleObjective.evolutionStrategy;
import jmetal.core.*;
import jmetal.util.JMException;
import jmetal.util.comparators.ObjectiveComparator;
import java.util.Comparator;
/**
* Class implementing a (mu,lambda) ES. Lambda must be divisible by mu.
*/
public class NonElitistES extends Algorithm {
private int mu_ ;
private int lambda_ ;
/**
* Constructor
* Create a new NonElitistES instance.
* @param problem Problem to solve.
* @mu Mu
* @lambda Lambda
*/
public NonElitistES(Problem problem, int mu, int lambda){
super(problem) ;
mu_ = mu ;
lambda_ = lambda ;
} // NonElitistES
/**
* Execute the NonElitistES algorithm
* @throws JMException
*/
public SolutionSet execute() throws JMException, ClassNotFoundException {
int maxEvaluations ;
int evaluations ;
Solution bestIndividual ;
SolutionSet population ;
SolutionSet offspringPopulation ;
Operator mutationOperator ;
Comparator comparator ;
comparator = new ObjectiveComparator(0) ; // Single objective comparator
// Read the params
maxEvaluations = ((Integer)this.getInputParameter("maxEvaluations")).intValue();
// Initialize the variables
population = new SolutionSet(mu_ + 1) ;
offspringPopulation = new SolutionSet(lambda_) ;
evaluations = 0;
// Read the operators
mutationOperator = this.operators_.get("mutation");
System.out.println("(" + mu_ + " , " + lambda_+")ES") ;
// Create the parent population of mu solutions
Solution newIndividual;
newIndividual = new Solution(problem_) ;
problem_.evaluate(newIndividual);
evaluations ++ ;
population.add(newIndividual);
bestIndividual = new Solution(newIndividual) ;
for (int i = 1; i < mu_; i++) {
System.out.println(i) ;
newIndividual = new Solution(problem_);
problem_.evaluate(newIndividual);
evaluations++;
population.add(newIndividual);
if (comparator.compare(bestIndividual, newIndividual) > 0 )
bestIndividual = new Solution(newIndividual) ;
} //for
// Main loop
int offsprings ;
offsprings = lambda_ / mu_ ;
while (evaluations < maxEvaluations) {
// STEP 1. Generate the lambda population
for (int i = 0; i < mu_; i++) {
for (int j = 0; j < offsprings; j++) {
Solution offspring = new Solution(population.get(i)) ;
mutationOperator.execute(offspring);
problem_.evaluate(offspring) ;
offspringPopulation.add(offspring) ;
evaluations ++ ;
} // for
} // for
// STEP 2. Sort the lambda population
offspringPopulation.sort(comparator) ;
// STEP 3. Update the best individual
if (comparator.compare(bestIndividual, offspringPopulation.get(0)) > 0 )
bestIndividual = new Solution(offspringPopulation.get(0)) ;
// STEP 4. Create the new mu population
population.clear() ;
for (int i = 0; i < mu_; i++)
population.add(offspringPopulation.get(i)) ;
System.out.println("Evaluation: " + evaluations +
" Current best fitness: " + population.get(0).getObjective(0) +
" Global best fitness: " + bestIndividual.getObjective(0)) ;
// STEP 5. Delete the lambda population
offspringPopulation.clear() ;
} // while
// Return a population with the best individual
SolutionSet resultPopulation = new SolutionSet(1) ;
resultPopulation.add(population.get(0)) ;
return resultPopulation ;
} // execute
} // NonElitisES