Changeset 7662 for trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/ReplaceBranchManipulation.cs
- Timestamp:
- 03/26/12 14:11:46 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/ReplaceBranchManipulation.cs
r7259 r7662 26 26 using HeuristicLab.Parameters; 27 27 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 28 using System.Collections.Generic; 28 29 29 30 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding { … … 31 32 [Item("ReplaceBranchManipulation", "Selects a branch of the tree randomly and replaces it with a newly initialized branch (using PTC2).")] 32 33 public sealed class ReplaceBranchManipulation : SymbolicExpressionTreeManipulator, ISymbolicExpressionTreeSizeConstraintOperator { 34 private const int MAX_TRIES = 100; 33 35 private const string MaximumSymbolicExpressionTreeLengthParameterName = "MaximumSymbolicExpressionTreeLength"; 34 36 private const string MaximumSymbolicExpressionTreeDepthParameterName = "MaximumSymbolicExpressionTreeDepth"; … … 68 70 69 71 public static void ReplaceRandomBranch(IRandom random, ISymbolicExpressionTree symbolicExpressionTree, int maxTreeLength, int maxTreeDepth) { 70 // select any node as parent (except the root node) 71 var manipulationPoints = (from parent in symbolicExpressionTree.Root.IterateNodesPrefix().Skip(1) 72 from subtree in parent.Subtrees 73 let subtreeIndex = parent.IndexOfSubtree(subtree) 74 let maxLength = maxTreeLength - symbolicExpressionTree.Length + subtree.GetLength() 75 let maxDepth = maxTreeDepth - symbolicExpressionTree.Depth + subtree.GetDepth() 76 // find possible symbols for the node (also considering the existing branches below it) 77 let allowedSymbols = (from symbol in parent.Grammar.GetAllowedChildSymbols(parent.Symbol, subtreeIndex) 78 // do not replace symbol with the same symbol 79 where symbol.Name != subtree.Symbol.Name 80 where symbol.InitialFrequency > 0 81 where parent.Grammar.GetMinimumExpressionDepth(symbol) + 1 <= maxDepth 82 where parent.Grammar.GetMinimumExpressionLength(symbol) <= maxLength 83 select symbol) 84 .ToList() 85 where allowedSymbols.Count > 0 86 select new { 87 Parent = parent, 88 Child = subtree, 89 Index = subtreeIndex, 90 AllowedSymbols = allowedSymbols, 91 MaxLength = maxLength, 92 MaxDepth = maxDepth 93 }) 94 .ToList(); 72 var allowedSymbols = new List<ISymbol>(); 73 ISymbolicExpressionTreeNode parent; 74 int childIndex; 75 int maxLength; 76 int maxDepth; 77 // repeat until a fitting parent and child are found (MAX_TRIES times) 78 int tries = 0; 79 do { 80 parent = symbolicExpressionTree.Root.IterateNodesPrefix().Skip(1).Where(n => n.SubtreeCount > 0).SelectRandom(random); 81 childIndex = random.Next(parent.SubtreeCount); 82 var child = parent.GetSubtree(childIndex); 83 maxLength = maxTreeLength - symbolicExpressionTree.Length + child.GetLength(); 84 maxDepth = maxTreeDepth - symbolicExpressionTree.Depth + child.GetDepth(); 95 85 96 if (manipulationPoints.Count == 0) return; 97 var selectedManipulationPoint = manipulationPoints.SelectRandom(random); 86 allowedSymbols.Clear(); 87 foreach (var symbol in parent.Grammar.GetAllowedChildSymbols(parent.Symbol, childIndex)) { 88 // check basic properties that the new symbol must have 89 if (symbol.Name != child.Symbol.Name && 90 symbol.InitialFrequency > 0 && 91 parent.Grammar.GetMinimumExpressionDepth(symbol) + 1 <= maxDepth && 92 parent.Grammar.GetMinimumExpressionLength(symbol) <= maxLength) { 93 allowedSymbols.Add(symbol); 94 } 95 } 96 tries++; 97 } while (tries < MAX_TRIES && allowedSymbols.Count == 0); 98 98 99 var weights = selectedManipulationPoint.AllowedSymbols.Select(s => s.InitialFrequency).ToList(); 100 var seedSymbol = selectedManipulationPoint.AllowedSymbols.SelectRandom(weights, random); 101 // replace the old node with the new node 102 var seedNode = seedSymbol.CreateTreeNode(); 103 if (seedNode.HasLocalParameters) 104 seedNode.ResetLocalParameters(random); 99 if (tries < MAX_TRIES) { 100 var weights = allowedSymbols.Select(s => s.InitialFrequency).ToList(); 101 var seedSymbol = allowedSymbols.SelectRandom(weights, random); 102 // replace the old node with the new node 103 var seedNode = seedSymbol.CreateTreeNode(); 104 if (seedNode.HasLocalParameters) 105 seedNode.ResetLocalParameters(random); 105 106 106 selectedManipulationPoint.Parent.RemoveSubtree(selectedManipulationPoint.Index); 107 selectedManipulationPoint.Parent.InsertSubtree(selectedManipulationPoint.Index, seedNode); 108 ProbabilisticTreeCreator.PTC2(random, seedNode, selectedManipulationPoint.MaxLength, selectedManipulationPoint.MaxDepth); 107 parent.RemoveSubtree(childIndex); 108 parent.InsertSubtree(childIndex, seedNode); 109 ProbabilisticTreeCreator.PTC2(random, seedNode, maxLength, maxDepth); 110 } 109 111 } 110 112 }
Note: See TracChangeset
for help on using the changeset viewer.