Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/04/15 23:58:27 (9 years ago)
Author:
abeham
Message:

#2319:

  • Removed LargestGroupFirstCrossover (slow and not mentioned in the literature)
  • Added manipulators
  • Added multi-operators
File:
1 moved

Legend:

Unmodified
Added
Removed
  • branches/LinearLinkage/HeuristicLab.Encodings.LinearLinkageEncoding/3.3/Manipulators/SwapItemManipulator.cs

    r12285 r12286  
    2020#endregion
    2121
    22 using System.Collections.Generic;
    2322using System.Linq;
    2423using HeuristicLab.Common;
    2524using HeuristicLab.Core;
    2625using HeuristicLab.Data;
    27 using HeuristicLab.Operators;
    28 using HeuristicLab.Optimization;
    2926using HeuristicLab.Parameters;
    3027using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    3128
    3229namespace HeuristicLab.Encodings.LinearLinkageEncoding {
    33   [Item("Swap-n Manipulator", "")]
     30  [Item("Swap Item Manipulator", "Swaps items between groups. Items may be swapped multiple times.")]
    3431  [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 {
    4333
    4434    public IValueLookupParameter<IntValue> NParameter {
     
    4737
    4838    [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)));
    5543    }
    56     public SwapNManipulator(int n)
     44    public SwapItemManipulator(int n)
    5745      : this() {
    5846      NParameter.Value = new IntValue(n);
     
    6048
    6149    public override IDeepCloneable Clone(Cloner cloner) {
    62       return new SwapNManipulator(this, cloner);
     50      return new SwapItemManipulator(this, cloner);
    6351    }
    6452
    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
    6956
    70       var grouping = vector.GetGroups().Select(x => x.ToList()).ToList();
    71       if (grouping.Count == 1) return base.InstrumentedApply(); // nothing can be changed
    72       var touched = new HashSet<int>();
    7357      var prevGroup = random.Next(grouping.Count);
    7458      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;
    7861        do {
    79           if (tries >= 100) break;
    8062          nextGroup = random.Next(grouping.Count);
    8163          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);
    8565        var h = grouping[nextGroup][nextItem];
    8666        grouping[nextGroup][nextItem] = grouping[prevGroup][prevItem];
    8767        grouping[prevGroup][prevItem] = h;
    88         touched.Add(h);
    8968        prevGroup = nextGroup;
    9069        prevItem = nextItem;
    9170      }
    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);
    9478    }
    9579  }
Note: See TracChangeset for help on using the changeset viewer.