UserProgram.java
package progen.userprogram;
import java.util.Locale;
import progen.ProGenException;
import progen.context.ProGenContext;
import progen.kernel.population.Individual;
import progen.kernel.population.UnknownUserProgramException;
/**
* Clase que define la funcionalidad básica de un programa implementado por un
* usuario. Desde esta implementación concreta, se definirá específicamente la
* función de evaluación de individuos.
*
* @author jirsis
* @since 2.0
*/
public abstract class UserProgram {
public static UserProgram getUserProgram() {
final String userPackage = ProGenContext.getMandatoryProperty("progen.user.home");
final String[] path = userPackage.split("\\.");
final String userProgramClass = getPathCapitalize(path);
return makeUserProgram(userPackage, userProgramClass);
}
private static UserProgram makeUserProgram(final String userPackage, final String userProgramClass) {
UserProgram userProgram = null;
try {
userProgram = (UserProgram) Class.forName(userPackage + userProgramClass).newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new ProGenException(e.getMessage(), e);
} catch (ClassNotFoundException e) {
throw new UnknownUserProgramException(userPackage + userProgramClass, e);
}
return userProgram;
}
private static String getPathCapitalize(final String[] path) {
String userProgramClass;
userProgramClass = path[path.length - 1].substring(0, 1).toUpperCase(Locale.getDefault());
userProgramClass += path[path.length - 1].substring(1);
return userProgramClass;
}
/**
* Método de inicialización del UserProgram concreto de cada usuario que será
* llamado una única vez antes de empezar a evaluar y ejectuar las distintas
* generaciones de un experimento concreto.
*/
public void initialize() {
//
}
/**
* Método de finalización del UserProgram concreto de cada usuario que será
* llamado una única vez antes de empezar a evaluar y ejectuar las distintas
* generaciones de un experimento concreto.
*
* @param best
* El mejor individuo, para retocar algún parámetro.
* @return Devuelve la representación modificada del mejor individuo.
*/
public String postProcess(Individual best) {
return "";
}
/**
* Forma de calcular la función de fitness de un individuo concreto.
*
* @param individual
* Individuo del que se tiene que devolver un valor de fitness.
* @return Valor del raw-fitness del individuo. Tiene que ser un valor de tal
* forma que si devuelve un valor de 0, es que se ha encontrado al
* individuo perfecto.
*/
public abstract double fitness(Individual individual);
}