Changeset 7089 for branches/gp-crossover/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover.cs
- Timestamp:
- 11/28/11 17:18:49 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/gp-crossover/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover.cs
r7075 r7089 33 33 34 34 [Item("ProbabilisticFunctionalCrossover", "An operator which performs subtree swapping based on behavioral similarity")] 35 public sealed class SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T> : SymbolicDataAnalysisExpressionCrossover<T> where T : class, IDataAnalysisProblemData 36 { 35 public sealed class SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T> : SymbolicDataAnalysisExpressionCrossover<T> where T : class, IDataAnalysisProblemData { 37 36 [StorableConstructor] 38 37 private SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover(bool deserializing) : base(deserializing) { } 39 private SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover(SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T> original, Cloner cloner) 38 private SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover(SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T> original, Cloner cloner) 40 39 : base(original, cloner) { } 41 40 public SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover() : base() { } 42 41 public override IDeepCloneable Clone(Cloner cloner) { return new SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T>(this, cloner); } 43 42 44 43 protected override ISymbolicExpressionTree Cross(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1) { 45 44 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue; … … 47 46 T problemData = ProblemDataParameter.ActualValue; 48 47 var grammar = parent0.Root.Grammar; 49 return Cross(random, parent0, parent1, interpreter, problemData, 48 return Cross(random, parent0, parent1, interpreter, problemData, 50 49 rows, MaximumSymbolicExpressionTreeDepth.Value, MaximumSymbolicExpressionTreeLength.Value); 51 50 } … … 58 57 /// choose the second crosspoint via a random weighted selection procedure. 59 58 /// </summary> 60 public static ISymbolicExpressionTree Cross(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1, 59 public static ISymbolicExpressionTree Cross(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1, 61 60 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, T problemData, IEnumerable<int> rows, int maxDepth, int maxLength) { 62 61 List<CutPoint> crossoverPoints0 = new List<CutPoint>(); 63 62 parent0.Root.ForEachNodePostfix((n) => { 64 if (n.Subtrees.Any() && n != parent0.Root) 65 foreach (var child in n.Subtrees) 63 if (n.Subtrees.Any() && n != parent0.Root) 64 foreach (var child in n.Subtrees) 66 65 crossoverPoints0.Add(new CutPoint(n, child)); 67 66 }); … … 72 71 List<ISymbolicExpressionTreeNode> allowedBranches = new List<ISymbolicExpressionTreeNode>(); 73 72 parent1.Root.ForEachNodePostfix((n) => { 74 if (n.Subtrees.Any() && n != parent1.Root) 73 if (n.Subtrees.Any() && n != parent1.Root) 75 74 foreach (var child in n.Subtrees) 76 75 if (crossoverPoint0.IsMatchingPointType(child) && (child.GetDepth() + level <= maxDepth) && (child.GetLength() + length <= maxLength)) 77 allowedBranches.Add( n);76 allowedBranches.Add(child); 78 77 }); 79 78 … … 81 80 if (crossoverPoint0.IsMatchingPointType(null)) allowedBranches.Add(null); 82 81 83 if (allowedBranches.Count == 0) 82 if (allowedBranches.Count == 0) 84 83 return parent0; 85 84 … … 87 86 88 87 // create symbols in order to improvize an ad-hoc tree so that the child can be evaluated 89 var tree0 = CreateTreeFromNode(random, crossoverPoint0.Child, (ISymbolicExpressionGrammar)parent0.Root.Grammar); 88 var rootSymbol = new ProgramRootSymbol(); 89 var startSymbol = new StartSymbol(); 90 var tree0 = CreateTreeFromNode(random, crossoverPoint0.Child, rootSymbol, startSymbol); 90 91 IEnumerable<double> estimatedValues0 = interpreter.GetSymbolicExpressionTreeValues(tree0, dataset, rows); 91 92 double min0 = estimatedValues0.Min(); … … 94 95 List<double> weights = new List<double>(); 95 96 foreach (var node in allowedBranches) { 96 var tree1 = CreateTreeFromNode(random, node, (ISymbolicExpressionGrammar)parent0.Root.Grammar);97 var tree1 = CreateTreeFromNode(random, node, rootSymbol, startSymbol); 97 98 IEnumerable<double> estimatedValues1 = interpreter.GetSymbolicExpressionTreeValues(tree1, dataset, rows); 98 99 double min1 = estimatedValues1.Min(); … … 133 134 double r = weights.Sum() * random.NextDouble(); 134 135 for (int i = 0; i != nodes.Count; ++i) { 135 if (r < weights[i]) 136 return nodes[i]; 136 if (r < weights[i]) 137 return nodes[i]; 137 138 r -= weights[i]; 138 139 }
Note: See TracChangeset
for help on using the changeset viewer.