From 3c59a3eeba4e5db4835bacc4d000e26ade128ebf Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Tue, 17 Jul 2018 15:08:46 +0200 Subject: [PATCH] some fixes. test 5 still fails. --- .../jastadd/solvers/genetic/Checking.jrag | 10 ++-- .../mquat/solving/genetic/GeneticSolver.java | 60 ++++++++++++++++++- .../solving/genetic/opt4j/Opt4jEvaluator.java | 4 +- .../solving/genetic/opt4j/Opt4jModule.java | 48 --------------- ...nTest.java => GeneticHandwrittenTest.java} | 2 +- ...SolverTest.java => GeneticSolverTest.java} | 6 +- .../mquat/solving/HandwrittenTestSuite.java | 2 + 7 files changed, 70 insertions(+), 62 deletions(-) rename jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/{SimpleHandwrittenTest.java => GeneticHandwrittenTest.java} (74%) rename jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/{SimpleSolverTest.java => GeneticSolverTest.java} (89%) diff --git a/jastadd-mquat-base/src/main/jastadd/solvers/genetic/Checking.jrag b/jastadd-mquat-base/src/main/jastadd/solvers/genetic/Checking.jrag index 8ab4e34..fcc46c7 100644 --- a/jastadd-mquat-base/src/main/jastadd/solvers/genetic/Checking.jrag +++ b/jastadd-mquat-base/src/main/jastadd/solvers/genetic/Checking.jrag @@ -2,7 +2,7 @@ aspect Checking { syn int Solution.evaluateValidity() { - int faults = evaluateSoftwareCompletenessa(); + int faults = evaluateSoftwareCompleteness(); Set<Request> requestSet = new HashSet<>(); Set<Resource> resourceSet = new HashSet<>(); @@ -54,7 +54,7 @@ aspect Checking { syn int Solution.evaluateSoftwareValidity() { - int faults = evaluateSoftwareCompletenessa(); + int faults = evaluateSoftwareCompleteness(); // check assignments Iterator<Assignment> assignmentIterator = this.assignmentIterator(); @@ -92,7 +92,7 @@ aspect Checking { return faults; } - syn int Solution.evaluateSoftwareCompletenessa() { + syn int Solution.evaluateSoftwareCompleteness() { int faults = 0; @@ -102,7 +102,7 @@ aspect Checking { } for (Assignment assignment : getAssignmentList()) { - faults += assignment.evaluateSoftwareCompletenessa(); + faults += assignment.evaluateSoftwareCompleteness(); targets.remove(assignment.getImplementation().containingComponent()); } @@ -113,7 +113,7 @@ aspect Checking { return faults + targets.size(); } - syn int Assignment.evaluateSoftwareCompletenessa() { + syn int Assignment.evaluateSoftwareCompleteness() { int faults = 0; if (getRequest() == null) { diff --git a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/GeneticSolver.java b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/GeneticSolver.java index bb07c44..b89bb49 100644 --- a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/GeneticSolver.java +++ b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/GeneticSolver.java @@ -1,13 +1,23 @@ package de.tudresden.inf.st.mquat.solving.genetic; +import de.tudresden.inf.st.mquat.generator.ScenarioDescription; import de.tudresden.inf.st.mquat.jastadd.model.Root; import de.tudresden.inf.st.mquat.jastadd.model.Solution; import de.tudresden.inf.st.mquat.solving.BenchmarkableSolver; import de.tudresden.inf.st.mquat.solving.Solver; import de.tudresden.inf.st.mquat.solving.SolvingException; +import de.tudresden.inf.st.mquat.solving.genetic.opt4j.Opt4jModule; +import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.copy.TreeCopyOperatorModule; +import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.crossover.TreeCrossoverOperatorModule; +import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.mutate.TreeMutateOperatorModule; import de.tudresden.inf.st.mquat.utils.StopWatch; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.opt4j.core.Individual; +import org.opt4j.core.optimizer.Archive; +import org.opt4j.core.start.Opt4JTask; +import org.opt4j.optimizers.ea.EvolutionaryAlgorithmModule; +import org.opt4j.viewer.ViewerModule; import java.util.ArrayList; import java.util.List; @@ -39,14 +49,58 @@ public class GeneticSolver implements BenchmarkableSolver { @Override public Solution solve(Root model) throws SolvingException { reset(); + + stopWatch = StopWatch.start(); + + List<Solution> solutions = new ArrayList<>(); + if (model.getNumRequest() == 0) { return Solution.emptySolutionOf(model); } - stopWatch = StopWatch.start(); - List<Solution> solutions = new ArrayList<>(); - // do some solvin' + Opt4jModule.setModel(model); + + EvolutionaryAlgorithmModule ea = new EvolutionaryAlgorithmModule(); + ea.setGenerations(1000); + + // set population size + ea.setAlpha(50); + + Opt4jModule testModule = new Opt4jModule(); + + TreeCrossoverOperatorModule crossover = new TreeCrossoverOperatorModule(); + TreeMutateOperatorModule mutate = new TreeMutateOperatorModule(); + TreeCopyOperatorModule copy = new TreeCopyOperatorModule(); + + ViewerModule viewer = new ViewerModule(); + viewer.setCloseOnStop(false); + + Opt4JTask task = new Opt4JTask(false); + task.init(ea, testModule, crossover, mutate, copy); +// task.init(ea, testModule, viewer, crossover, mutate, copy); + try { + task.execute(); + Archive archive = task.getInstance(Archive.class); + for (Individual individual : archive) { + // obtain the phenotype and objective, etc. of each individual + Solution solution = (Solution) individual.getPhenotype(); + if (solution.isValid()) { + if (solutions.isEmpty() || solution.computeObjective() < solutions.get(solutions.size() - 1).computeObjective()) { + Solution clone = solution.deepCopy(); + solutions.add(clone); + logger.info("found a better solution with an objective of {}.", solution.computeObjective()); + } + } else { + logger.warn("Found an invalid solution with " + solution.evaluateValidity() + " errors."); + } + + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + task.close(); + } if (solutions.size() > 0) { lastSolution = solutions.get(solutions.size() - 1); diff --git a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jEvaluator.java b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jEvaluator.java index 26bfffd..d4612e7 100644 --- a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jEvaluator.java +++ b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jEvaluator.java @@ -12,7 +12,7 @@ public class Opt4jEvaluator implements Evaluator<Solution> { Objectives objectives = new Objectives(); objectives.add("Validity Errors", Sign.MIN, phenotype.evaluateValidity() * 1000); objectives.add("Software Validity Errors", Sign.MIN, phenotype.evaluateSoftwareValidity() * 1000); - objectives.add("Structural Errors", Sign.MIN, phenotype.evaluateSoftwareCompletenessa() * 1000); + objectives.add("Structural Errors", Sign.MIN, phenotype.evaluateSoftwareCompleteness() * 1000); double objective = phenotype.computeObjective(); @@ -22,7 +22,7 @@ public class Opt4jEvaluator implements Evaluator<Solution> { if (phenotype.evaluateSoftwareValidity() != 0) { objective *= 10; } - if (phenotype.evaluateSoftwareCompletenessa() != 0) { + if (phenotype.evaluateSoftwareCompleteness() != 0) { objective *= 10; } diff --git a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jModule.java b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jModule.java index 86f1ebc..5fff25a 100644 --- a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jModule.java +++ b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jModule.java @@ -1,16 +1,7 @@ package de.tudresden.inf.st.mquat.solving.genetic.opt4j; -import de.tudresden.inf.st.mquat.generator.ScenarioDescription; import de.tudresden.inf.st.mquat.jastadd.model.Root; -import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.copy.TreeCopyOperatorModule; -import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.crossover.TreeCrossoverOperatorModule; -import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.mutate.TreeMutateOperatorModule; -import org.opt4j.core.Individual; -import org.opt4j.core.optimizer.Archive; import org.opt4j.core.problem.ProblemModule; -import org.opt4j.core.start.Opt4JTask; -import org.opt4j.optimizers.ea.EvolutionaryAlgorithmModule; -import org.opt4j.viewer.ViewerModule; public class Opt4jModule extends ProblemModule { @@ -24,45 +15,6 @@ public class Opt4jModule extends ProblemModule { Opt4jModule.model = model; } - public static void main(String[] args) { - - final ScenarioDescription SCENARIO_DESCRIPTION = new ScenarioDescription(1, 2, 0, 0, 0, 2, 3, 1.5, 1, 1, 0); - de.tudresden.inf.st.mquat.generator.ScenarioGenerator sc = new de.tudresden.inf.st.mquat.generator.ScenarioGenerator( - SCENARIO_DESCRIPTION); - - Opt4jModule.setModel(sc.generate()); - - EvolutionaryAlgorithmModule ea = new EvolutionaryAlgorithmModule(); - ea.setGenerations(100000); - - // set population size - ea.setAlpha(100); - - Opt4jModule testModule = new Opt4jModule(); - - TreeCrossoverOperatorModule crossover = new TreeCrossoverOperatorModule(); - TreeMutateOperatorModule mutate = new TreeMutateOperatorModule(); - TreeCopyOperatorModule copy = new TreeCopyOperatorModule(); - - // testModule.setFunction(JohannesModule.Function.dtlz); - ViewerModule viewer = new ViewerModule(); - viewer.isCloseOnStop(); - - Opt4JTask task = new Opt4JTask(false); - task.init(ea, testModule, viewer, crossover, mutate, copy); - try { - task.execute(); - Archive archive = task.getInstance(Archive.class); - for (Individual individual : archive) { - // obtain the phenotype and objective, etc. of each individual - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - task.close(); - } - } - @Override protected void configure() { bindProblem(Opt4jCreator.class, Opt4jDecoder.class, Opt4jEvaluator.class); diff --git a/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleHandwrittenTest.java b/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticHandwrittenTest.java similarity index 74% rename from jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleHandwrittenTest.java rename to jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticHandwrittenTest.java index 380e0ad..22271ab 100644 --- a/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleHandwrittenTest.java +++ b/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticHandwrittenTest.java @@ -2,7 +2,7 @@ package de.tudresden.inf.st.mquat.solving; import de.tudresden.inf.st.mquat.solving.genetic.GeneticSolver; -public class SimpleHandwrittenTest extends HandwrittenTestSuite { +public class GeneticHandwrittenTest extends HandwrittenTestSuite { @Override protected Solver getSolver() { diff --git a/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleSolverTest.java b/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticSolverTest.java similarity index 89% rename from jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleSolverTest.java rename to jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticSolverTest.java index 1af1407..9cc7a26 100644 --- a/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleSolverTest.java +++ b/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticSolverTest.java @@ -11,20 +11,20 @@ import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -public class SimpleSolverTest { +public class GeneticSolverTest { private static Logger logger; @BeforeClass public static void initLogger() { - logger = LogManager.getLogger(SimpleSolverTest.class); + logger = LogManager.getLogger(GeneticSolverTest.class); } /** * tests the genetic solver with one very genetic use case */ @Test - public void testSimpleSolver() throws SolvingException { + public void testGeneticSolver() throws SolvingException { int tlc = 1; int iac = 2; int isd = 0; diff --git a/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/HandwrittenTestSuite.java b/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/HandwrittenTestSuite.java index dbae9d3..7307227 100644 --- a/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/HandwrittenTestSuite.java +++ b/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/HandwrittenTestSuite.java @@ -14,6 +14,7 @@ import java.util.Iterator; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public abstract class HandwrittenTestSuite { private static Logger logger; @@ -141,6 +142,7 @@ public abstract class HandwrittenTestSuite { public void test_05() throws IOException, Parser.Exception, SolvingException { Tuple<Root, Solution> modelAndSolution = loadAndSolve("test_05.txt"); assertValidSolution(modelAndSolution); + assertTrue(modelAndSolution.getSecondElement().isValid()); Assignment configA = assertAssignment(modelAndSolution, 0, "configA0", "r0"); Assignment configB = assertAssignment(modelAndSolution, 0, "configB0", "r1"); Assignment configC = assertAssignment(modelAndSolution, 0, "configC0", "r4"); -- GitLab