/*
* SBXCrossover.java
*
* @author Antonio J. Nebro
* @version 1.0
*
* This class returns a solution after applying SBX and Polynomial mutation
*/
package jmetal.util.offspring;
import jmetal.core.Operator;
import jmetal.core.Solution;
import jmetal.core.SolutionSet;
import jmetal.operators.crossover.CrossoverFactory;
import jmetal.operators.selection.SelectionFactory;
import jmetal.util.JMException;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SBXCrossoverOffspring extends Offspring {
private double crossoverProbability_ = 0.9;
private double distributionIndexForCrossover_ = 20;
private Operator crossover_;
private Operator selection_;
public SBXCrossoverOffspring(double crossoverProbability,
double distributionIndexForCrossover) throws JMException {
HashMap parameters ;
crossoverProbability_ = crossoverProbability;
distributionIndexForCrossover_ = distributionIndexForCrossover;
// Crossover operator
parameters = new HashMap() ;
parameters.put("probability", crossoverProbability_) ;
parameters.put("distributionIndex", distributionIndexForCrossover_) ;
crossover_ = CrossoverFactory.getCrossoverOperator("SBXCrossover", parameters);
selection_ = SelectionFactory.getSelectionOperator("BinaryTournament", null);
id_ = "SBXCrossover";
}
public Solution getOffspring(SolutionSet solutionSet) {
Solution[] parents = new Solution[2];
Solution offSpring = null;
try {
parents[0] = (Solution) selection_.execute(solutionSet);
parents[1] = (Solution) selection_.execute(solutionSet);
Solution[] children = (Solution[]) crossover_.execute(parents);
offSpring = children[0];
//mutation_.execute(offSpring);
//Create a new solution, using DE
} catch (JMException ex) {
Logger.getLogger(SBXCrossoverOffspring.class.getName()).log(Level.SEVERE, null, ex);
}
return offSpring;
} // getOffpring
/**
*
*/
public Solution getOffspring(Solution[] parentSolutions) {
Solution[] parents = new Solution[2];
Solution offSpring = null;
try {
parents[0] = parentSolutions[0] ;
parents[1] = parentSolutions[1] ;
Solution[] children = (Solution[]) crossover_.execute(parents);
offSpring = children[0];
//mutation_.execute(offSpring);
//Create a new solution, using DE
} catch (JMException ex) {
Logger.getLogger(SBXCrossoverOffspring.class.getName()).log(Level.SEVERE, null, ex);
}
return offSpring;
} // getOffpring
public Solution getOffspring(SolutionSet solutionSet, SolutionSet archive) {
Solution[] parents = new Solution[2];
Solution offSpring = null;
try {
parents[0] = (Solution) selection_.execute(solutionSet);
if (archive.size() > 0) {
parents[1] = (Solution)selection_.execute(archive);
} else {
parents[1] = (Solution)selection_.execute(solutionSet);
}
Solution[] children = (Solution[]) crossover_.execute(parents);
offSpring = children[0];
//mutation_.execute(offSpring);
//Create a new solution, using DE
} catch (JMException ex) {
Logger.getLogger(SBXCrossoverOffspring.class.getName()).log(Level.SEVERE, null, ex);
}
return offSpring;
} // getOffpring
public String configuration() {
String result = "-----\n" ;
result += "Operator: " + id_ + "\n" ;
result += "Probability: " + crossoverProbability_ + "\n" ;
result += "DistributionIndex: " + distributionIndexForCrossover_ ;
return result ;
}
} // DifferentialEvolutionOffspring