package org.jgap.audit;
import java.util.*;
import org.jgap.*;
import org.jgap.event.*;
import org.jgap.impl.*;
import junit.framework.*;
/**
* Tests the PermutingConfiguration class
*
* @author Klaus Meffert
* @since 2.2
*/
public class PermutingConfigurationTest
extends JGAPTestCase {
/** String containing the CVS revision. Read out via reflection!*/
private static final String CVS_REVISION = "$Revision: 1.5 $";
public void setUp() {
super.setUp();
Configuration.reset();
}
public static Test suite() {
TestSuite suite = new TestSuite(PermutingConfigurationTest.class);
return suite;
}
/**
* Test construction with empty fitness function, population size 0, random
* generator initial, sample chromosome initial of reference configuration.
* No error should occur.
* @throws Exception
*
* @author Klaus Meffert
* @since 2.2
*/
public void testConstruct_0()
throws Exception {
Configuration conf1 = new DefaultConfiguration();
new PermutingConfiguration(conf1);
}
/**
* @throws Exception
*
* @author Klaus Meffert
* @since 2.2
*/
public void testConstruct_1()
throws Exception {
Configuration conf1 = new DefaultConfiguration();
conf1.setFitnessFunction(new StaticFitnessFunction(0.5d));
PermutingConfiguration conf = new PermutingConfiguration(conf1);
assertEquals(StaticFitnessFunction.class,
conf.getFitnessFunction().getClass());
assertEquals(EventManager.class, conf.getEventManager().getClass());
assertEquals(DefaultFitnessEvaluator.class,
conf.getFitnessEvaluator().getClass());
assertEquals(0, conf.getNaturalSelectorsSize(true));
assertEquals(StockRandomGenerator.class,
conf.getRandomGenerator().getClass());
assertEquals(ChromosomePool.class, conf.getChromosomePool().getClass());
assertEquals(0, conf.getGeneticOperators().size());
assertNull(conf.getBulkFitnessFunction());
}
/**
* Tests if the correct number of permutations appears and that they are
* unique.
* @throws Exception
*
* @author Klaus Meffert
* @since 2.2
*/
public void testPermute_0()
throws Exception {
Map cache = new Hashtable();
Configuration conf1 = new DefaultConfiguration();
PermutingConfiguration conf = new PermutingConfiguration(conf1);
// 2 possible combinations (because only 1 RandomGenerator a time possible)
conf.addRandomGeneratorSlot(new StockRandomGenerator());
conf.addRandomGeneratorSlot(new GaussianRandomGenerator());
// 3 possible combinations (multiple NaturalSelector's possible)
conf.addNaturalSelectorSlot(new BestChromosomesSelector(conf));
conf.addNaturalSelectorSlot(new WeightedRouletteSelector(conf));
// 3 possible combinations (multiple GeneticOperator's possible)
conf.addGeneticOperatorSlot(new MutationOperator(conf));
conf.addGeneticOperatorSlot(new CrossoverOperator(conf));
// 1 possible combinations
conf.addFitnessFunctionSlot(new StaticFitnessFunction(0.5d));
assertTrue(conf.hasNext());
Configuration c;
for (int i = 0; i < 18; i++) { // 18 = 2 * 3 * 3 * 1
c = conf.next();
assertNotNull(c);
// add to cache and check that object is unique among cached ones
int hash = c.getRandomGenerator().hashCode()
+ c.getFitnessFunction().hashCode();
for (int j = 0; j < c.getNaturalSelectorsSize(true); j++) {
hash += c.getNaturalSelector(true, j).hashCode();
}
for (int j = 0; j < c.getGeneticOperators().size(); j++) {
hash += c.getGeneticOperators().get(j).hashCode();
}
Integer hashI = new Integer(hash);
assertFalse(cache.containsKey(hashI));
cache.put(hashI, hashI);
}
assertFalse(conf.hasNext());
}
/**
* Permutation without chromosome pool
* @throws Exception
*
* @author Klaus Meffert
* @since 2.6
*/
public void testPermute_1()
throws Exception {
Configuration conf1 = new DefaultConfiguration();
conf1.setChromosomePool(null);
conf1.setFitnessFunction(new StaticFitnessFunction(0.5d));
PermutingConfiguration conf = new PermutingConfiguration(conf1);
assertFalse(conf.hasNext());
conf.addFitnessFunctionSlot(new StaticFitnessFunction(0.5d));
conf.addRandomGeneratorSlot(new StockRandomGenerator());
conf.addNaturalSelectorSlot(new BestChromosomesSelector(conf));
conf.addGeneticOperatorSlot(new MutationOperator(conf));
assertTrue(conf.hasNext());
Configuration c = conf.next();
assertNull(c.getChromosomePool());
}
/**
* Ensures that not supported methods throw an exception
* @throws Exception
*
* @author Klaus Meffert
* @since 2.2
*/
public void testNotSupported_1()
throws Exception {
Configuration conf1 = new DefaultConfiguration();
conf1.setFitnessFunction(new StaticFitnessFunction(0.5d));
PermutingConfiguration conf = new PermutingConfiguration(conf1);
try {
conf.addNaturalSelector(null, true);
fail();
} catch (UnsupportedOperationException uex) {
;//this is OK
}
try {
conf.addGeneticOperator(null);
fail();
} catch (UnsupportedOperationException uex) {
;//this is OK
}
}
}