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 62f5f0a3fdec531acab281180a79e9f0fa9add89
parent 30338046d9c1c07e54e6e78bd266e9955befd136
Author: Kevin Corvisier <git@kevincorvisier.fr>
Date:   Thu, 19 Dec 2024 12:17:40 +0900

Make Selection.select return a Pair instead of a List

Diffstat:
Msrc/main/java/fr/kevincorvisier/mtg/gdb/operators/selection/Selection.java | 6+++---
Msrc/main/java/fr/kevincorvisier/mtg/gdb/population/NextGenerationService.java | 9++++-----
2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/src/main/java/fr/kevincorvisier/mtg/gdb/operators/selection/Selection.java b/src/main/java/fr/kevincorvisier/mtg/gdb/operators/selection/Selection.java @@ -1,6 +1,6 @@ package fr.kevincorvisier.mtg.gdb.operators.selection; -import java.util.List; +import org.apache.commons.math3.util.Pair; import fr.kevincorvisier.mtg.gdb.population.Individual; import fr.kevincorvisier.mtg.gdb.population.Population; @@ -10,7 +10,7 @@ public abstract class Selection /** * Select two individuals from a population for reproduction */ - public List<Individual> select(final Population population) + public Pair<Individual, Individual> select(final Population population) { final Individual parent1 = selectOne(population); Individual parent2; @@ -21,7 +21,7 @@ public abstract class Selection parent2 = selectOne(population); } while (parent1 == parent2); - return List.of(parent1, parent2); + return Pair.create(parent1, parent2); } protected abstract Individual selectOne(final Population population); diff --git a/src/main/java/fr/kevincorvisier/mtg/gdb/population/NextGenerationService.java b/src/main/java/fr/kevincorvisier/mtg/gdb/population/NextGenerationService.java @@ -2,9 +2,8 @@ package fr.kevincorvisier.mtg.gdb.population; import java.util.Collection; import java.util.HashSet; -import java.util.List; -import java.util.stream.Collectors; +import org.apache.commons.math3.util.Pair; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -80,11 +79,11 @@ public class NextGenerationService while (next.getSize() < maximumSize) { // Selection - final List<Individual> parents = selection.select(population); - final double estimatedFitness = parents.stream().collect(Collectors.averagingDouble(Individual::getFitness)); + final Pair<Individual, Individual> parents = selection.select(population); + final double estimatedFitness = (parents.getFirst().getFitness() + parents.getSecond().getFitness()) / 2d; // Crossover - for (final Individual child : crossover.crossover(parents.get(0), parents.get(1))) + for (final Individual child : crossover.crossover(parents.getFirst(), parents.getSecond())) { if (result.size() >= maximumSize) continue; // Ensure second child will not breach the population limit