1 package net.bmahe.genetics4j.neat.mutation.chromosome;
2
3 import java.util.List;
4 import java.util.Objects;
5 import java.util.function.Supplier;
6 import java.util.random.RandomGenerator;
7
8 import net.bmahe.genetics4j.core.spec.mutation.CreepMutation;
9 import net.bmahe.genetics4j.core.spec.statistics.distributions.Distribution;
10 import net.bmahe.genetics4j.core.util.DistributionUtils;
11 import net.bmahe.genetics4j.neat.Connection;
12 import net.bmahe.genetics4j.neat.chromosomes.NeatChromosome;
13
14 public class NeatChromosomeCreepMutationHandler extends AbstractNeatChromosomeConnectionMutationHandler<CreepMutation> {
15
16 public NeatChromosomeCreepMutationHandler(final RandomGenerator _randomGenerator) {
17 super(CreepMutation.class, _randomGenerator);
18 }
19
20 @Override
21 protected List<Connection> mutateConnection(final CreepMutation creepMutation, final NeatChromosome neatChromosome,
22 final Connection oldConnection, final int i) {
23 Objects.requireNonNull(creepMutation);
24 Objects.requireNonNull(neatChromosome);
25 Objects.requireNonNull(oldConnection);
26
27 final var connectionBuilder = Connection.builder().from(oldConnection);
28
29 final var minValue = neatChromosome.getMinWeightValue();
30 final var maxValue = neatChromosome.getMaxWeightValue();
31
32 final var randomGenerator = getRandomGenerator();
33 final Distribution distribution = creepMutation.distribution();
34
35 final Supplier<Float> distributionValueSupplier = DistributionUtils
36 .distributionFloatValueSupplier(randomGenerator, minValue, maxValue, distribution);
37
38 float newWeight = neatChromosome.getConnections().get(i).weight();
39 newWeight += distributionValueSupplier.get();
40 if (newWeight > maxValue) {
41 newWeight = maxValue;
42 } else if (newWeight < minValue) {
43 newWeight = minValue;
44 }
45 connectionBuilder.weight(newWeight);
46
47 return List.of(connectionBuilder.build());
48 }
49 }