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:
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