[JAVA] Configuration et exécution de l'algorithme de description jMetal

Page originale

https://github.com/jMetal/jMetalDocumentation/blob/master/running.md

Je viens de traduire cette page en gros.

Paramètres d'algorithme

** La seule façon de définir l'algorithme est d'écrire une classe appelée runner **. (Il semble que nous souhaitons pouvoir lire les paramètres à partir d'un fichier externe dans les versions suivantes et suivantes)

Au moins une classe runner est fournie pour les algorithmes inclus dans jMetal. Ils sont dans le module jmetal-exec ce dossier C'est dedans.

Les cinq classes de coureurs NSGA-II suivantes sont données à titre d'exemple. Ceux-ci sont destinés à être utilisés à des fins différentes.

Les détails de la classe NSGAIIRunner sont indiqués ci-dessous. Comme indiqué dans Javadoc, le premier argument est le nom de classe du problème à résoudre. Le deuxième argument est un paramètre optionnel qui donne le chemin du fichier contenant l'approximation optimale du front de parate. Étant donné un front de parate, il est utilisé pour calculer tous les indicateurs de qualité disponibles.

public class NSGAIIRunner extends AbstractAlgorithmRunner {
  /**
   * @param args Command line arguments.
   * @throws JMetalException
   * @throws FileNotFoundException
   * Invoking command: java org.uma.jmetal.runner.multiobjetive.NSGAIIRunner problemName [referenceFront]
   */
  public static void main(String[] args) throws JMetalException, FileNotFoundException {

La méthode main déclare d'abord le type de problème à résoudre et l'opérateur à utiliser. (Dans cet exemple, nous déclarons un problème qui traite DoubleSolution comme un individu.) referenceParetoFront indique le chemin d'accès optimal du fichier Pareto Front donné.

    Problem<DoubleSolution> problem;
    Algorithm<List<DoubleSolution>> algorithm;
    CrossoverOperator<DoubleSolution> crossover;
    MutationOperator<DoubleSolution> mutation;
    SelectionOperator<List<DoubleSolution>, DoubleSolution> selection;
    String referenceParetoFront = "" ;

Ensuite, il analyse les arguments donnés au programme. Si aucun argument n'est donné, le problème de référence est résolu par défaut. (Dans cet exemple, résolvez ZDT1.)

    String problemName ;
    if (args.length == 1) {
      problemName = args[0];
    } else if (args.length == 2) {
      problemName = args[0] ;
      referenceParetoFront = args[1] ;
    } else {
      problemName = "org.uma.jmetal.problem.multiobjective.zdt.ZDT1";
      referenceParetoFront = "jmetal-problem/src/test/resources/pareto_fronts/ZDT1.pf" ;
    }

Ensuite, chargez problem à partir du nom de la classe.

    problem = ProblemUtils.<DoubleSolution> loadProblem(problemName);

Ensuite, définissez l'opérateur et l'algorithme.

    double crossoverProbability = 0.9 ;
    double crossoverDistributionIndex = 20.0 ;
    crossover = new SBXCrossover(crossoverProbability, crossoverDistributionIndex) ;

    double mutationProbability = 1.0 / problem.getNumberOfVariables() ;
    double mutationDistributionIndex = 20.0 ;
    mutation = new PolynomialMutation(mutationProbability, mutationDistributionIndex) ;

    selection = new BinaryTournamentSelection<DoubleSolution>(new RankingAndCrowdingDistanceComparator<DoubleSolution>());

    algorithm = new NSGAIIBuilder<DoubleSolution>(problem, crossover, mutation)
        .setSelectionOperator(selection)
        .setMaxEvaluations(25000)
        .setPopulationSize(100)
        .build() ;

Enfin, l'algorithme est exécuté et la solution obtenue est écrite dans deux fichiers. Écrivez la valeur de la variable dans l'un et la valeur de la fonction objectif dans l'autre. De plus, si le front de parate est donné comme argument, imprimez les résultats du calcul de tous les indicateurs de qualité disponibles.

    AlgorithmRunner algorithmRunner = new AlgorithmRunner.Executor(algorithm)
        .execute() ;

    List<DoubleSolution> population = algorithm.getResult() ;
    long computingTime = algorithmRunner.getComputingTime() ;

    JMetalLogger.logger.info("Total execution time: " + computingTime + "ms");

    printFinalSolutionSet(population);
    if (!referenceParetoFront.equals("")) {
      printQualityIndicators(population, referenceParetoFront) ;
    }
  }

Recommended Posts

Configuration et exécution de l'algorithme de description jMetal
À propos de la phase de paramétrage et de la phase d'exécution de Gradle