Evolver is a Java framework that formulates the automatic configuration of multi-objective metaheuristics as a multi-objective optimization problem and solves it using the same class of algorithms — a meta-optimization approach. It relies on the jMetal framework for optimization problems, algorithms, and quality indicators.
Meta-level Optimizer (e.g., MetaNSGAII)
└─> AbstractMetaOptimizationProblem
├─> MetaOptimizationProblem (flat double encoding)
└─> TreeMetaOptimizationProblem (derivation tree encoding)
└─> Base-level Algorithm (runs with the decoded configuration)
└─> Training Set of Problems (ZDT, WFG, DTLZ, RE, RWA…)
The meta-optimizer treats parameter configurations as solutions and their quality indicator values on a training set as objectives to minimize.
The flow is:
- The meta-optimizer generates configurations for a base-level algorithm.
- Each configuration is evaluated using quality indicators (Epsilon, Hypervolume, …) as objectives.
- The process repeats until the stopping criterion is met.
- Automated configuration — finds accurate parameter settings for metaheuristics automatically.
- Flexible architecture — supports various metaheuristics at both base and meta levels, with multiple encodings (Double, Binary, Permutation).
- Multi-objective meta-level — optimizes multiple quality indicators simultaneously.
- YAML parameter spaces — parameter spaces are defined in YAML and loaded via
YAMLParameterSpace. - Derivation tree encoding — models configurations as derivation trees, eliminating the inactive-variable problem of flat encodings. Includes typed subtree crossover (STGP) and a tree mutation operator.
- irace integration — base-level configuration search can also be performed with irace.
Configurable parameters per algorithm and encoding, shown as total (top-level):
| Algorithm | Double | Binary | Permutation |
|---|---|---|---|
| NSGA-II | 32 (5) | 12 (5) | 12 (5) |
| NSGA-III | 32 (5) | — | — |
| MOEA/D | 40 (8) | 17 (8) | 17 (8) |
| SMS-EMOA | 28 (4) | 9 (4) | 9 (4) |
| MOPSO | 41 (14) | — | — |
| RDEMOEA | 40 (8) | — | 20 (8) |
| RVEA | 28 (4) | — | — |
| AGE-MOEA | 33 (6) | — | — |
| SSMOEA | 43 (6) | — | — |
| PAES | 14 (4) | 6 (4) | 6 (4) |
The figure is the number of configurable parameters (flattened, including conditional
sub-parameters — i.e. the search-space dimensionality); the value in parentheses is the number of
top-level parameters. — means the encoding is not available. Counts are derived from the YAML
parameter spaces in src/main/resources/parameterSpaces/ (snapshot as of 2026-06-22; regenerate if
the spaces change).
- NSGA-II
- Async NSGA-II
- Async Genetic Algorithm
- SMPSO
- SPEA2
- Random Search
- Java 21+
- Maven 3.6+
The core framework needs nothing else. Python is optional, required only to generate analysis figures and HTML validation reports — see Analysis and reports.
git clone https://github.com/jMetal/Evolver.git
cd Evolver
mvn clean install# Unit tests
mvn test
# Integration tests
mvn integration-test
# All tests
mvn verifyThe following example configures NSGA-II (base level) for DTLZ1 using NSGA-II as meta-optimizer.
// 1. Define the YAML parameter space and the training set
var parameterSpace = new YAMLParameterSpace("NSGAIIDouble.yaml", new DoubleParameterFactory());
List<Problem<DoubleSolution>> trainingSet = List.of(new DTLZ1());
List<String> referenceFronts = List.of("resources/referenceFronts/DTLZ1.3D.csv");
// 2. Set up the base-level algorithm to configure
var indicators = List.of(new Epsilon(), new NormalizedHypervolume());
var baseAlgorithm = new DoubleNSGAII(100, parameterSpace);
EvaluationBudgetStrategy budget = new FixedEvaluationsStrategy(List.of(15000));
// 3. Create the meta-optimization problem
MetaOptimizationProblem<DoubleSolution> problem =
new MetaOptimizationProblem<>(baseAlgorithm, trainingSet, referenceFronts, indicators, budget, 1);
// 4. Build and run the meta-optimizer
EvolutionaryAlgorithm<DoubleSolution> metaNSGAII =
new MetaNSGAIIBuilder(problem, parameterSpace)
.setMaxEvaluations(2000)
.setNumberOfCores(8)
.build();
var outputResults = new OutputResults("NSGA-II", problem, "DTLZ1", indicators, "RESULTS/NSGAII/DTLZ1");
metaNSGAII.observable().register(new WriteExecutionDataToFilesObserver(1, outputResults));
metaNSGAII.run();After running, the best configuration is written to the output folder as a VAR.*.txt file.
See the examples in org.uma.evolver.example for complete runnable code.
Algorithm parameter spaces are defined in YAML files under
src/main/resources/parameterSpaces/ (e.g., NSGAIIDouble.yaml).
Pre-tuned default configurations live in
src/main/resources/defaultConfigurations/.
The Java side writes results as CSV files (e.g., FUN.csv from the validation runners in
org.uma.evolver.example.validation). Turning those into figures and HTML reports uses the Python
scripts in scripts/:
# Option A — conda (creates the 'evolver' environment)
conda env create -f environment.yml
conda activate evolver
# Option B — virtualenv
python -m venv .venv
source .venv/bin/activate
pip install -r scripts/requirements.txtSee scripts/README.md for the available analyses.
Full documentation is available at https://evolver.readthedocs.io, including:
- Installation guide
- Quick start and examples
- Concepts (parameter spaces, evaluation strategies, base-level and meta-level metaheuristics)
- API reference
- irace integration
- FAQ and glossary
If you use Evolver in your research, please cite:
@article{AND23,
title = {Evolver: Meta-optimizing multi-objective metaheuristics},
journal = {SoftwareX},
volume = {23},
pages = {101551},
year = {2024},
issn = {2352-7110},
doi = {10.1016/j.softx.2023.101551},
}- Add derivation tree encoding (
org.uma.evolver.encoding):DerivationTreeSolution,TreeNode,SubtreeCrossover(STGP),TreeMutation,TreeMetaOptimizationProblem,TreeSolutionGenerator, andGrammarConverter. - Add configurable NSGA-III, RVEA, AGE-MOEA, SSMOEA, and PAES.
- Add Binary and Permutation encodings for MOEA/D, SMS-EMOA, and PAES.
- Add Async Genetic Algorithm and Random Search meta-optimizers.
- Add
ConfigurationFileReaderto read algorithm configurations from text files. - Remove hard-coded parameter space classes; all parameter spaces now use
YAMLParameterSpace. - Restructure package layout:
algorithm,meta,trainingset,irace,example.
- Complete rewrite of the original Evolver framework.
- New architecture for improved flexibility and maintainability.
- Enhanced support for meta-optimization of multi-objective metaheuristics.
- Improved documentation and examples.
This project is licensed under the GNU General Public License — see the LICENSE file for details.