Changeset 12286 for branches/LinearLinkage/HeuristicLab.Encodings.LinearLinkageEncoding/3.3/Manipulators/SwapItemManipulator.cs
- Timestamp:
- 04/04/15 23:58:27 (9 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
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.