Changeset 12286 for branches/LinearLinkage/HeuristicLab.Encodings.LinearLinkageEncoding/3.3/Manipulators/SplitGroupManipulator.cs
- Timestamp:
- 04/04/15 23:58:27 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/LinearLinkage/HeuristicLab.Encodings.LinearLinkageEncoding/3.3/Manipulators/SplitGroupManipulator.cs
r12285 r12286 20 20 #endregion 21 21 22 using System; 22 23 using System.Collections.Generic; 23 24 using System.Linq; … … 53 54 } 54 55 56 public static void Apply(IRandom random, LinearLinkage lle, int n) { 57 var grouping = lle.GetGroups().ToList(); 58 var groupsLargerOne = grouping.Select((v, i) => Tuple.Create(i, v)) 59 .Where(x => x.Item2.Count > 1) 60 .ToDictionary(x => x.Item1, x => x.Item2); 61 if (groupsLargerOne.Count == 0) return; 62 var toRemove = new List<int>(); 63 64 for (var i = 0; i < n; i++) { 65 var g = groupsLargerOne.Keys.SampleRandom(random); 66 var idx = random.Next(1, groupsLargerOne[g].Count); 67 // shuffle here to avoid a potential bias of grouping smaller and larger numbers together 68 var tmp = groupsLargerOne[g].Shuffle(random); 69 var before = new List<int>(); 70 var after = new List<int>(); 71 foreach (var t in tmp) { 72 if (idx > 0) before.Add(t); 73 else after.Add(t); 74 idx--; 75 } 76 if (before.Count > 1) groupsLargerOne[grouping.Count] = before; 77 grouping.Add(before); 78 if (after.Count > 1) groupsLargerOne[grouping.Count] = after; 79 grouping.Add(after); 80 toRemove.Add(g); 81 groupsLargerOne.Remove(g); 82 if (groupsLargerOne.Count == 0) break; 83 } 84 foreach (var r in toRemove.OrderByDescending(x => x)) 85 grouping.RemoveAt(r); 86 87 lle.SetGroups(grouping); 88 } 89 55 90 protected override void Manipulate(IRandom random, LinearLinkage lle) { 56 91 var N = NParameter.ActualValue.Value; 57 58 // shuffle here to avoid bias due to lowest-index-first encoding 59 var grouping = lle.GetGroups().Select(x => x.ToList()).Shuffle(random).ToList(); 60 var groupsLargerOne = grouping.Count(x => x.Count > 1); 61 if (groupsLargerOne == 0) return; 62 63 var i = -1; 64 while (N > 0) { 65 i = (i + 1) % grouping.Count; 66 if (grouping[i].Count <= 1) continue; 67 if (random.NextDouble() < N / (double)groupsLargerOne) { 68 var idx = random.Next(1, grouping[i].Count); 69 // shuffle here to avoid a potential bias of grouping smaller and larger numbers together 70 var tmp = grouping[i].Shuffle(random); 71 var before = new List<int>(); 72 var after = new List<int>(); 73 foreach (var t in tmp) { 74 if (idx > 0) before.Add(t); 75 else after.Add(t); 76 idx--; 77 } 78 grouping.Add(before); 79 grouping.Add(after); 80 grouping.RemoveAt(i); 81 i--; 82 N--; 83 if (before.Count > 1 && after.Count > 1) groupsLargerOne++; 84 else if (before.Count == 1 && after.Count == 1) groupsLargerOne--; 85 } 86 if (groupsLargerOne == 0) break; 87 } 88 lle.SetGroups(grouping); 92 Apply(random, lle, N); 89 93 } 90 94 }
Note: See TracChangeset
for help on using the changeset viewer.