// ssGAS.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.geneticAlgorithm;
import jmetal.core.*;
import jmetal.operators.selection.WorstSolutionSelection;
import jmetal.util.JMException;
import jmetal.util.comparators.ObjectiveComparator;
import java.util.Comparator;
import java.util.HashMap;
/**
* Class implementing a steady-state genetic algorithm
*/
public class ssGA extends Algorithm {
/**
*
* Constructor
* Create a new SSGA instance.
* @param problem Problem to solve
*
*/
public ssGA(Problem problem){
super(problem) ;
} // SSGA
/**
* Execute the SSGA algorithm
* @throws JMException
*/
public SolutionSet execute() throws JMException, ClassNotFoundException {
int populationSize ;
int maxEvaluations ;
int evaluations ;
SolutionSet population ;
Operator mutationOperator ;
Operator crossoverOperator ;
Operator selectionOperator ;
Comparator comparator ;
comparator = new ObjectiveComparator(0) ; // Single objective comparator
Operator findWorstSolution ;
HashMap parameters ; // Operator parameters
parameters = new HashMap() ;
parameters.put("comparator", comparator) ;
findWorstSolution = new WorstSolutionSelection(parameters) ;
// Read the parameters
populationSize = ((Integer)this.getInputParameter("populationSize")).intValue();
maxEvaluations = ((Integer)this.getInputParameter("maxEvaluations")).intValue();
// Initialize the variables
population = new SolutionSet(populationSize);
evaluations = 0;
// Read the operators
mutationOperator = this.operators_.get("mutation");
crossoverOperator = this.operators_.get("crossover");
selectionOperator = this.operators_.get("selection");
// Create the initial population
Solution newIndividual;
for (int i = 0; i < populationSize; i++) {
newIndividual = new Solution(problem_);
problem_.evaluate(newIndividual);
evaluations++;
population.add(newIndividual);
} //for
// main loop
while (evaluations < maxEvaluations) {
Solution [] parents = new Solution[2];
// Selection
parents[0] = (Solution)selectionOperator.execute(population);
parents[1] = (Solution)selectionOperator.execute(population);
// Crossover
Solution [] offspring = (Solution []) crossoverOperator.execute(parents);
// Mutation
mutationOperator.execute(offspring[0]);
// Evaluation of the new individual
problem_.evaluate(offspring[0]);
evaluations ++;
// Replacement: replace the last individual is the new one is better
int worstIndividual = (Integer)findWorstSolution.execute(population) ;
if (comparator.compare(population.get(worstIndividual), offspring[0]) > 0) {
population.remove(worstIndividual) ;
population.add(offspring[0]);
} // if
} // while
// Return a population with the best individual
SolutionSet resultPopulation = new SolutionSet(1) ;
resultPopulation.add(population.best(comparator));
System.out.println("Evaluations: " + evaluations ) ;
return resultPopulation ;
} // execute
} // ssGA