Changeset 7075 for branches/gp-crossover/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover.cs
- Timestamp:
- 11/25/11 11:41:48 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/gp-crossover/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover.cs
r7035 r7075 37 37 [StorableConstructor] 38 38 private SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover(bool deserializing) : base(deserializing) { } 39 private SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover(SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T> original, Cloner cloner) 40 : base(original, cloner) { 41 } 42 public SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover() 43 : base() { 44 } 45 public override IDeepCloneable Clone(Cloner cloner) { 46 return new SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T>(this, cloner); 47 } 39 private SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover(SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T> original, Cloner cloner) 40 : base(original, cloner) { } 41 public SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover() : base() { } 42 public override IDeepCloneable Clone(Cloner cloner) { return new SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T>(this, cloner); } 43 48 44 protected override ISymbolicExpressionTree Cross(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1) { 49 45 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue; 50 46 IEnumerable<int> rows = GenerateRowsToEvaluate(); 51 47 T problemData = ProblemDataParameter.ActualValue; 52 return Cross(random, parent0, parent1, interpreter, problemData, rows, MaximumSymbolicExpressionTreeDepth.Value, MaximumSymbolicExpressionTreeLength.Value); 48 var grammar = parent0.Root.Grammar; 49 return Cross(random, parent0, parent1, interpreter, problemData, 50 rows, MaximumSymbolicExpressionTreeDepth.Value, MaximumSymbolicExpressionTreeLength.Value); 53 51 } 54 52 … … 60 58 /// choose the second crosspoint via a random weighted selection procedure. 61 59 /// </summary> 62 public static ISymbolicExpressionTree Cross(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1, 60 public static ISymbolicExpressionTree Cross(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1, 63 61 ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, T problemData, IEnumerable<int> rows, int maxDepth, int maxLength) { 64 62 List<CutPoint> crossoverPoints0 = new List<CutPoint>(); … … 89 87 90 88 // create symbols in order to improvize an ad-hoc tree so that the child can be evaluated 91 var rootSymbol = new ProgramRootSymbol(); 92 var startSymbol = new StartSymbol(); 93 var tree0 = CreateTreeFromNode(random, crossoverPoint0.Child, rootSymbol, startSymbol); 89 var tree0 = CreateTreeFromNode(random, crossoverPoint0.Child, (ISymbolicExpressionGrammar)parent0.Root.Grammar); 94 90 IEnumerable<double> estimatedValues0 = interpreter.GetSymbolicExpressionTreeValues(tree0, dataset, rows); 95 91 double min0 = estimatedValues0.Min(); … … 98 94 List<double> weights = new List<double>(); 99 95 foreach (var node in allowedBranches) { 100 var tree1 = CreateTreeFromNode(random, node, rootSymbol, startSymbol);96 var tree1 = CreateTreeFromNode(random, node, (ISymbolicExpressionGrammar)parent0.Root.Grammar); 101 97 IEnumerable<double> estimatedValues1 = interpreter.GetSymbolicExpressionTreeValues(tree1, dataset, rows); 102 98 double min1 = estimatedValues1.Min(); … … 109 105 110 106 ISymbolicExpressionTreeNode selectedBranch = SelectRandomBranch(random, allowedBranches, weights); 107 swap(crossoverPoint0, selectedBranch); 111 108 112 // perform the actual swap 113 if (crossoverPoint0.Child != null) { 109 return parent0; 110 } 111 112 private static void swap(CutPoint crossoverPoint, ISymbolicExpressionTreeNode selectedBranch) { 113 if (crossoverPoint.Child != null) { 114 114 // manipulate the tree of parent0 in place 115 115 // replace the branch in tree0 with the selected branch from tree1 116 crossoverPoint 0.Parent.RemoveSubtree(crossoverPoint0.ChildIndex);116 crossoverPoint.Parent.RemoveSubtree(crossoverPoint.ChildIndex); 117 117 if (selectedBranch != null) { 118 crossoverPoint 0.Parent.InsertSubtree(crossoverPoint0.ChildIndex, selectedBranch);118 crossoverPoint.Parent.InsertSubtree(crossoverPoint.ChildIndex, selectedBranch); 119 119 } 120 120 } else { 121 121 // child is null (additional child should be added under the parent) 122 122 if (selectedBranch != null) { 123 crossoverPoint 0.Parent.AddSubtree(selectedBranch);123 crossoverPoint.Parent.AddSubtree(selectedBranch); 124 124 } 125 125 } 126 127 return parent0;128 126 } 129 127
Note: See TracChangeset
for help on using the changeset viewer.