Changeset 5567 for branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators
- Timestamp:
- 02/28/11 17:11:56 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/ChangeNodeTypeManipulation.cs
r5529 r5567 46 46 47 47 public static void ChangeNodeType(IRandom random, ISymbolicExpressionTree symbolicExpressionTree) { 48 // select any node as parent (except the root node) 49 var manipulationPoints = (from parent in symbolicExpressionTree.Root.IterateNodesPrefix().Skip(1) 50 let subtreeCount = parent.SubTrees.Count() 51 from subtreeIndex in Enumerable.Range(0, subtreeCount) 52 let subtree = parent.GetSubTree(subtreeIndex) 53 let existingSubtreeCount = subtree.SubTrees.Count() 54 // find possible symbols for the node (also considering the existing branches below it) 55 let allowedSymbols = (from symbol in parent.Grammar.GetAllowedSymbols(parent.Symbol, subtreeIndex) 56 // do not replace the existing symbol with itself 57 where symbol.Name != subtree.Symbol.Name 58 where existingSubtreeCount <= parent.Grammar.GetMaxSubtreeCount(symbol) 59 where existingSubtreeCount >= parent.Grammar.GetMinSubtreeCount(symbol) 60 // keep only symbols that are still possible considering the existing sub-trees 61 where (from existingSubtreeIndex in Enumerable.Range(0, existingSubtreeCount) 62 let existingSubtree = subtree.GetSubTree(existingSubtreeIndex) 63 select parent.Grammar.IsAllowedChild(symbol, existingSubtree.Symbol, existingSubtreeIndex)) 64 .All(x => x == true) 65 select symbol) 66 .ToList() 67 where allowedSymbols.Count() > 0 68 select new { Parent = parent, Child = subtree, Index = subtreeIndex, AllowedSymbols = allowedSymbols }) 69 .ToList(); 70 if (manipulationPoints.Count == 0) { return; } 71 var selectedManipulationPoint = manipulationPoints.SelectRandom(random); 48 72 49 // select any node as parent (except the root node) 50 var manipulationPoint = (from parent in symbolicExpressionTree.Root.IterateNodesPrefix().Skip(1) 51 from subtree in parent.SubTrees 52 select new { Parent = parent, Node = subtree, Index = parent.IndexOfSubTree(subtree) }) 53 .SelectRandom(random); 54 int subTreeCount = manipulationPoint.Node.SubTrees.Count(); 55 // find possible symbols for the node (also considering the existing branches below it) 56 var allowedSymbols = from symbol in manipulationPoint.Parent.Grammar.GetAllowedSymbols(manipulationPoint.Parent.Symbol, manipulationPoint.Index) 57 where subTreeCount <= manipulationPoint.Node.Grammar.GetMaxSubtreeCount(symbol) 58 where subTreeCount >= manipulationPoint.Node.Grammar.GetMinSubtreeCount(symbol) 59 select symbol; 60 61 if (allowedSymbols.Count() == 0) { 62 return; 63 } 64 var node = manipulationPoint.Node; 65 // keep only symbols that are still possible considering the existing sub-trees 66 var constrainedSymbols = (from symbol in allowedSymbols 67 let disallowedSubtrees = 68 from subtree in node.SubTrees 69 where !node.Grammar.IsAllowedChild(symbol, subtree.Symbol, node.IndexOfSubTree(subtree)) 70 select subtree 71 where disallowedSubtrees.Count() == 0 72 select symbol) 73 .ToList(); 74 if (constrainedSymbols.Count() == 0) { 75 return; 76 } 77 var weights = constrainedSymbols.Select(s => s.InitialFrequency).ToList(); 78 var newSymbol = constrainedSymbols.SelectRandom(weights, random); 73 var weights = selectedManipulationPoint.AllowedSymbols.Select(s => s.InitialFrequency).ToList(); 74 var newSymbol = selectedManipulationPoint.AllowedSymbols.SelectRandom(weights, random); 79 75 80 76 // replace the old node with the new node … … 82 78 if (newNode.HasLocalParameters) 83 79 newNode.ResetLocalParameters(random); 84 foreach (var subtree in node.SubTrees)80 foreach (var subtree in selectedManipulationPoint.Child.SubTrees) 85 81 newNode.AddSubTree(subtree); 86 manipulationPoint.Parent.RemoveSubTree(manipulationPoint.Index);87 manipulationPoint.Parent.InsertSubTree(manipulationPoint.Index, newNode);82 selectedManipulationPoint.Parent.RemoveSubTree(selectedManipulationPoint.Index); 83 selectedManipulationPoint.Parent.InsertSubTree(selectedManipulationPoint.Index, newNode); 88 84 } 89 85 }
Note: See TracChangeset
for help on using the changeset viewer.