NeatChromosomeRandomMutationHandler.java

package net.bmahe.genetics4j.neat.mutation.chromosome;

import java.util.List;
import java.util.Objects;
import java.util.random.RandomGenerator;

import net.bmahe.genetics4j.core.spec.mutation.RandomMutation;
import net.bmahe.genetics4j.neat.Connection;
import net.bmahe.genetics4j.neat.chromosomes.NeatChromosome;

/**
 * Mutation handler that applies random weight replacement to NEAT chromosomes using the core
 * {@link RandomMutation} policy. Each mutated connection receives a new weight sampled uniformly
 * from the chromosome's valid weight range.
 *
 * <p>For distribution-controlled weight mutation (e.g. Gaussian perturbation, configurable
 * perturbation ratio), use {@link net.bmahe.genetics4j.neat.spec.mutation.NeatConnectionWeight}
 * with {@link NeatChromosomeConnectionWeightMutationHandler} instead.
 */
public class NeatChromosomeRandomMutationHandler
		extends AbstractNeatChromosomeConnectionMutationHandler<RandomMutation>
{

	public NeatChromosomeRandomMutationHandler(final RandomGenerator _randomGenerator) {
		super(RandomMutation.class, _randomGenerator);
	}

	@Override
	protected List<Connection> mutateConnection(final RandomMutation randomMutation, final NeatChromosome neatChromosome,
			final Connection oldConnection, final int i) {
		Objects.requireNonNull(randomMutation);
		Objects.requireNonNull(neatChromosome);
		Objects.requireNonNull(oldConnection);

		final var connectionBuilder = Connection.builder().from(oldConnection);

		final var minValue = neatChromosome.getMinWeightValue();
		final var maxValue = neatChromosome.getMaxWeightValue();

		final var randomGenerator = getRandomGenerator();

		float newWeight = randomGenerator.nextFloat(maxValue - minValue) + minValue;
		connectionBuilder.weight(newWeight);
		return List.of(connectionBuilder.build());
	}
}