View Javadoc
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  }