Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Permutation/3.3/Tests/OrderCrossoverTest.cs @ 2879

Last change on this file since 2879 was 2871, checked in by abeham, 15 years ago

readded references to operator descriptions and updated documentation
added OrderCrossover2 to implement the behavior described in our book (this was the behavior of the former OrderCrossover)
added CyclicCrossover2 to implement the behavior described in our book (this was the behavior of the former CyclicCrossover)
implemented unit tests for the new variants
#889

File size: 7.7 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using HeuristicLab.Permutation;
23using Microsoft.VisualStudio.TestTools.UnitTesting;
24using HeuristicLab.Core;
25
26namespace HeuristicLab.Permutation.Tests
27{
28   
29   
30    /// <summary>
31    ///This is a test class for OrderCrossoverTest and is intended
32    ///to contain all OrderCrossoverTest Unit Tests
33    ///</summary>
34  [TestClass()]
35  public class OrderCrossoverTest {
36
37
38    private TestContext testContextInstance;
39
40    /// <summary>
41    ///Gets or sets the test context which provides
42    ///information about and functionality for the current test run.
43    ///</summary>
44    public TestContext TestContext {
45      get {
46        return testContextInstance;
47      }
48      set {
49        testContextInstance = value;
50      }
51    }
52
53    #region Additional test attributes
54    //
55    //You can use the following additional attributes as you write your tests:
56    //
57    //Use ClassInitialize to run code before running the first test in the class
58    //[ClassInitialize()]
59    //public static void MyClassInitialize(TestContext testContext)
60    //{
61    //}
62    //
63    //Use ClassCleanup to run code after all tests in a class have run
64    //[ClassCleanup()]
65    //public static void MyClassCleanup()
66    //{
67    //}
68    //
69    //Use TestInitialize to run code before running each test
70    //[TestInitialize()]
71    //public void MyTestInitialize()
72    //{
73    //}
74    //
75    //Use TestCleanup to run code after each test has run
76    //[TestCleanup()]
77    //public void MyTestCleanup()
78    //{
79    //}
80    //
81    #endregion
82
83
84    /// <summary>
85    ///A test for Cross
86    ///</summary>
87    [TestMethod()]
88    [DeploymentItem("HeuristicLab.Permutation-3.3.dll")]
89    public void OrderCrossoverCrossTest() {
90      TestRandom random = new TestRandom();
91      OrderCrossover_Accessor target =
92        new OrderCrossover_Accessor(new PrivateObject(typeof(OrderCrossover)));
93      // perform a test with more than two parents
94      random.Reset();
95      bool exceptionFired = false;
96      try {
97        target.Cross(random, new ItemArray<Permutation>(new Permutation[] {
98          new Permutation(4), new Permutation(4), new Permutation(4)}));
99      } catch (System.InvalidOperationException) {
100        exceptionFired = true;
101      }
102      Assert.IsTrue(exceptionFired);
103    }
104
105    /// <summary>
106    ///A test for Apply
107    ///</summary>
108    [TestMethod()]
109    public void OrderCrossoverApplyTest() {
110      TestRandom random = new TestRandom();
111      Permutation parent1, parent2, expected, actual;
112      // The following test is based on an example from Eiben, A.E. and Smith, J.E. 2003. Introduction to Evolutionary Computation. Natural Computing Series, Springer-Verlag Berlin Heidelberg, pp. 55-56
113      random.Reset();
114      random.IntNumbers = new int[] { 3, 6 };
115      parent1 = new Permutation(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 });
116      Assert.IsTrue(parent1.Validate());
117      parent2 = new Permutation(new int[] { 8, 2, 6, 7, 1, 5, 4, 0, 3 });
118      Assert.IsTrue(parent2.Validate());
119      expected = new Permutation(new int[] { 2, 7, 1, 3, 4, 5, 6, 0, 8 });
120      Assert.IsTrue(expected.Validate());
121      actual = OrderCrossover.Apply(random, parent1, parent2);
122      Assert.IsTrue(actual.Validate());
123      Assert.IsTrue(Auxiliary.PermutationIsEqualByPosition(expected, actual));
124      // The following test is based on an example from Larranaga, P. et al. 1999. Genetic Algorithms for the Travelling Salesman Problem: A Review of Representations and Operators. Artificial Intelligence Review, 13, pp. 129-170.
125      random.Reset();
126      random.IntNumbers = new int[] { 2, 4 };
127      parent1 = new Permutation(new int[] { 0, 1, 2, 3, 4, 5, 6, 7 });
128      Assert.IsTrue(parent1.Validate());
129      parent2 = new Permutation(new int[] { 1, 3, 5, 7, 6, 4, 2, 0 });
130      Assert.IsTrue(parent2.Validate());
131      expected = new Permutation(new int[] { 7, 6, 2, 3, 4, 0, 1, 5 });
132      actual = OrderCrossover.Apply(random, parent1, parent2);
133      Assert.IsTrue(actual.Validate());
134      Assert.IsTrue(Auxiliary.PermutationIsEqualByPosition(expected, actual));
135      // The following test is based on an example from Talbi, E.G. 2009. Metaheuristics - From Design to Implementation. Wiley, p. 218.
136      random.Reset();
137      random.IntNumbers = new int[] { 2, 5 };
138      parent1 = new Permutation(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 });
139      Assert.IsTrue(parent1.Validate());
140      parent2 = new Permutation(new int[] { 7, 3, 0, 4, 8, 2, 5, 1, 6 });
141      Assert.IsTrue(parent2.Validate());
142      expected = new Permutation(new int[] { 0, 8, 2, 3, 4, 5, 1, 6, 7 });
143      Assert.IsTrue(expected.Validate());
144      actual = OrderCrossover.Apply(random, parent1, parent2);
145      Assert.IsTrue(actual.Validate());
146      Assert.IsTrue(Auxiliary.PermutationIsEqualByPosition(expected, actual));
147      // The following test is not based on published examples
148      random.Reset();
149      random.IntNumbers = new int[] { 0, 5 };
150      parent1 = new Permutation(new int[] { 2, 1, 4, 3, 7, 8, 6, 0, 5, 9 });
151      Assert.IsTrue(parent1.Validate());
152      parent2 = new Permutation(new int[] { 5, 3, 4, 0, 9, 8, 2, 7, 1, 6 });
153      Assert.IsTrue(parent2.Validate());
154      expected = new Permutation(new int[] { 2, 1, 4, 3, 7, 8, 6, 5, 0, 9 });
155      Assert.IsTrue(expected.Validate());
156      actual = OrderCrossover.Apply(random, parent1, parent2);
157      Assert.IsTrue(actual.Validate());
158      Assert.IsTrue(Auxiliary.PermutationIsEqualByPosition(expected, actual));
159      // based on the previous with changed breakpoints
160      random.Reset();
161      random.IntNumbers = new int[] { 6, 9 };
162      expected = new Permutation(new int[] { 3, 4, 8, 2, 7, 1, 6, 0, 5, 9 });
163      Assert.IsTrue(expected.Validate());
164      actual = OrderCrossover.Apply(random, parent1, parent2);
165      Assert.IsTrue(actual.Validate());
166      Assert.IsTrue(Auxiliary.PermutationIsEqualByPosition(expected, actual));
167      // another one based on the previous with changed breakpoints
168      random.Reset();
169      random.IntNumbers = new int[] { 0, 9 };
170      expected = new Permutation(new int[] { 2, 1, 4, 3, 7, 8, 6, 0, 5, 9 });
171      Assert.IsTrue(expected.Validate());
172      actual = OrderCrossover.Apply(random, parent1, parent2);
173      Assert.IsTrue(actual.Validate());
174      Assert.IsTrue(Auxiliary.PermutationIsEqualByPosition(expected, actual));
175
176      // perform a test when the two permutations are of unequal length
177      random.Reset();
178      bool exceptionFired = false;
179      try {
180        OrderCrossover.Apply(random, new Permutation(8), new Permutation(6));
181      } catch (System.ArgumentException) {
182        exceptionFired = true;
183      }
184      Assert.IsTrue(exceptionFired);
185    }
186
187    /// <summary>
188    ///A test for OrderCrossover Constructor
189    ///</summary>
190    [TestMethod()]
191    public void OrderCrossoverConstructorTest() {
192      OrderCrossover target = new OrderCrossover();
193    }
194  }
195}
Note: See TracBrowser for help on using the repository browser.