docs: public static void main(String[] args) throws JMetalException, IOException {
      DoubleProblem problem;
      Algorithm<List<DoubleSolution>> algorithm;
      MutationOperator<DoubleSolution> mutation;
      String referenceParetoFront = "" ;
  
      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" ;
      }
  
      problem = (DoubleProblem) ProblemUtils.<DoubleSolution> loadProblem(problemName);
  
      List<List<Double>> referencePoints;
      referencePoints = new ArrayList<>();
      //referencePoints.add(Arrays.asList(0.6, 0.1)) ;
      referencePoints.add(Arrays.asList(0.2, 0.3)) ;
      referencePoints.add(Arrays.asList(0.8, 0.2)) ;
  
      double mutationProbability = 1.0 / problem.getNumberOfVariables() ;
      double mutationDistributionIndex = 20.0 ;
      mutation = new PolynomialMutation(mutationProbability, mutationDistributionIndex) ;
  
      int maxIterations = 250;
      int swarmSize = 100 ;
  
      List<ArchiveWithReferencePoint<DoubleSolution>> archivesWithReferencePoints = new ArrayList<>();
  
      for (int i = 0 ; i < referencePoints.size(); i++) {
        archivesWithReferencePoints.add(
            new CrowdingDistanceArchiveWithReferencePoint<DoubleSolution>(
                swarmSize/referencePoints.size(), referencePoints.get(i))) ;
      }
  
      algorithm = new SMPSORP(problem,
              swarmSize,
              archivesWithReferencePoints,
              referencePoints,
              mutation,
              maxIterations,
              0.0, 1.0,
              0.0, 1.0,
              2.5, 1.5,
              2.5, 1.5,
              0.1, 0.1,
              -1.0, -1.0,
              new SequentialSolutionListEvaluator<>() );
  
      /* Measure management */
      MeasureManager measureManager = ((SMPSORP) algorithm).getMeasureManager();
  
      BasicMeasure<List<DoubleSolution>> solutionListMeasure = (BasicMeasure<List<DoubleSolution>>) measureManager
              .<List<DoubleSolution>>getPushMeasure("currentPopulation");
      CountingMeasure iterationMeasure = (CountingMeasure) measureManager.<Long>getPushMeasure("currentIteration");
  
      ChartContainerWithReferencePoints chart = new ChartContainerWithReferencePoints(algorithm.getName(), 80);
      chart.setFrontChart(0, 1, referenceParetoFront);
      chart.setReferencePoint(referencePoints);
      chart.initChart();
  
      solutionListMeasure.register(new ChartListener(chart));
      iterationMeasure.register(new IterationListener(chart));
  
      /* End of measure management */
  
      AlgorithmRunner algorithmRunner = new AlgorithmRunner.Executor(algorithm)
              .execute() ;
  
      chart.saveChart("SMPSORP", BitmapEncoder.BitmapFormat.PNG);
      List<DoubleSolution> population = algorithm.getResult() ;
      long computingTime = algorithmRunner.getComputingTime() ;
  
      JMetalLogger.logger.info("Total execution time: " + computingTime + "ms");
  
      new SolutionListOutput(population)
              .setSeparator("\t")
              .setVarFileOutputContext(new DefaultFileOutputContext("VAR.tsv"))
              .setFunFileOutputContext(new DefaultFileOutputContext("FUN.tsv"))
              .print();
  
      for (int i = 0 ; i < archivesWithReferencePoints.size(); i++) {
        new SolutionListOutput(archivesWithReferencePoints.get(i).getSolutionList())
            .setSeparator("\t")
            .setVarFileOutputContext(new DefaultFileOutputContext("VAR" + i + ".tsv"))
            .setFunFileOutputContext(new DefaultFileOutputContext("FUN" + i + ".tsv"))
            .print();
      }
  
      System.exit(0);
    }