From 6b6031a9dda876041946ef3ea56c8b064f4c04bd Mon Sep 17 00:00:00 2001 From: "T.J. Gaffney" Date: Wed, 1 Jan 2025 22:06:43 -0600 Subject: [PATCH 1/2] Simplify moran mutate function --- axelrod/moran.py | 33 +++++++++------------------------ 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/axelrod/moran.py b/axelrod/moran.py index b5e3ffbe8..d476cfaa4 100644 --- a/axelrod/moran.py +++ b/axelrod/moran.py @@ -122,20 +122,6 @@ def __init__( self._random = RandomGenerator(seed=seed) self._bulk_random = BulkRandomGenerator(self._random.random_seed_int()) self.set_players() - # Build the set of mutation targets - # Determine the number of unique types (players) - keys = set([str(p) for p in players]) - # Create a dictionary mapping each type to a set of representatives - # of the other types - d = dict() - for p in players: - d[str(p)] = p - mutation_targets = dict() - for key in sorted(keys): - mutation_targets[key] = [ - v for (k, v) in sorted(d.items()) if k != key - ] - self.mutation_targets = mutation_targets if interaction_graph is None: interaction_graph = complete_graph(len(players), loops=False) @@ -218,16 +204,15 @@ def mutate(self, index: int) -> Player: return self.players[index].mutate() # Assuming mutation_method == "transition" - if self.mutation_rate > 0: - # Choose another strategy at random from the initial population - r = self._random.random() - if r < self.mutation_rate: - s = str(self.players[index]) - j = self._random.randrange(0, len(self.mutation_targets[s])) - p = self.mutation_targets[s][j] - return p.clone() - # Just clone the player - return self.players[index].clone() + if self._random.random() > self.mutation_rate: + # Just clone the player + return self.players[index].clone() + + # Choose another strategy at random from the initial population + player = None + while player is None or str(player) == str(self.players[index]): + player = self._random.choice(self.initial_players) + return player.clone() def death(self, index: int = None) -> int: """ From 3f0cf2f35c79acf1c34ac2113ac55dcf086e63e7 Mon Sep 17 00:00:00 2001 From: "T.J. Gaffney" Date: Mon, 6 Jan 2025 21:33:00 -0600 Subject: [PATCH 2/2] Dedupe mutation targets --- axelrod/moran.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/axelrod/moran.py b/axelrod/moran.py index d476cfaa4..0cd102aad 100644 --- a/axelrod/moran.py +++ b/axelrod/moran.py @@ -122,6 +122,12 @@ def __init__( self._random = RandomGenerator(seed=seed) self._bulk_random = BulkRandomGenerator(self._random.random_seed_int()) self.set_players() + + # Dedupe initial players as mutation targets + initial_players_by_name = { + player.name: player for player in self.initial_players + } + self.mutation_targets = [pi for pi in initial_players_by_name.values()] if interaction_graph is None: interaction_graph = complete_graph(len(players), loops=False) @@ -211,7 +217,7 @@ def mutate(self, index: int) -> Player: # Choose another strategy at random from the initial population player = None while player is None or str(player) == str(self.players[index]): - player = self._random.choice(self.initial_players) + player = self._random.choice(self.mutation_targets) return player.clone() def death(self, index: int = None) -> int: