1

Instrumenter 클래스가 있다는 것을 알고 있지만,이 메서드는 데이터 실행 완료 후 출력합니다. 데모의 상징적 회귀와 같이 (거의) 실시간 데이터를 얻고 싶습니다. 코드를 보면 step 메서드를 사용하고 runSingleSeedExecutor에 모방하려고합니다. 더 좋은 방법이 있습니까? Instrumenter과 같은 다른 클래스이지만 비동기입니다. 나는 온라인으로 비슷한 것을 찾을 수 없다.MOEA Framework에서 실시간 통계를 얻는 방법은 무엇입니까?

답변

0

주기를 둘러싼 래퍼 (다음 것과 비슷한)를 작성하고 관찰자 패턴의 주제로 만드십시오.

observer pattern diagram

import java.util.Properties; 
import java.util.Arrays; 
import java.text.DecimalFormat; 
import org.moeaframework.core.Algorithm; 
import org.moeaframework.core.Solution; 
import org.moeaframework.core.Problem; 
import org.moeaframework.core.Population; 
import org.moeaframework.core.NondominatedPopulation; 
import org.moeaframework.core.variable.EncodingUtils; 
import org.moeaframework.core.spi.AlgorithmFactory; 

import org.moeaframework.problem.misc.Kursawe; 

public class Main{ 
    public static void main(String[] args){ 
    String algorithmName = "NSGAII"; 

    Properties properties = new Properties(); 
    properties.setProperty("populationSize", "100"); // to change properties 

     Problem problem = new Kursawe(); 

    Algorithm algorithm = AlgorithmFactory.getInstance() 
     .getAlgorithm(algorithmName, properties, problem); 

    int maxGenerations = 100; 
    int generation = 0; 
    while(generation < maxGenerations){ 
     if(generation % 10 == 1){ 
     System.out.println("Generation " + generation); 
     NondominatedPopulation paretoFront = algorithm.getResult(); 
     // metrics 
     System.out.print("One of the pareto front: "); 
     System.out.println(toString(paretoFront.get(0)));  
     } 
     algorithm.step();  
     generation++; 
    } 
    algorithm.terminate(); 

    System.out.println("Parento Front:"); 
    for(Solution solution: algorithm.getResult()){ 
     System.out.println(toString(solution)); 
    } 
    export(algorithm.getResult()); 
    } 
    private static String toString(Solution solution){ 
    StringBuilder out = new StringBuilder(); 
    double[] variables = EncodingUtils.getReal(solution); 
    double[] objectives = solution.getObjectives(); 

    out.append("f"); 
    out.append(doubleArrayToString(variables)); 
    out.append(" = "); 
    out.append(doubleArrayToString(objectives)); 

    return out.toString(); 
    } 

    private static String doubleArrayToString(double[] array){ 
    DecimalFormat format = new DecimalFormat("+#,##0.00;-#"); 
    StringBuilder out = new StringBuilder();  

    out.append("["); 
    for(int i = 0; i < array.length-1; i++){ 
     out.append(format.format(array[i])); 
     out.append(", "); 
    } 
    out.append(format.format(array[array.length-1])); 
    out.append("]"); 

    return out.toString(); 
    } 

    private static void export(Population population){ 
    System.out.println(); 
    for(Solution solution: population){ 
     double[] objectives = solution.getObjectives(); 
     System.out.println(String.format("%.3f,%.3f", objectives[0], objectives[1])); 
    } 
    } 
} 

pareto front