// PESA2Selection.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.operators.selection;
import jmetal.core.Solution;
import jmetal.util.Configuration;
import jmetal.util.JMException;
import jmetal.util.PseudoRandom;
import jmetal.util.archive.AdaptiveGridArchive;
import java.util.HashMap;
/**
* This class implements a selection operator as the used in PESA-II
* algorithm
*/
public class PESA2Selection extends Selection {
public PESA2Selection(HashMap<String, Object> parameters) {
super(parameters) ;
}
/**
* Performs the operation
* @param object Object representing a SolutionSet. This solution set
* must be an instancen <code>AdaptiveGridArchive</code>
* @return the selected solution
* @throws JMException
*/
public Object execute(Object object) throws JMException {
try {
AdaptiveGridArchive archive = (AdaptiveGridArchive)object;
int selected;
int hypercube1 = archive.getGrid().randomOccupiedHypercube();
int hypercube2 = archive.getGrid().randomOccupiedHypercube();
if (hypercube1 != hypercube2){
if (archive.getGrid().getLocationDensity(hypercube1) <
archive.getGrid().getLocationDensity(hypercube2)) {
selected = hypercube1;
} else if (archive.getGrid().getLocationDensity(hypercube2) <
archive.getGrid().getLocationDensity(hypercube1)) {
selected = hypercube2;
} else {
if (PseudoRandom.randDouble() < 0.5) {
selected = hypercube2;
} else {
selected = hypercube1;
}
}
} else {
selected = hypercube1;
}
int base = PseudoRandom.randInt(0,archive.size()-1);
int cnt = 0;
while (cnt < archive.size()){
Solution individual = archive.get((base + cnt)% archive.size());
if (archive.getGrid().location(individual) != selected){
cnt++;
} else {
return individual;
}
}
return archive.get((base + cnt) % archive.size());
} catch (ClassCastException e) {
Configuration.logger_.severe("PESA2Selection.execute: ClassCastException. " +
"Found" + object.getClass() + "Expected: AdaptativeGridArchive") ;
Class cls = java.lang.String.class;
String name = cls.getName();
throw new JMException("Exception in " + name + ".execute()") ;
}
} //execute
} // PESA2Selection