Changeset 7832 for branches/GP-MoveOperators/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Moves/ChangeNodeTypeMultiMoveGenerator.cs
- Timestamp:
- 05/15/12 19:09:09 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/GP-MoveOperators/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Moves/ChangeNodeTypeMultiMoveGenerator.cs
r7802 r7832 20 20 #endregion 21 21 22 using System;23 22 using System.Collections.Generic; 24 23 using System.Linq; … … 46 45 set { SampleSizeParameter.Value = value; } 47 46 } 48 public ILookupParameter< SymbolicExpressionTree> SymbolicExpressionTreeParameter {49 get { return (ILookupParameter< SymbolicExpressionTree>)Parameters["SymbolicExpressionTree"]; }47 public ILookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter { 48 get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters["SymbolicExpressionTree"]; } 50 49 } 51 50 public ILookupParameter<ChangeNodeTypeMove> ChangeNodeTypeMoveParameter { … … 64 63 Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate.")); 65 64 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.")); 67 66 Parameters.Add(new LookupParameter<ChangeNodeTypeMove>("ChangeNodeTypeMove", "The moves that should be generated in subscopes.")); 68 67 Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes.")); … … 75 74 76 75 public override IOperation Apply() { 77 SymbolicExpressionTree tree = SymbolicExpressionTreeParameter.ActualValue; 78 var moves = ChangeNodeTypeMoveGenerator.GenerateMoves(tree).ToArray(); 76 var tree = SymbolicExpressionTreeParameter.ActualValue; 77 78 79 79 string moveParameterName = ChangeNodeTypeMoveParameter.ActualName; 80 80 var moveScopes = new List<Scope>(); … … 82 82 int n = SampleSizeParameter.ActualValue.Value; 83 83 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); 87 85 88 foreach (var m in moves .Take(n)) {86 foreach (var m in moves) { 89 87 if (m.NewChild.HasLocalParameters) 90 88 m.NewChild.ResetLocalParameters(random); … … 96 94 return base.Apply(); 97 95 } 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 } 98 119 } 99 120 }
Note: See TracChangeset
for help on using the changeset viewer.