/* * Artificial Intelligence for Humans * Volume 2: Nature Inspired Algorithms * Java Version * http://www.aifh.org * http://www.jeffheaton.com * * Code repository: * https://github.com/jeffheaton/aifh * * Copyright 2014 by Jeff Heaton * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * For more information on Heaton Research copyrights, licenses * and trademarks visit: * http://www.heatonresearch.com/copyright */ package com.heatonresearch.aifh.examples.operations; import com.heatonresearch.aifh.evolutionary.population.BasicPopulation; import com.heatonresearch.aifh.evolutionary.population.Population; import com.heatonresearch.aifh.evolutionary.train.EvolutionaryAlgorithm; import com.heatonresearch.aifh.evolutionary.train.basic.BasicEA; import com.heatonresearch.aifh.genetic.crossover.Splice; import com.heatonresearch.aifh.genetic.crossover.SpliceNoRepeat; import com.heatonresearch.aifh.genetic.genome.IntegerArrayGenome; import com.heatonresearch.aifh.genetic.genome.IntegerArrayGenomeFactory; import com.heatonresearch.aifh.learning.MLMethod; import com.heatonresearch.aifh.learning.score.ScoreFunction; import com.heatonresearch.aifh.randomize.GenerateRandom; import com.heatonresearch.aifh.randomize.MersenneTwisterGenerateRandom; import java.util.Arrays; /** * This example demonstrates crossover using a splice operator. Both the repeat and non-repeat * variants are shown. * <p/> * Sample output: * <p/> * Crossover Splice * Parent 1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * Parent 2: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] * Offspring 1: [1, 2, 3, 7, 6, 5, 4, 3, 2, 10] * Offspring 2: [10, 9, 8, 4, 5, 6, 7, 8, 9, 1] * Crossover Splice No Repeat * Parent 1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * Parent 2: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] * Offspring 1: [1, 8, 9, 7, 6, 5, 4, 3, 2, 10] * Offspring 2: [10, 3, 2, 4, 5, 6, 7, 8, 9, 1] */ public class CrossoverExample { /** * Demonstrate the crossover splice operator. Two offspring will be created by swapping three * segments of the parents (two cut points). Some genes may repeat. */ public static void splice() { System.out.println("Crossover Splice"); // Create a random number generator GenerateRandom rnd = new MersenneTwisterGenerateRandom(); // Create a new population. Population pop = new BasicPopulation(); pop.setGenomeFactory(new IntegerArrayGenomeFactory(10)); // Create a trainer with a very simple score function. We do not care // about the calculation of the score, as they will never be calculated. EvolutionaryAlgorithm train = new BasicEA(pop, new ScoreFunction() { @Override public double calculateScore(MLMethod method) { return 0; } @Override public boolean shouldMinimize() { return false; } }); // Create a splice operator, length = 5. Use it 1.0 (100%) of the time. Splice opp = new Splice(5); train.addOperation(1.0, opp); // Create two parents, the genes are set to 1,2,3,4,5,7,8,9,10 // and 10,9,8,7,6,5,4,3,2,1. IntegerArrayGenome[] parents = new IntegerArrayGenome[2]; parents[0] = (IntegerArrayGenome) pop.getGenomeFactory().factor(); parents[1] = (IntegerArrayGenome) pop.getGenomeFactory().factor(); for (int i = 1; i <= 10; i++) { parents[0].getData()[i - 1] = i; parents[1].getData()[i - 1] = 11 - i; } // Create an array to hold the offspring. IntegerArrayGenome[] offspring = new IntegerArrayGenome[2]; // Perform the operation opp.performOperation(rnd, parents, 0, offspring, 0); // Display the results System.out.println("Parent 1: " + Arrays.toString(parents[0].getData())); System.out.println("Parent 2: " + Arrays.toString(parents[1].getData())); System.out.println("Offspring 1: " + Arrays.toString(offspring[0].getData())); System.out.println("Offspring 2: " + Arrays.toString(offspring[1].getData())); } /** * Demonstrate the crossover splice operator (no repeat). Two offspring will be created by * swapping three segments of the parents (two cut points). No repeated genes allowed per offspring. */ public static void spliceNoRepeat() { System.out.println("Crossover Splice No Repeat"); // Create a random number generator GenerateRandom rnd = new MersenneTwisterGenerateRandom(); // Create a new population. Population pop = new BasicPopulation(); pop.setGenomeFactory(new IntegerArrayGenomeFactory(10)); // Create a trainer with a very simple score function. We do not care // about the calculation of the score, as they will never be calculated. EvolutionaryAlgorithm train = new BasicEA(pop, new ScoreFunction() { @Override public double calculateScore(MLMethod method) { return 0; } @Override public boolean shouldMinimize() { return false; } }); // Create a splice (no repeat) operator, length = 5. Use it 1.0 (100%) of the time. SpliceNoRepeat opp = new SpliceNoRepeat(5); train.addOperation(1.0, opp); // Create two parents, the genes are set to 1,2,3,4,5,7,8,9,10 // and 10,9,8,7,6,5,4,3,2,1. IntegerArrayGenome[] parents = new IntegerArrayGenome[2]; parents[0] = (IntegerArrayGenome) pop.getGenomeFactory().factor(); parents[1] = (IntegerArrayGenome) pop.getGenomeFactory().factor(); for (int i = 1; i <= 10; i++) { parents[0].getData()[i - 1] = i; parents[1].getData()[i - 1] = 11 - i; } // Create an array to hold the offspring. IntegerArrayGenome[] offspring = new IntegerArrayGenome[2]; // Perform the operation opp.performOperation(rnd, parents, 0, offspring, 0); // Display the results System.out.println("Parent 1: " + Arrays.toString(parents[0].getData())); System.out.println("Parent 2: " + Arrays.toString(parents[1].getData())); System.out.println("Offspring 1: " + Arrays.toString(offspring[0].getData())); System.out.println("Offspring 2: " + Arrays.toString(offspring[1].getData())); } /** * Main entry point. * * @param args Not used. */ public static void main(String[] args) { splice(); spliceNoRepeat(); } }