From f1fd284ff11ef7177dd661024487f523c7cf825e Mon Sep 17 00:00:00 2001 From: "Bernhard J. Berger" <bernhard.berger@uni-bremen.de> Date: Mon, 6 Feb 2023 15:30:12 +0100 Subject: [PATCH] Changed OL configuration to support different optimisation algortithms in the future. --- .../api/search/OptimisationAlgorithm.java | 22 +++++++++++++++++++ .../search/EvolutionaryAlgorithmSearch.java} | 17 +++++++++----- .../search/HeuristicSearchEvaluation.java | 3 ++- .../core/main/search/HeuristicSearchMain.java | 10 ++++++++- .../src/main/java/module-info.java | 3 +++ 5 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 src/core/de.evoal.core/src/main/java/de/evoal/core/api/search/OptimisationAlgorithm.java rename src/core/de.evoal.core/src/main/java/de/evoal/core/main/{search/HeuristicSearch.java => ea/search/EvolutionaryAlgorithmSearch.java} (91%) diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/search/OptimisationAlgorithm.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/search/OptimisationAlgorithm.java new file mode 100644 index 00000000..eb738cc1 --- /dev/null +++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/search/OptimisationAlgorithm.java @@ -0,0 +1,22 @@ +package de.evoal.core.api.search; + +import de.evoal.languages.model.instance.Instance; + +/** + * Interface for all optimisation algorithms. + */ +public interface OptimisationAlgorithm { + /** + * Initialises the algorithm based on the given configuration. + * + * @param instance The configuration to use. + * + * @return The algrithm itself. + */ + public OptimisationAlgorithm init(final Instance instance); + + /** + * Does the actual optimisation. + */ + public void run(); +} diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearch.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/search/EvolutionaryAlgorithmSearch.java similarity index 91% rename from src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearch.java rename to src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/search/EvolutionaryAlgorithmSearch.java index 42a66da6..cae62771 100644 --- a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearch.java +++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/search/EvolutionaryAlgorithmSearch.java @@ -1,4 +1,4 @@ -package de.evoal.core.main.search; +package de.evoal.core.main.ea.search; import java.io.File; import java.time.Duration; @@ -11,6 +11,7 @@ import de.evoal.core.api.board.Blackboard; import de.evoal.core.api.cdi.BlackboardValue; import de.evoal.core.api.cdi.ConfigurationValue; import de.evoal.core.api.ea.initial.InitialPopulation; +import de.evoal.core.api.search.OptimisationAlgorithm; import de.evoal.core.api.utils.LanguageHelper; import de.evoal.core.api.ea.fitness.comparator.FitnessValue; @@ -37,7 +38,8 @@ import javax.inject.Named; @Slf4j @Dependent -public class HeuristicSearch { +@Named("evolutionary-algorithm") +public class EvolutionaryAlgorithmSearch implements OptimisationAlgorithm { @Inject private Blackboard board; @@ -56,11 +58,11 @@ public class HeuristicSearch { private String run; @Inject - @ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.number_of_generations") + @ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.number-of-generations") private int numberOfGenerations; @Inject - @ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.size_of_population") + @ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.size-of-population") private int sizeOfPopulation; @Inject @@ -68,7 +70,7 @@ public class HeuristicSearch { private Boolean maximize; @Inject - @ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.maximum_age") + @ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm.maximum-age") private int maximumAge; private final Map<String, List<Alterer<?, FitnessValue>>> alterers = new HashMap<>(); @@ -100,6 +102,11 @@ public class HeuristicSearch { @Inject @Named("initial") private InitialPopulation initalStream; + @Override + public OptimisationAlgorithm init(de.evoal.languages.model.instance.Instance instance) { + return this; + } + public void run() { setup(); diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java index 42a8fe16..189f6d09 100644 --- a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java +++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchEvaluation.java @@ -12,6 +12,7 @@ import javax.enterprise.context.ApplicationScoped; import de.evoal.core.api.statistics.Column; import de.evoal.core.api.statistics.ColumnType; import de.evoal.core.api.statistics.WriterContext; +import de.evoal.core.main.ea.search.EvolutionaryAlgorithmSearch; import lombok.extern.slf4j.Slf4j; import org.apache.commons.math3.util.Pair; @@ -103,7 +104,7 @@ public class HeuristicSearchEvaluation implements MainClass { board.bind(BlackboardEntry.EVALUATION_RUN, run); context.bindColumn(runColumn, i); - BeanFactory.create(HeuristicSearch.class) + BeanFactory.create(EvolutionaryAlgorithmSearch.class) .run(); } } diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java index d75eae95..d7ab7f4a 100644 --- a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java +++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/search/HeuristicSearchMain.java @@ -3,12 +3,15 @@ package de.evoal.core.main.search; import de.evoal.core.api.board.Blackboard; import de.evoal.core.api.board.BlackboardEntry; import de.evoal.core.api.cdi.BeanFactory; +import de.evoal.core.api.cdi.ConfigurationValue; import de.evoal.core.api.cdi.MainClass; import de.evoal.core.api.properties.Properties; import javax.enterprise.context.ApplicationScoped; +import de.evoal.core.api.search.OptimisationAlgorithm; import de.evoal.core.api.statistics.ColumnType; import de.evoal.core.api.statistics.WriterContext; +import de.evoal.languages.model.instance.Instance; import org.apache.commons.math3.util.Pair; import javax.inject.Inject; @@ -25,6 +28,10 @@ public class HeuristicSearchMain implements MainClass { @Inject private WriterContext context; + @Inject + @ConfigurationValue(entry = BlackboardEntry.OPTIMISATION_CONFIGURATION, access = "algorithm") + private Instance algorithmConfiguration; + @Override public void run() { final String outputFolder = board.get(BlackboardEntry.EVALUATION_OUTPUT_FOLDER); @@ -38,7 +45,8 @@ public class HeuristicSearchMain implements MainClass { board.bind(BlackboardEntry.EVALUATION_OUTPUT_FOLDER, outputBaseDir); board.bind(BlackboardEntry.EVALUATION_RUN, "0"); - BeanFactory.create(HeuristicSearch.class) + BeanFactory.create(OptimisationAlgorithm.class) + .init(algorithmConfiguration) .run(); } diff --git a/src/core/de.evoal.core/src/main/java/module-info.java b/src/core/de.evoal.core/src/main/java/module-info.java index 139b49af..ccef2dd4 100644 --- a/src/core/de.evoal.core/src/main/java/module-info.java +++ b/src/core/de.evoal.core/src/main/java/module-info.java @@ -54,6 +54,7 @@ module de.evoal.core { exports de.evoal.core.api.properties.info; exports de.evoal.core.api.properties.io; exports de.evoal.core.api.properties.stream; + exports de.evoal.core.api.search; exports de.evoal.core.api.statistics; exports de.evoal.core.api.utils; @@ -96,4 +97,6 @@ module de.evoal.core { opens de.evoal.core.api.properties.info to weld.core.impl; opens de.evoal.core.api.ea.constraints.strategies to weld.core.impl; opens de.evoal.core.main.properties to weld.core.impl; + opens de.evoal.core.main.ea.search to weld.core.impl; + } -- GitLab