Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/15/12 19:09:09 (12 years ago)
Author:
gkronber
Message:

#1847 added operator for replacing branches with semantically similar branches

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GP-MoveOperators/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Moves/ChangeNodeTypeMultiMoveGenerator.cs

    r7802 r7832  
    2020#endregion
    2121
    22 using System;
    2322using System.Collections.Generic;
    2423using System.Linq;
     
    4645      set { SampleSizeParameter.Value = value; }
    4746    }
    48     public ILookupParameter<SymbolicExpressionTree> SymbolicExpressionTreeParameter {
    49       get { return (ILookupParameter<SymbolicExpressionTree>)Parameters["SymbolicExpressionTree"]; }
     47    public ILookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter {
     48      get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters["SymbolicExpressionTree"]; }
    5049    }
    5150    public ILookupParameter<ChangeNodeTypeMove> ChangeNodeTypeMoveParameter {
     
    6463      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
    6564
    66       Parameters.Add(new LookupParameter<SymbolicExpressionTree>("SymbolicExpressionTree", "The symbolic expression tree for which moves should be generated."));
     65      Parameters.Add(new LookupParameter<ISymbolicExpressionTree>("SymbolicExpressionTree", "The symbolic expression tree for which moves should be generated."));
    6766      Parameters.Add(new LookupParameter<ChangeNodeTypeMove>("ChangeNodeTypeMove", "The moves that should be generated in subscopes."));
    6867      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
     
    7574
    7675    public override IOperation Apply() {
    77       SymbolicExpressionTree tree = SymbolicExpressionTreeParameter.ActualValue;
    78       var moves = ChangeNodeTypeMoveGenerator.GenerateMoves(tree).ToArray();
     76      var tree = SymbolicExpressionTreeParameter.ActualValue;
     77
     78
    7979      string moveParameterName = ChangeNodeTypeMoveParameter.ActualName;
    8080      var moveScopes = new List<Scope>();
     
    8282      int n = SampleSizeParameter.ActualValue.Value;
    8383
    84       var rand = Enumerable.Range(0, moves.Length).Select(i => random.NextDouble()).ToArray();
    85       Array.Sort(rand, moves);
    86       n = Math.Min(n, moves.Length);
     84      var moves = GenerateMoves(tree, random, n);
    8785
    88       foreach (var m in moves.Take(n)) {
     86      foreach (var m in moves) {
    8987        if (m.NewChild.HasLocalParameters)
    9088          m.NewChild.ResetLocalParameters(random);
     
    9694      return base.Apply();
    9795    }
     96
     97    public static IEnumerable<ChangeNodeTypeMove> GenerateMoves(ISymbolicExpressionTree tree, IRandom random, int n) {
     98      int count = 0;
     99      var g = tree.Root.Grammar;
     100      var possibleChildren = (from parent in tree.Root.GetSubtree(0).IterateNodesPrefix()
     101                              from i in Enumerable.Range(0, parent.SubtreeCount)
     102                              from s in g.GetAllowedChildSymbols(parent.Symbol, i)
     103                              where s.Enabled
     104                              where s.InitialFrequency > 0.0
     105                              let currentChild = parent.GetSubtree(i)
     106                              where s.MinimumArity >= currentChild.SubtreeCount
     107                              where s.MaximumArity <= currentChild.SubtreeCount
     108                              where (from j in Enumerable.Range(0, currentChild.SubtreeCount)
     109                                     let childOfChild = currentChild.GetSubtree(j)
     110                                     select g.IsAllowedChildSymbol(s, childOfChild.Symbol, j)).All(p => p)
     111                              select new { parent, i, s }).ToArray();
     112      if (possibleChildren.Length < n) n = possibleChildren.Length;
     113      while (count < n) {
     114        var selected = possibleChildren[random.Next(possibleChildren.Length)];
     115        yield return new ChangeNodeTypeMove(tree, selected.parent, selected.i, selected.s.CreateTreeNode());
     116        count++;
     117      }
     118    }
    98119  }
    99120}
Note: See TracChangeset for help on using the changeset viewer.