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 edited

Legend:

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

    r12285 r12286  
    2020#endregion
    2121
     22using System;
    2223using System.Collections.Generic;
    2324using System.Linq;
     
    5354    }
    5455
     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
    5590    protected override void Manipulate(IRandom random, LinearLinkage lle) {
    5691      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);
    8993    }
    9094  }
Note: See TracChangeset for help on using the changeset viewer.