/* * File: VectorizableCrossoverFunctionTest.java * Authors: Jonathan McClain * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright May 8, 2006, Sandia Corporation. Under the terms of Contract * DE-AC04-94AL85000, there is a non-exclusive license for use of this work by * or on behalf of the U.S. Government. Export of this program may require a * license from the United States Government. See CopyrightHistory.txt for * complete details. * */ package gov.sandia.cognition.learning.algorithm.genetic.reproducer; import gov.sandia.cognition.math.matrix.VectorFactory; import gov.sandia.cognition.math.matrix.Vectorizable; import gov.sandia.cognition.math.matrix.Vector; import java.util.Random; import junit.framework.TestCase; /** * This class implements JUnit tests for the following classes: * * VectorizableCrossoverFunction * * @author Jonathan McClain * @since 1.0 */ public class VectorizableCrossoverFunctionTest extends TestCase { /** The random number generator for the tests. */ private Random random = new Random(1); /** * Creates a new instance of VectorizableCrossoverFunctionTest. * * @param testName The name of the test. */ public VectorizableCrossoverFunctionTest( String testName) { super(testName); } /** * Test of crossover method, of class * gov.sandia.isrc.learning.reinforcement.VectorizableCrossoverFunction. */ public void testCrossover() { System.out.println("crossover"); Vector vector1 = VectorFactory.getDefault().createUniformRandom(10, -10, 10, random); Vector vectorizable1 = vector1.clone(); Vector vector2 = VectorFactory.getDefault().createUniformRandom(10, -10, 10, random); Vector vectorizable2 = vector2.clone(); double probabilityCrossover = 0.5; VectorizableCrossoverFunction vcf = new VectorizableCrossoverFunction( probabilityCrossover ); Vectorizable result1 = vcf.crossover(vectorizable1, vectorizable2); this.verifyCrossover(vectorizable1, vectorizable2, result1); Vectorizable result2 = vcf.crossover(vectorizable1, vectorizable2); this.verifyCrossover(vectorizable1, vectorizable2, result2); assertTrue( "Crossover produced the same result twice", !result1.convertToVector().equals(result2.convertToVector())); } /** * Verifies that the child is the result of crossing over the parents * correctly. Throws AssertionFailsErrors if incorrect. * * @param parent1 The first parent. * @param parent2 The second parent. * @param child The child. */ public void verifyCrossover( Vectorizable parent1, Vectorizable parent2, Vectorizable child) { Vector parentVector1 = parent1.convertToVector(); Vector parentVector2 = parent2.convertToVector(); Vector childVector = child.convertToVector(); assertTrue( "Parent size does not match child size", parentVector1.getDimensionality() == childVector.getDimensionality()); assertTrue( "Parent size does not match child size", parentVector2.getDimensionality() == childVector.getDimensionality()); for(int i = 0; i < parentVector1.getDimensionality(); i++) { assertTrue("A value was in the child that was not in the parents", (childVector.getElement(i) == parentVector1.getElement(i)) || (childVector.getElement(i) == parentVector2.getElement(i))); } } /** * Test of getProbabilityCrossover method, of class gov.sandia.isrc.learning.reinforcement.VectorizableCrossoverFunction. */ public void testGetProbabilityCrossover() { System.out.println("getProbabilityCrossover"); double probabilityCrossover = random.nextDouble(); VectorizableCrossoverFunction vcf = new VectorizableCrossoverFunction( probabilityCrossover ); assertEquals( probabilityCrossover, vcf.getProbabilityCrossover() ); } /** * Test of setProbabilityCrossover method, of class gov.sandia.isrc.learning.reinforcement.VectorizableCrossoverFunction. */ public void testSetProbabilityCrossover() { System.out.println("setProbabilityCrossover"); double probabilityCrossover = random.nextDouble(); VectorizableCrossoverFunction vcf = new VectorizableCrossoverFunction( probabilityCrossover ); assertEquals( probabilityCrossover, vcf.getProbabilityCrossover() ); probabilityCrossover = random.nextDouble(); assertTrue( probabilityCrossover != vcf.getProbabilityCrossover() ); vcf.setProbabilityCrossover( probabilityCrossover ); assertEquals( probabilityCrossover, vcf.getProbabilityCrossover() ); } /** * Test of getRandom method, of class gov.sandia.isrc.learning.genetic.reproducer.VectorizableCrossoverFunction. */ public void testGetRandom() { System.out.println("getRandom"); VectorizableCrossoverFunction instance = new VectorizableCrossoverFunction(); assertNotNull( instance.getRandom() ); } /** * Test of setRandom method, of class gov.sandia.isrc.learning.genetic.reproducer.VectorizableCrossoverFunction. */ public void testSetRandom() { System.out.println("setRandom"); Random r2 = new Random(2); VectorizableCrossoverFunction instance = new VectorizableCrossoverFunction(); assertNotNull( instance.getRandom() ); assertNotSame( r2, instance.getRandom() ); instance.setRandom( r2 ); assertSame( r2, instance.getRandom() ); } }