diff --git a/config.properties b/config.properties index b5a083b..1506879 100644 --- a/config.properties +++ b/config.properties @@ -8,8 +8,8 @@ PROBLEM = DPM # MODEL_TEMPLATE_FILE = models/FX/fxSmall.pm # PROPERTIES_FILE = models/FX/fxSmall.pctl #DPM - MODEL_TEMPLATE_FILE = models/DPMParam/dpmSmall.pm - PROPERTIES_FILE = models/DPMParam/dpmSmall.csl + MODEL_TEMPLATE_FILE = models/DPM/dpm.pm + PROPERTIES_FILE = models/DPM/dpm.csl #Zeroconf #MODEL_TEMPLATE_FILE = models/Zeroconf/zeroconf.pm #PROPERTIES_FILE = models/Zeroconf/zeroconf.pctl @@ -35,9 +35,9 @@ PROBLEM = DPM POPULATION_SIZE = 50 -#Step 4: Set the maximum number of evaluations +#Step 4: Set the maximum number of evaluations and when to save periodically MAX_EVALUATIONS = 1000 - + EVALUATION_INTERVAL=100 #Step 5: Set the number of processors (for parallel execution) PROCESSORS = 1 @@ -45,13 +45,13 @@ PROBLEM = DPM #Step 6: Set plotting settings #Note: requires Python3 - PLOT_PARETO_FRONT = true + PLOT_PARETO_FRONT = false PYTHON3_DIRECTORY = /usr/local/bin/python3 #Step 7: Set additional settings VERBOSE = false - + RELOAD = true #Step 8: Run # Within your main class do: diff --git a/pom.xml b/pom.xml index 470e388..ff948a4 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org EvoChecker jar - 1.1.0 + 3 EvoChecker http://maven.apache.org diff --git a/src/main/java/evochecker/EvoChecker.java b/src/main/java/evochecker/EvoChecker.java index 9625c1a..35e01f5 100644 --- a/src/main/java/evochecker/EvoChecker.java +++ b/src/main/java/evochecker/EvoChecker.java @@ -88,7 +88,8 @@ public class EvoChecker { /** Pareto set filename*/ private String paretoSetFile; - + /** Old solutions to load*/ + private String initialSolutions; public EvoChecker() { @@ -122,31 +123,65 @@ public void setConfigurationFile(String configFile) { public void start() { long start = System.currentTimeMillis(); + int max_eval=Integer.parseInt(Utility.getProperty(Constants.MAX_EVALUATIONS_KEYWORD)); + int interval=Integer.parseInt(Utility.getProperty(Constants.EVALUATION_INTERVAL_KEYWORD)); + + if (intervalmax_eval) + { + Utility.setProperty(Constants.MAX_EVALUATIONS_KEYWORD, Integer.toString(max_eval-i)); + } - //1) initialise problem - initializeProblem(); - - //2) initialise algorithm - initialiseAlgorithm(); - - //3) initialise data structures and variables for saving data - String outputDir = initialiseOutputData(); + if (i>0) + { + try + { + Utility.setProperty(Constants.RELOAD_KEYWORD, "true"); + } catch (Exception e) + { + e.printStackTrace(); + } + } - //4) execute and save results - SolutionSet solutions = execute(); + //0) check configuration script + ConfigurationChecker.checkConfiguration(); - long end = System.currentTimeMillis(); + //1) initialise problem + initializeProblem(); + + //2) initialise algorithm + initialiseAlgorithm(); + + //3) initialise data structures and variables for saving data + String outputDir = initialiseOutputData(); + //4) execute and save results + SolutionSet solutions = execute(); - //5) save solutions - exportResults(outputDir, solutions); - - //6) close down - closeDown(); - - System.err.printf("Time:\t%s\n", (end - start)/1000.0); + + //5) save solutions + exportResults(outputDir, solutions); + long end = System.currentTimeMillis(); + + //6) close down + closeDown(); + + System.err.printf("Time:\t%s\n", (end - start)/1000.0); + } } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/evochecker/auxiliary/Constants.java b/src/main/java/evochecker/auxiliary/Constants.java index 1967617..f9691e6 100644 --- a/src/main/java/evochecker/auxiliary/Constants.java +++ b/src/main/java/evochecker/auxiliary/Constants.java @@ -19,79 +19,85 @@ private Constants() { /** Keyword for probabilistic model template*/ - public static final String MODEL_FILE_KEYWORD = "MODEL_TEMPLATE_FILE"; + public static final String MODEL_FILE_KEYWORD = "MODEL_TEMPLATE_FILE"; /** Keyword for probabilistic properties file*/ - public static final String PROPERTIES_FILE_KEYWORD = "PROPERTIES_FILE"; + public static final String PROPERTIES_FILE_KEYWORD = "PROPERTIES_FILE"; /** Keyword for properties */ - public static final String OBJECTIVES_KEYWORD = "OBJECTIVES"; + public static final String OBJECTIVES_KEYWORD = "OBJECTIVES"; /** Keyword for algorithm*/ - public static final String ALGORITHM_KEYWORD = "ALGORITHM"; + public static final String ALGORITHM_KEYWORD = "ALGORITHM"; /** Keyword for tolerance*/ - public static final String TOLERANCE_KEYWORD = "TOLERANCE"; + public static final String TOLERANCE_KEYWORD = "TOLERANCE"; /** Keyword for multiple tolerance values*/ - public static final String TOLERANCES_KEYWORD = "TOLERANCES"; + public static final String TOLERANCES_KEYWORD = "TOLERANCES"; /** Keyword for multiple runs */ - public static final String RUNS_KEYWORD = "RUNS"; + public static final String RUNS_KEYWORD = "RUNS"; /** Keyword for epsilon*/ - public static final String EPSILON_KEYWORD = "EPSILON"; + public static final String EPSILON_KEYWORD = "EPSILON"; /** Keyword for multiple epsilon values*/ - public static final String EPSILONS_KEYWORD = "EPSILONS"; + public static final String EPSILONS_KEYWORD = "EPSILONS"; /** Keyword for problem name*/ - public static final String PROBLEM_KEYWORD = "PROBLEM"; + public static final String PROBLEM_KEYWORD = "PROBLEM"; /** Keyword for sensitivity*/ - public static final String SENSITIVITY_KEYWORD = "SENSITIVITY"; + public static final String SENSITIVITY_KEYWORD = "SENSITIVITY"; /** Keyword for maximum evaluations*/ - public static final String MAX_EVALUATIONS_KEYWORD = "MAX_EVALUATIONS"; + public static final String MAX_EVALUATIONS_KEYWORD = "MAX_EVALUATIONS"; + + /** Keyword for evaluation intervals*/ + public static final String EVALUATION_INTERVAL_KEYWORD = "EVALUATION_INTERVAL"; + + /** Keyword for reloading flag*/ + public static final String RELOAD_KEYWORD = "RELOAD"; /** Keyword for population size*/ - public static final String POPULATION_SIZE_KEYWORD = "POPULATION_SIZE"; + public static final String POPULATION_SIZE_KEYWORD = "POPULATION_SIZE"; /** Keyword for processors*/ - public static final String PROCESSORS_KEYWORD = "PROCESSORS"; + public static final String PROCESSORS_KEYWORD = "PROCESSORS"; /** Keyword for initial port number*/ - public static final String INITIAL_PORT_KEYWORD = "INIT_PORT"; + public static final String INITIAL_PORT_KEYWORD = "INIT_PORT"; /** Keyword for initial JVM*/ - public static final String JAVA_KEYWORD = "JAVA"; + public static final String JAVA_KEYWORD = "JAVA"; /** Keyword for interval */ - public static final String INTERVAL_KEYWORD = "INTERVAL"; + public static final String INTERVAL_KEYWORD = "INTERVAL"; /** Keyword for dominance relation */ - public static final String DOMINANCE_KEYWORD = "DOMINANCE"; + public static final String DOMINANCE_KEYWORD = "DOMINANCE"; /** Keyword for errors */ - public static final String ERRORS_KEYWORD = "ERRORS"; + public static final String ERRORS_KEYWORD = "ERRORS"; /** Keyword for messages to be shown on the UI */ - public static final String MESSAGE_KEYWORD = "MESSAGE"; + public static final String MESSAGE_KEYWORD = "MESSAGE"; /** Keyword for finishing execution */ - public static final String DONE_KEYWORD = "DONE"; + public static final String DONE_KEYWORD = "DONE"; /** Keyword for graph path*/ - public static final String GRAPH_KEYWORD = "GRAPH"; + public static final String GRAPH_KEYWORD = "GRAPH"; /** Keyword for output directory*/ - public static final String OUTPUT_DIR_KEYWORD = "OUTPUT_DIR"; + public static final String OUTPUT_DIR_KEYWORD = "OUTPUT_DIR"; /** Keyword for output file suffix*/ - public static final String OUTPUT_FILE_SUFFIX = "OUTPUT_FILE_SUFFIX"; + public static final String OUTPUT_FILE_SUFFIX = "OUTPUT_FILE_SUFFIX"; /** Keyword for model checking engine*/ - public static final String MODEL_CHECKING_ENGINE = "MODEL_CHECKING_ENGINE"; + public static final String MODEL_CHECKING_ENGINE = "MODEL_CHECKING_ENGINE"; public static final String MODEL_CHECKING_ENGINE_DEFAULT = "libs/PrismExecutor.jar"; /** Keyword for libraries required for running the model checking engine*/ @@ -121,31 +127,31 @@ private Constants() { /** Algorithms currently supported by our implementation*/ public static enum ALGORITHM{ - NSGAII, - SPEA2, - MOCELL, - RANDOM - ; - } + NSGAII, + SPEA2, + MOCELL, + RANDOM + ; + } /** Dominance relations currently supported by our implementation*/ public static enum DOMINANCE{ - eDominanceWorstCaseDominance ("evochecker.genetic.jmetal.util.eDominanceWorstCaseDominanceComparator"), - eDominanceRevisedWorstCaseDominance ("evochecker.genetic.jmetal.util.eDominanceRevisedWorstCaseDominanceComparator") - ; - - - private String comparatorPath; - - DOMINANCE(String path){ -// try { -// Class clazz = Class.forName(path); -// comparator = (RegionDominanceComparator)clazz.newInstance(); -// } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { -// e.printStackTrace(); -// } - this.comparatorPath = path; -// System.out.println(comparatorPath +"\t"+ path); - } + eDominanceWorstCaseDominance ("evochecker.genetic.jmetal.util.eDominanceWorstCaseDominanceComparator"), + eDominanceRevisedWorstCaseDominance ("evochecker.genetic.jmetal.util.eDominanceRevisedWorstCaseDominanceComparator") + ; + + + private String comparatorPath; + + DOMINANCE(String path){ +// try { +// Class clazz = Class.forName(path); +// comparator = (RegionDominanceComparator)clazz.newInstance(); +// } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { +// e.printStackTrace(); +// } + this.comparatorPath = path; +// System.out.println(comparatorPath +"\t"+ path); + } } } \ No newline at end of file diff --git a/src/main/java/evochecker/genetic/jmetal/metaheuristics/pNSGAII.java b/src/main/java/evochecker/genetic/jmetal/metaheuristics/pNSGAII.java index ed7fb46..71858ea 100644 --- a/src/main/java/evochecker/genetic/jmetal/metaheuristics/pNSGAII.java +++ b/src/main/java/evochecker/genetic/jmetal/metaheuristics/pNSGAII.java @@ -21,6 +21,10 @@ package evochecker.genetic.jmetal.metaheuristics; import java.util.List; +import java.util.ArrayList; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; import evochecker.evaluator.IParallelEvaluator; import jmetal.core.Algorithm; @@ -28,11 +32,18 @@ import jmetal.core.Problem; import jmetal.core.Solution; import jmetal.core.SolutionSet; +import jmetal.core.Variable; import jmetal.qualityIndicator.QualityIndicator; import jmetal.util.Distance; import jmetal.util.JMException; import jmetal.util.Ranking; import jmetal.util.comparators.CrowdingComparator; +import evochecker.genetic.jmetal.encoding.ArrayReal; +import evochecker.genetic.jmetal.encoding.ArrayInt; +import java.io.File; +import evochecker.auxiliary.Constants; +import evochecker.auxiliary.FileUtil; +import evochecker.auxiliary.Utility; /** * Implementation of NSGA-II. @@ -103,13 +114,107 @@ public SolutionSet execute() throws JMException, ClassNotFoundException { crossoverOperator = operators_.get("crossover"); selectionOperator = operators_.get("selection"); + String set=""; + List lines = new ArrayList(); + if (Boolean.parseBoolean(Utility.getProperty(Constants.RELOAD_KEYWORD))) + { + // Find most recent Pareto Set + String problem_string=Utility.getProperty(Constants.PROBLEM_KEYWORD).toUpperCase(); + String path="./data/"+problem_string+"/NSGAII/"; + File source = new File(path); + String[] filelist=source.list(); + + long modified=0; + + for(String str: filelist) + { + if (str.split("_")[4].equals("Set")) + { + File file= new File(path+str); + long time=file.lastModified(); + if (time>modified) + { + set=str; + modified=time; + } + } + } + + // Print previously found Set to be used + if (!(set.equals(""))) + { + System.out.println("Loading previous Pareto Set: "+set); + try + { + BufferedReader set_reader = new BufferedReader(new FileReader(path+set)); + String line; + while((line=set_reader.readLine())!=null) + { + lines.add(line); + // System.out.println(line); + } + set_reader.close(); + } catch (IOException e) + { + e.printStackTrace(); + } + } + } // Create the initial solutionSet Solution newSolution; for (int i = 0; i < populationSize; i++) { newSolution = new Solution(problem_); + + // Change initial population to previously found set (if exists) + if (!(set.equals(""))) + { + if (i solutionList = parallelEvaluator_.parallelEvaluation() ; for (Solution solution : solutionList) { population.add(solution) ; @@ -120,8 +225,8 @@ public SolutionSet execute() throws JMException, ClassNotFoundException { // Generations while (evaluations < maxEvaluations) { - System.out.println("Evaluations:\t" + evaluations); - + System.out.println("Evaluations:\t" + evaluations); + // Create the offSpring solutionSet offspringPopulation = new SolutionSet(populationSize); Solution[] parents = new Solution[2]; @@ -135,14 +240,14 @@ public SolutionSet execute() throws JMException, ClassNotFoundException { mutationOperator.execute(offSpring[1]); parallelEvaluator_.addSolutionForEvaluation(offSpring[0]) ; parallelEvaluator_.addSolutionForEvaluation(offSpring[1]) ; - } // if - } // for + } + } List solutions = parallelEvaluator_.parallelEvaluation() ; for(Solution solution : solutions) { offspringPopulation.add(solution); - evaluations++; + evaluations++; } // Create the solutionSet union of solutionSet and offSpring @@ -202,15 +307,15 @@ public SolutionSet execute() throws JMException, ClassNotFoundException { -// //Save the pareto set every 25% evaluations -// if (maxEvaluations*times/4 <= evaluations){ -// System.out.println("Saving Pareto set"); -// Ranking rank = new Ranking(population); -// SolutionSet paretoSet = rank.getSubfront(0); -// paretoSet.printVariablesToFile("data/VAR_NSGAII"+times); -// paretoSet.printObjectivesToFile("data/FUN_NSGAII"+times); -// times ++; -// } +// //Save the pareto set every 25% evaluations +// if (maxEvaluations*times/4 <= evaluations){ +// System.out.println("Saving Pareto set"); +// Ranking rank = new Ranking(population); +// SolutionSet paretoSet = rank.getSubfront(0); +// paretoSet.printVariablesToFile("data/VAR_NSGAII"+times); +// paretoSet.printObjectivesToFile("data/FUN_NSGAII"+times); +// times ++; +// } } // while