diff options
Diffstat (limited to 'watchmaker/framework/src/java/test/org/uncommons/watchmaker/framework/selection/TruncationSelectionTest.java')
-rw-r--r-- | watchmaker/framework/src/java/test/org/uncommons/watchmaker/framework/selection/TruncationSelectionTest.java | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/watchmaker/framework/src/java/test/org/uncommons/watchmaker/framework/selection/TruncationSelectionTest.java b/watchmaker/framework/src/java/test/org/uncommons/watchmaker/framework/selection/TruncationSelectionTest.java new file mode 100644 index 0000000..3e33d06 --- /dev/null +++ b/watchmaker/framework/src/java/test/org/uncommons/watchmaker/framework/selection/TruncationSelectionTest.java @@ -0,0 +1,97 @@ +//============================================================================= +// Copyright 2006-2010 Daniel W. Dyer +// +// 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. +//============================================================================= +package org.uncommons.watchmaker.framework.selection; + +import java.util.ArrayList; +import java.util.List; +import org.testng.annotations.Test; +import org.uncommons.watchmaker.framework.EvaluatedCandidate; +import org.uncommons.watchmaker.framework.SelectionStrategy; + +/** + * Unit test for truncation selection strategy. Ensures the + * correct candidates are selected. + * @author Daniel Dyer + */ +public class TruncationSelectionTest +{ + @Test + public void testNaturalFitnessSelection() + { + SelectionStrategy<Object> selector = new TruncationSelection(0.5d); + List<EvaluatedCandidate<String>> population = new ArrayList<EvaluatedCandidate<String>>(4); + // Higher score is better. + EvaluatedCandidate<String> steve = new EvaluatedCandidate<String>("Steve", 10.0); + EvaluatedCandidate<String> mary = new EvaluatedCandidate<String>("Mary", 9.1); + EvaluatedCandidate<String> john = new EvaluatedCandidate<String>("John", 8.4); + EvaluatedCandidate<String> gary = new EvaluatedCandidate<String>("Gary", 6.2); + population.add(steve); + population.add(mary); + population.add(john); + population.add(gary); + List<String> selection = selector.select(population, true, 2, null); + assert selection.size() == 2 : "Selection size is " + selection.size() + ", should be 2."; + assert selection.contains(steve.getCandidate()) : "Best candidate not selected."; + assert selection.contains(mary.getCandidate()) : "Second best candidate not selected."; + } + + + @Test + public void testNonNaturalFitnessSelection() + { + SelectionStrategy<Object> selector = new TruncationSelection(0.5d); + List<EvaluatedCandidate<String>> population = new ArrayList<EvaluatedCandidate<String>>(4); + // Lower score is better. + EvaluatedCandidate<String> gary = new EvaluatedCandidate<String>("Gary", 6.2); + EvaluatedCandidate<String> john = new EvaluatedCandidate<String>("John", 8.4); + EvaluatedCandidate<String> mary = new EvaluatedCandidate<String>("Mary", 9.1); + EvaluatedCandidate<String> steve = new EvaluatedCandidate<String>("Steve", 10.0); + population.add(gary); + population.add(john); + population.add(mary); + population.add(steve); + List<String> selection = selector.select(population, false, 2, null); + assert selection.size() == 2 : "Selection size is " + selection.size() + ", should be 2."; + assert selection.contains(gary.getCandidate()) : "Best candidate not selected."; + assert selection.contains(john.getCandidate()) : "Second best candidate not selected."; + } + + + /** + * The selection ratio must be greater than zero to be useful. This test + * ensures that an appropriate exception is thrown if the ratio is not positive. + * Not throwing an exception is an error because it permits undetected bugs in + * evolutionary programs. + */ + @Test(expectedExceptions = IllegalArgumentException.class) + public void testZeroRatio() + { + new TruncationSelection(0d); + } + + + /** + * The selection ratio must be less than 1 to be useful. This test + * ensures that an appropriate exception is thrown if the ratio is too high. + * Not throwing an exception is an error because it permits undetected bugs in + * evolutionary programs. + */ + @Test(expectedExceptions = IllegalArgumentException.class) + public void testRatioTooHigh() + { + new TruncationSelection(1d); + } +} |