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 8ab4e34322bc582d8a2ab269f58466eb361fb4ec..fcc46c76c564aea942d201a426e0a1a81ecab4d6 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 bb07c4440f3397e44f8e7ee80ff8dd7e02b6e0dd..b89bb498d1ba81147e57d98d9f9dfccd6b80c4c9 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 26bfffdcf29a03a0207a286ee82c62ba101c7275..d4612e7eb8b56d9a5c839997df220d9033dd9a40 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 86f1ebc7915c2eafcf61b257f91f296678af4cd1..5fff25a053d85f763512784f4aa9719393e23ce1 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 380e0ad6f96789819b9a74b6fc6404cd2d8c1189..22271aba9ac871c67ed47e818e0fb5d262adb37e 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 1af14070cf7d8a1a44e190ef62eebc57615b185b..9cc7a2615c1033e47ab942167f71a08a236d021f 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 dbae9d35bb8a902914d39388205865054f5fbbb8..73072275cb9db130134ab2cae5e4f55adb6de65c 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");