Free cookie consent management tool by TermsFeed Policy Generator

source: branches/Scheduling/HeuristicLab.Encodings.ScheduleEncoding/3.3/JobSequenceMatrix/Crossovers/JSMSXXCrossover.cs @ 6653

Last change on this file since 6653 was 6406, checked in by jhelm, 13 years ago

#1329: Applied suggestions from codereview. Added unit-tests. Renamed encoding-project.

File size: 3.9 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2011 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.Common;
23using HeuristicLab.Core;
24using HeuristicLab.Encodings.PermutationEncoding;
25using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
26
27namespace HeuristicLab.Encodings.ScheduleEncoding.JobSequenceMatrix {
28  [Item("JSMSubsequenceExchangeCrossover", "Represents a crossover operation identifiying and exchanging equal subsequences of the parents to generate offspring.")]
29  [StorableClass]
30  public class JSMSXXCrossover : JSMCrossover {
31    [StorableConstructor]
32    protected JSMSXXCrossover(bool deserializing) : base(deserializing) { }
33    protected JSMSXXCrossover(JSMSXXCrossover original, Cloner cloner)
34      : base(original, cloner) {
35    }
36    public override IDeepCloneable Clone(Cloner cloner) {
37      return new JSMSXXCrossover(this, cloner);
38    }
39    public JSMSXXCrossover() : base() { }
40
41
42    public static JSMEncoding Apply(IRandom random, JSMEncoding parent1, JSMEncoding parent2) {
43      JSMEncoding result = new JSMEncoding();
44      int subSequenceLength = random.Next(parent1.JobSequenceMatrix[0].Length);
45      for (int i = 0; i < parent1.JobSequenceMatrix.Count; i++) {
46        Permutation p1 = (Permutation)parent1.JobSequenceMatrix[i].Clone();
47        Permutation p2 = (Permutation)parent2.JobSequenceMatrix[i].Clone();
48        FindAndExchangeSubsequences(p1, p2, subSequenceLength);
49        result.JobSequenceMatrix.Add(p1);
50      }
51      return result;
52    }
53    private static void FindAndExchangeSubsequences(Permutation p1, Permutation p2, int subSequenceLength) {
54      for (int i = 0; i <= p1.Length - subSequenceLength; i++) {
55        int[] ss1 = GetSubSequenceAtPosition(p1, i, subSequenceLength);
56        for (int j = 0; j <= p2.Length - subSequenceLength; j++) {
57          int[] ss2 = GetSubSequenceAtPosition(p2, j, subSequenceLength);
58          if (AreEqualSubsequences(ss1, ss2)) {
59            ExchangeSubsequences(p1, i, p2, j, subSequenceLength);
60            return;
61          }
62        }
63      }
64    }
65    private static void ExchangeSubsequences(Permutation p1, int index1, Permutation p2, int index2, int subSequenceLength) {
66      Permutation aux = (Permutation)p1.Clone();
67      for (int i = 0; i < subSequenceLength; i++) {
68        p1[i + index1] = p2[i + index2];
69        p2[i + index2] = aux[i + index1];
70      }
71    }
72    private static bool AreEqualSubsequences(int[] ss1, int[] ss2) {
73      int counter = 0;
74      for (int i = 0; i < ss1.Length; i++) {
75        for (int j = 0; j < ss2.Length; j++) {
76          if (ss1[i] == ss2[j])
77            counter++;
78        }
79      }
80      return counter == ss1.Length;
81    }
82    private static int[] GetSubSequenceAtPosition(Permutation p1, int index, int subSequenceLength) {
83      int[] result = new int[subSequenceLength];
84      for (int i = 0; i < subSequenceLength; i++)
85        result[i] = p1[i + index];
86
87      return result;
88    }
89
90    public override JSMEncoding Cross(IRandom random, JSMEncoding parent1, JSMEncoding parent2) {
91      return Apply(random, parent1, parent2);
92    }
93  }
94}
Note: See TracBrowser for help on using the repository browser.