View Javadoc
1   package net.bmahe.genetics4j.neat.mutation.chromosome;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   import java.util.Objects;
6   import java.util.random.RandomGenerator;
7   
8   import org.apache.commons.lang3.Validate;
9   import org.apache.logging.log4j.LogManager;
10  import org.apache.logging.log4j.Logger;
11  
12  import net.bmahe.genetics4j.core.chromosomes.Chromosome;
13  import net.bmahe.genetics4j.core.mutation.chromosome.ChromosomeMutationHandler;
14  import net.bmahe.genetics4j.core.spec.chromosome.ChromosomeSpec;
15  import net.bmahe.genetics4j.core.spec.mutation.MutationPolicy;
16  import net.bmahe.genetics4j.neat.Connection;
17  import net.bmahe.genetics4j.neat.chromosomes.NeatChromosome;
18  import net.bmahe.genetics4j.neat.spec.NeatChromosomeSpec;
19  import net.bmahe.genetics4j.neat.spec.mutation.DeleteConnection;
20  
21  public class NeatChromosomeDeleteConnection implements ChromosomeMutationHandler<NeatChromosome> {
22  
23  	public static final Logger logger = LogManager.getLogger(NeatChromosomeDeleteConnection.class);
24  
25  	private final RandomGenerator randomGenerator;
26  
27  	public NeatChromosomeDeleteConnection(final RandomGenerator _randomGenerator) {
28  		Objects.requireNonNull(_randomGenerator);
29  
30  		this.randomGenerator = _randomGenerator;
31  	}
32  
33  	@Override
34  	public boolean canHandle(final MutationPolicy mutationPolicy, final ChromosomeSpec chromosome) {
35  		Objects.requireNonNull(mutationPolicy);
36  		Objects.requireNonNull(chromosome);
37  
38  		return mutationPolicy instanceof DeleteConnection && chromosome instanceof NeatChromosomeSpec;
39  	}
40  
41  	@Override
42  	public NeatChromosome mutate(final MutationPolicy mutationPolicy, final Chromosome chromosome) {
43  		Objects.requireNonNull(mutationPolicy);
44  		Objects.requireNonNull(chromosome);
45  		Validate.isInstanceOf(DeleteConnection.class, mutationPolicy);
46  		Validate.isInstanceOf(NeatChromosome.class, chromosome);
47  
48  		final var neatChromosome = (NeatChromosome) chromosome;
49  		final var minValue = neatChromosome.getMinWeightValue();
50  		final var maxValue = neatChromosome.getMaxWeightValue();
51  
52  		final var oldConnections = neatChromosome.getConnections();
53  		final List<Connection> newConnections = new ArrayList<>(oldConnections);
54  
55  		if (oldConnections.isEmpty() == false) {
56  			final int connectionToDeleteIndex = randomGenerator.nextInt(oldConnections.size());
57  			newConnections.remove(connectionToDeleteIndex);
58  		}
59  
60  		return new NeatChromosome(neatChromosome.getNodeLayout(), minValue, maxValue, newConnections);
61  	}
62  }