// ProblemFactory.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.problems;
import jmetal.core.Problem;
import jmetal.util.Configuration;
import jmetal.util.JMException;
import java.lang.reflect.Constructor;
/**
* This class represents a factory for problems
*/
public class ProblemFactory {
/**
* Creates an object representing a problem
* @param name Name of the problem
* @param params Parameters characterizing the problem
* @return The object representing the problem
* @throws JMException
*/
public Problem getProblem(String name, Object [] params) throws JMException {
// Params are the arguments
// The number of argument must correspond with the problem constructor params
String base = "jmetal.problems.";
if (name.equals("TSP") || name.equals("OneMax"))
base += "singleObjective." ;
else if (name.equals("mQAP"))
base += "mqap." ;
else if (name.substring(0,name.length()-1).equalsIgnoreCase("DTLZ"))
base += "DTLZ.";
else if (name.substring(0,name.length()-1).equalsIgnoreCase("WFG"))
base += "WFG.";
else if (name.substring(0,name.length()-1).equalsIgnoreCase("UF"))
base += "cec2009Competition.";
else if (name.substring(0,name.length()-2).equalsIgnoreCase("UF"))
base += "cec2009Competition.";
else if (name.substring(0,name.length()-1).equalsIgnoreCase("ZDT"))
base += "ZDT.";
else if (name.substring(0,name.length()-3).equalsIgnoreCase("ZZJ07"))
base += "ZZJ07.";
else if (name.substring(0,name.length()-3).equalsIgnoreCase("LZ09"))
base += "LZ09.";
else if (name.substring(0,name.length()-4).equalsIgnoreCase("ZZJ07"))
base += "ZZJ07.";
else if (name.substring(0,name.length()-3).equalsIgnoreCase("LZ06"))
base += "LZ06.";
try {
Class problemClass = Class.forName(base+name);
Constructor [] constructors = problemClass.getConstructors();
int i = 0;
//find the constructor
while ((i < constructors.length) &&
(constructors[i].getParameterTypes().length!=params.length)) {
i++;
}
// constructors[i] is the selected one constructor
Problem problem = (Problem)constructors[i].newInstance(params);
return problem;
}// try
catch(Exception e) {
Configuration.logger_.severe("ProblemFactory.getProblem: " +
"Problem '"+ name + "' does not exist. " +
"Please, check the problem names in jmetal/problems") ;
e.printStackTrace();
throw new JMException("Exception in " + name + ".getProblem()") ;
} // catch
}
}