From 8b6f53bb83e7e130b3ab4f0b1b72e63556944e24 Mon Sep 17 00:00:00 2001 From: yunhaoz Date: Wed, 16 Jul 2025 22:33:04 +0800 Subject: [PATCH] modify for MAP-Elite Algorithm --- openevolve/config.py | 3 ++- openevolve/database.py | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/openevolve/config.py b/openevolve/config.py index df859f146c..a870c9ce13 100644 --- a/openevolve/config.py +++ b/openevolve/config.py @@ -166,7 +166,8 @@ class DatabaseConfig: diversity_metric: str = "edit_distance" # Options: "edit_distance", "feature_based" # Feature map dimensions for MAP-Elites - feature_dimensions: List[str] = field(default_factory=lambda: ["score", "complexity"]) + # feature_dimensions: List[str] = field(default_factory=lambda: ["score", "complexity"]) + feature_dimensions: List[str] = field(default_factory=lambda: ["complexity"]) feature_bins: int = 10 # Migration parameters for island-based evolution diff --git a/openevolve/database.py b/openevolve/database.py index 2942ee873b..3893ad3aec 100644 --- a/openevolve/database.py +++ b/openevolve/database.py @@ -105,7 +105,8 @@ def __init__(self, config: DatabaseConfig): # Feature grid for MAP-Elites self.feature_map: Dict[str, str] = {} - self.feature_bins = config.feature_bins + self.feature_bins = max(config.feature_bins, + int(pow(config.archive_size, 1 / len(config.feature_dimensions)) + 0.99)) # Island populations self.islands: List[Set[str]] = [set() for _ in range(config.num_islands)] @@ -210,6 +211,11 @@ def add( existing_fitness = safe_numeric_average(existing_program.metrics) logger.info("MAP-Elites cell improved: %s (fitness: %.3f -> %.3f)", coords_dict, existing_fitness, new_fitness) + + # use MAP-Elites to manage archive + if existing_program_id in self.archive: + self.archive.discard(existing_program_id) + self.archive.add(program.id) self.feature_map[feature_key] = program.id