mtg-genetic-deckbuilding

Generating and improving Magic: The Gathering decks using a genetic algorithm
git clone https://kevincorvisier.fr/git/mtg-genetic-deckbuilding.git
Log | Files | Refs | LICENSE

commit a29bade4b15a1d458cdcb784b0ed95f3e0da9626
parent a112a9cec219ecddb31bad9a581001543369294b
Author: Kevin Corvisier <git@kevincorvisier.fr>
Date:   Thu,  9 Jan 2025 18:46:03 +0900

Use previously computed fitness as estimated fitness when no crossover
is done
Diffstat:
Msrc/main/java/fr/kevincorvisier/mtg/gdb/population/NextGenerationService.java | 11++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/main/java/fr/kevincorvisier/mtg/gdb/population/NextGenerationService.java b/src/main/java/fr/kevincorvisier/mtg/gdb/population/NextGenerationService.java @@ -108,15 +108,20 @@ public class NextGenerationService { // Selection Pair<Individual, Individual> pair = selection.select(population); - final double estimatedFitness = (pair.getFirst().getFitness() + pair.getSecond().getFitness()) / 2d; + final Pair<Double, Double> estimatedFitness; // Crossover if (rnd.nextDouble() < crossoverRate) { + final double averageParentFitness = (pair.getFirst().getFitness() + pair.getSecond().getFitness()) / 2d; + estimatedFitness = Pair.create(averageParentFitness, averageParentFitness); + pair = crossover.crossover(pair.getFirst(), pair.getSecond()); } else { + estimatedFitness = Pair.create(pair.getFirst().getFitness(), pair.getSecond().getFitness()); + pair = Pair.create(new Individual(individualNameGenerator.createName() + "_" + pair.getFirst().getName(), pair.getFirst().getDeck()), new Individual(individualNameGenerator.createName() + "_" + pair.getSecond().getName(), pair.getSecond().getDeck())); } @@ -124,8 +129,8 @@ public class NextGenerationService // Mutation if (rnd.nextDouble() < mutationRate) { - mutation.mutate(pair.getFirst(), estimatedFitness); - mutation.mutate(pair.getSecond(), estimatedFitness); + mutation.mutate(pair.getFirst(), estimatedFitness.getFirst()); + mutation.mutate(pair.getSecond(), estimatedFitness.getSecond()); } for (final Individual individual : new Individual[] { pair.getFirst(), pair.getSecond() })