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.random.RandomGenerator;
6   
7   import net.bmahe.genetics4j.core.spec.mutation.RandomMutation;
8   import net.bmahe.genetics4j.neat.Connection;
9   import net.bmahe.genetics4j.neat.chromosomes.NeatChromosome;
10  
11  /**
12   * Mutation handler that applies random weight replacement to NEAT chromosomes using the core
13   * {@link RandomMutation} policy. Each mutated connection receives a new weight sampled uniformly
14   * from the chromosome's valid weight range.
15   *
16   * <p>For distribution-controlled weight mutation (e.g. Gaussian perturbation, configurable
17   * perturbation ratio), use {@link net.bmahe.genetics4j.neat.spec.mutation.NeatConnectionWeight}
18   * with {@link NeatChromosomeConnectionWeightMutationHandler} instead.
19   */
20  public class NeatChromosomeRandomMutationHandler
21  		extends AbstractNeatChromosomeConnectionMutationHandler<RandomMutation>
22  {
23  
24  	public NeatChromosomeRandomMutationHandler(final RandomGenerator _randomGenerator) {
25  		super(RandomMutation.class, _randomGenerator);
26  	}
27  
28  	@Override
29  	protected List<Connection> mutateConnection(final RandomMutation randomMutation, final NeatChromosome neatChromosome,
30  			final Connection oldConnection, final int i) {
31  		Objects.requireNonNull(randomMutation);
32  		Objects.requireNonNull(neatChromosome);
33  		Objects.requireNonNull(oldConnection);
34  
35  		final var connectionBuilder = Connection.builder().from(oldConnection);
36  
37  		final var minValue = neatChromosome.getMinWeightValue();
38  		final var maxValue = neatChromosome.getMaxWeightValue();
39  
40  		final var randomGenerator = getRandomGenerator();
41  
42  		float newWeight = randomGenerator.nextFloat(maxValue - minValue) + minValue;
43  		connectionBuilder.weight(newWeight);
44  		return List.of(connectionBuilder.build());
45  	}
46  }