Changeset 12286 for branches/LinearLinkage/HeuristicLab.Encodings.LinearLinkageEncoding/3.3/Manipulators
- Timestamp:
- 04/04/15 23:58:27 (10 years ago)
- Location:
- branches/LinearLinkage/HeuristicLab.Encodings.LinearLinkageEncoding/3.3/Manipulators
- Files:
-
- 3 added
- 1 edited
- 1 moved
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 } -
branches/LinearLinkage/HeuristicLab.Encodings.LinearLinkageEncoding/3.3/Manipulators/SwapItemManipulator.cs
r12285 r12286 20 20 #endregion 21 21 22 using System.Collections.Generic;23 22 using System.Linq; 24 23 using HeuristicLab.Common; 25 24 using HeuristicLab.Core; 26 25 using HeuristicLab.Data; 27 using HeuristicLab.Operators;28 using HeuristicLab.Optimization;29 26 using HeuristicLab.Parameters; 30 27 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 31 28 32 29 namespace HeuristicLab.Encodings.LinearLinkageEncoding { 33 [Item("Swap -n Manipulator", "")]30 [Item("Swap Item Manipulator", "Swaps items between groups. Items may be swapped multiple times.")] 34 31 [StorableClass] 35 public sealed class SwapNManipulator : InstrumentedOperator, ILinearLinkageManipulator, IStochasticOperator { 36 public ILookupParameter<IRandom> RandomParameter { 37 get { return (ILookupParameter<IRandom>)Parameters["Random"]; } 38 } 39 40 public ILookupParameter<LinearLinkage> LLEParameter { 41 get { return (ILookupParameter<LinearLinkage>)Parameters["LLE"]; } 42 } 32 public sealed class SwapItemManipulator : LinearLinkageManipulator { 43 33 44 34 public IValueLookupParameter<IntValue> NParameter { … … 47 37 48 38 [StorableConstructor] 49 private SwapNManipulator(bool deserializing) : base(deserializing) { } 50 private SwapNManipulator(SwapNManipulator original, Cloner cloner) : base(original, cloner) { } 51 public SwapNManipulator() { 52 Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use.")); 53 Parameters.Add(new LookupParameter<LinearLinkage>("LLE", "The encoding vector that is to be manipulated.")); 54 Parameters.Add(new ValueLookupParameter<IntValue>("N", "The number of swaps to perform.", new IntValue(2))); 39 private SwapItemManipulator(bool deserializing) : base(deserializing) { } 40 private SwapItemManipulator(SwapItemManipulator original, Cloner cloner) : base(original, cloner) { } 41 public SwapItemManipulator() { 42 Parameters.Add(new ValueLookupParameter<IntValue>("N", "The number of swaps to perform.", new IntValue(1))); 55 43 } 56 public Swap NManipulator(int n)44 public SwapItemManipulator(int n) 57 45 : this() { 58 46 NParameter.Value = new IntValue(n); … … 60 48 61 49 public override IDeepCloneable Clone(Cloner cloner) { 62 return new Swap NManipulator(this, cloner);50 return new SwapItemManipulator(this, cloner); 63 51 } 64 52 65 public override IOperation InstrumentedApply() { 66 var random = RandomParameter.ActualValue; 67 var vector = LLEParameter.ActualValue; 68 var N = NParameter.ActualValue.Value; 53 public static void Apply(IRandom random, LinearLinkage lle, int n) { 54 var grouping = lle.GetGroups().Select(x => x.ToList()).ToList(); 55 if (grouping.Count == 1) return; // nothing can be changed 69 56 70 var grouping = vector.GetGroups().Select(x => x.ToList()).ToList();71 if (grouping.Count == 1) return base.InstrumentedApply(); // nothing can be changed72 var touched = new HashSet<int>();73 57 var prevGroup = random.Next(grouping.Count); 74 58 var prevItem = random.Next(grouping[prevGroup].Count); 75 touched.Add(grouping[prevGroup][prevItem]); 76 for (var i = 0; i < N; i++) { 77 int nextGroup = -1, nextItem = -1, tries = 0; 59 for (var i = 0; i < n; i++) { 60 int nextGroup, nextItem; 78 61 do { 79 if (tries >= 100) break;80 62 nextGroup = random.Next(grouping.Count); 81 63 nextItem = random.Next(grouping[nextGroup].Count); 82 tries++; 83 } while (nextGroup == prevGroup || touched.Contains(grouping[nextGroup][nextItem])); 84 if (tries >= 100) break; 64 } while (nextGroup == prevGroup); 85 65 var h = grouping[nextGroup][nextItem]; 86 66 grouping[nextGroup][nextItem] = grouping[prevGroup][prevItem]; 87 67 grouping[prevGroup][prevItem] = h; 88 touched.Add(h);89 68 prevGroup = nextGroup; 90 69 prevItem = nextItem; 91 70 } 92 vector.SetGroups(grouping); 93 return base.InstrumentedApply(); 71 72 lle.SetGroups(grouping); 73 } 74 75 protected override void Manipulate(IRandom random, LinearLinkage lle) { 76 var N = NParameter.ActualValue.Value; 77 Apply(random, lle, N); 94 78 } 95 79 }
Note: See TracChangeset
for help on using the changeset viewer.