docs: public static void main(String[] args) throws JMetalException, IOException, InterruptedException {
      DoubleProblem problem;
      Algorithm<List<DoubleSolution>> algorithm;
      MutationOperator<DoubleSolution> mutation;
      String referenceParetoFront ;
  
      problem = new Ebes("ebes/Mobile_Bridge_25N_35B_8G_16OrdZXY.ebe", new String[]{"W", "D"}) ;
      referenceParetoFront = null ;
      List<List<Double>> referencePoints;
      referencePoints = new ArrayList<>();
  
      referencePoints.add(Arrays.asList(0.0, 0.0));
  
      double mutationProbability = 1.0 / problem.getNumberOfVariables();
      double mutationDistributionIndex = 20.0;
      mutation = new PolynomialMutation(mutationProbability, mutationDistributionIndex);
  
      int maxIterations = 2500;
      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(), 300);
      chart.setFrontChart(0, 1, referenceParetoFront);
      chart.setReferencePoint(referencePoints);
      chart.initChart();
  
      solutionListMeasure.register(new ChartListener(chart));
      iterationMeasure.register(new IterationListener(chart));
  
      /* End of measure management */
  
      Thread algorithmThread = new Thread(algorithm);
      ChangeReferencePoint changeReferencePoint = new ChangeReferencePoint(algorithm, referencePoints, archivesWithReferencePoints, chart) ;
  
      Thread changePointsThread = new Thread(changeReferencePoint) ;
  
      algorithmThread.start();
      changePointsThread.start();
  
      algorithmThread.join();
  
      chart.saveChart("RSMPSO", BitmapEncoder.BitmapFormat.PNG);
      List<DoubleSolution> population = algorithm.getResult();
  
      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.out.println("FINISH") ;
      System.exit(0);
    }