package problema;
import jmetal.core.*;
import jmetal.metaheuristics.nsgaII.NSGAII;
import jmetal.metaheuristics.randomSearch.RandomSearch;
import jmetal.metaheuristics.spea2.SPEA2;
import jmetal.operators.crossover.CrossoverFactory;
import jmetal.operators.localSearch.LocalSearch;
import jmetal.operators.localSearch.MutationLocalSearch;
import jmetal.operators.mutation.MutationFactory;
import jmetal.operators.selection.SelectionFactory;
import jmetal.qualityIndicator.QualityIndicator;
import jmetal.util.JMException;
import problema.datos.*;
import test.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
/**
* Created by Cristiano on 27/07/2015.
*/
public class MainAE {
public static void main(String[] args) throws JMException, ClassNotFoundException, IOException {
Datos datos;
try{
datos = Datos.cargarDatosDeArgs(args);
}
catch (Throwable t){
System.out.println(t.getMessage());
return;
}
int popSize = 200;
int maxGen = 1000;
double crossProb = 0.8;
double mutProb = 0.15;
String algoritmo = "NSGA2";
String salidaFun = "SALIDA_FUN.txt";
String salidaVar = "SALIDA_VAR.txt";
if(args.length >= 7){
algoritmo = args[6];
}
if(args.length >= 8){
popSize = Integer.parseInt(args[7]);
}
if(args.length >= 9){
maxGen = Integer.parseInt(args[8]);
}
if(args.length >= 10){
crossProb = Double.parseDouble(args[9]);
}
if(args.length >= 11){
mutProb = Double.parseDouble(args[10]);
}
if(args.length >= 12){
salidaFun = args[11];
}
if(args.length >= 13){
salidaVar = args[12];
}
System.out.println("---- Parametros a utilizar ----");
System.out.println("Algoritmo: " + algoritmo);
System.out.println("Tam Pob: " + popSize);
System.out.println("Max Gen: " + maxGen);
System.out.println("Cross Prob: " + crossProb);
System.out.println("Mut Prob: " + mutProb);
System.out.println("Salidas: " + salidaFun + ", " + salidaVar);
Problem problem ; // The problem to solve
Algorithm algorithm ; // The algorithm to use
Operator crossover ; // Crossover operator
Operator mutation ; // Mutation operator
Operator selection ; // Selection operator
HashMap parameters ; // Operator parameters
QualityIndicator indicators = null; // Object to get quality indicators
problem = new Problema(datos);
if(algoritmo.equalsIgnoreCase("NSGA2")){
algorithm = new NSGAII(problem);
}
else if(algoritmo.equalsIgnoreCase("SPEA2")){
algorithm = new SPEA2(problem);
algorithm.setInputParameter("archiveSize",popSize/2);
}
else if (algoritmo.equalsIgnoreCase("RANDOM")){
algorithm = new RandomSearch(problem);
}
else {
System.out.println("Agoritmo invalido, opciones: NSGA2 y SPEA2");
return;
}
// Algorithm parameters
algorithm.setInputParameter("populationSize",popSize);
algorithm.setInputParameter("maxGenerations",maxGen);
// Mutation and Crossover for Real codification
parameters = new HashMap() ;
parameters.put("probability", crossProb) ;
crossover = CrossoverFactory.getCrossoverOperator("ZeroPMXCrossover", parameters);
//crossover = CrossoverFactory.getCrossoverOperator("TwoPointsCrossover", parameters);
parameters = new HashMap() ;
parameters.put("probability", mutProb) ;
mutation = MutationFactory.getMutationOperator("ZeroPermBitFlipMutation", parameters);
// Selection Operator
parameters = null ;
if (algoritmo.equalsIgnoreCase("NSGA2")) {
selection = SelectionFactory.getSelectionOperator("BinaryTournament2", parameters) ;
}
else {
selection = SelectionFactory.getSelectionOperator("BinaryTournament", parameters) ;
}
// Add the operators to the algorithm
algorithm.addOperator("crossover",crossover);
algorithm.addOperator("mutation",mutation);
algorithm.addOperator("selection",selection);
long initTime = System.currentTimeMillis();
SolutionSet population = algorithm.execute();
long elapsedTime = System.currentTimeMillis() - initTime;
Solution compromiso = ((Problema)problem).getSolucionDeCompromiso(population);
System.out.println("Compromiso F1: " + compromiso.getObjective(0));
System.out.println("Compromiso F2: " + compromiso.getObjective(1));
System.out.println("Tiempo Algoritmo: " + elapsedTime/1000 + "s");
population.printFeasibleFUN(salidaFun);
population.printFeasibleVAR(salidaVar);
((Problema) problem).imprimirSolucion("SALIDA.txt", population);
//SolutionSet compromisoSet = new SolutionSet(1);
//compromisoSet.add(compromiso);
//((Problema)problem).imprimirSolucion("SALIDA_COMPROMISO.txt", compromisoSet);
}
}