/**
* DifferentialEvolutionOffspring.java
*
* @author Antonio J. Nebro
* @version 1.0
*
* This class returns a solution after applying DE
*/
package jmetal.util.offspring;
import jmetal.core.Operator;
import jmetal.core.Solution;
import jmetal.core.SolutionSet;
import jmetal.operators.crossover.DifferentialEvolutionCrossover;
import jmetal.operators.selection.SelectionFactory;
import jmetal.util.JMException;
import jmetal.util.PseudoRandom;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DifferentialEvolutionOffspring extends Offspring {
private double CR_ ;
private double F_ ;
private Operator crossover_ ;
private Operator selection_ ;
Operator mutation_;
private DifferentialEvolutionOffspring() {
}
/**
* Constructor
* @param CR
* @param F
*/
public DifferentialEvolutionOffspring(double CR, double F) {
HashMap parameters = null ;
CR_ = CR ;
F_ = F ;
try {
// Crossover operator
parameters = new HashMap() ;
parameters.put("CR", CR_) ;
parameters.put("F", F_) ;
crossover_ = new DifferentialEvolutionCrossover(parameters) ;
// Selecion operator
parameters = null ;
selection_ = SelectionFactory.getSelectionOperator("DifferentialEvolutionSelection", parameters);
} catch (JMException ex) {
Logger.getLogger(DifferentialEvolutionOffspring.class.getName()).log(Level.SEVERE, null, ex);
}
id_ = "DE" ;
}
public Solution getOffspring(SolutionSet solutionSet, int index) {
Solution[] parents = new Solution[3] ;
Solution offSpring = null ;
try {
int r1, r2 ;
do {
r1 = PseudoRandom.randInt(0,solutionSet.size()-1);
} while( r1==index );
do {
r2 = PseudoRandom.randInt(0,solutionSet.size()-1);
} while( r2==index || r2==r1);
parents[0] = solutionSet.get(r1) ;
parents[1] = solutionSet.get(r2) ;
parents[2] = solutionSet.get(index) ;
offSpring = (Solution) crossover_.execute(new Object[]{solutionSet.get(index), parents});
} catch (JMException ex) {
Logger.getLogger(DifferentialEvolutionOffspring.class.getName()).log(Level.SEVERE, null, ex);
}
//Create a new solution, using DE
return offSpring ;
} // getOffpring
/**
*
*/
public Solution getOffspring(Solution[] parentSolutions, Solution currentSolution) {
Solution[] parents = new Solution[3] ;
Solution offspring = null ;
try {
parents[0] = parentSolutions[0] ;
parents[1] = parentSolutions[1] ;
parents[2] = currentSolution ;
offspring = (Solution) crossover_.execute(new Object[]{currentSolution, parents});
} catch (JMException ex) {
Logger.getLogger(DifferentialEvolutionOffspring.class.getName()).log(Level.SEVERE, null, ex);
}
//Create a new solution, using DE
return offspring ;
} // getOffpring
public String configuration() {
String result = "-----\n" ;
result += "Operator: " + id_ + "\n" ;
result += "CR: " + CR_ + "\n" ;
result += "F: " + F_ ;
return result ;
}
} // DifferentialEvolutionOffspring