Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/28/11 17:18:49 (12 years ago)
Author:
bburlacu
Message:

#1682: Fixed a bug affecting the new crossovers

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/gp-crossover/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover.cs

    r7075 r7089  
    3333
    3434  [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 {
    3736    [StorableConstructor]
    3837    private SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover(bool deserializing) : base(deserializing) { }
    39     private SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover(SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T> original, Cloner cloner) 
     38    private SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover(SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T> original, Cloner cloner)
    4039      : base(original, cloner) { }
    4140    public SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover() : base() { }
    4241    public override IDeepCloneable Clone(Cloner cloner) { return new SymbolicDataAnalysisExpressionProbabilisticFunctionalCrossover<T>(this, cloner); }
    43  
     42
    4443    protected override ISymbolicExpressionTree Cross(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1) {
    4544      ISymbolicDataAnalysisExpressionTreeInterpreter interpreter = SymbolicDataAnalysisTreeInterpreterParameter.ActualValue;
     
    4746      T problemData = ProblemDataParameter.ActualValue;
    4847      var grammar = parent0.Root.Grammar;
    49       return Cross(random, parent0, parent1, interpreter, problemData, 
     48      return Cross(random, parent0, parent1, interpreter, problemData,
    5049                   rows, MaximumSymbolicExpressionTreeDepth.Value, MaximumSymbolicExpressionTreeLength.Value);
    5150    }
     
    5857    /// choose the second crosspoint via a random weighted selection procedure.
    5958    /// </summary>
    60     public static ISymbolicExpressionTree Cross(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1, 
     59    public static ISymbolicExpressionTree Cross(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1,
    6160                                                ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, T problemData, IEnumerable<int> rows, int maxDepth, int maxLength) {
    6261      List<CutPoint> crossoverPoints0 = new List<CutPoint>();
    6362      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)
    6665            crossoverPoints0.Add(new CutPoint(n, child));
    6766      });
     
    7271      List<ISymbolicExpressionTreeNode> allowedBranches = new List<ISymbolicExpressionTreeNode>();
    7372      parent1.Root.ForEachNodePostfix((n) => {
    74         if (n.Subtrees.Any() && n != parent1.Root) 
     73        if (n.Subtrees.Any() && n != parent1.Root)
    7574          foreach (var child in n.Subtrees)
    7675            if (crossoverPoint0.IsMatchingPointType(child) && (child.GetDepth() + level <= maxDepth) && (child.GetLength() + length <= maxLength))
    77               allowedBranches.Add(n);
     76              allowedBranches.Add(child);
    7877      });
    7978
     
    8180      if (crossoverPoint0.IsMatchingPointType(null)) allowedBranches.Add(null);
    8281
    83       if (allowedBranches.Count == 0) 
     82      if (allowedBranches.Count == 0)
    8483        return parent0;
    8584
     
    8786
    8887      // 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);
    9091      IEnumerable<double> estimatedValues0 = interpreter.GetSymbolicExpressionTreeValues(tree0, dataset, rows);
    9192      double min0 = estimatedValues0.Min();
     
    9495      List<double> weights = new List<double>();
    9596      foreach (var node in allowedBranches) {
    96         var tree1 = CreateTreeFromNode(random, node, (ISymbolicExpressionGrammar)parent0.Root.Grammar);
     97        var tree1 = CreateTreeFromNode(random, node, rootSymbol, startSymbol);
    9798        IEnumerable<double> estimatedValues1 = interpreter.GetSymbolicExpressionTreeValues(tree1, dataset, rows);
    9899        double min1 = estimatedValues1.Min();
     
    133134      double r = weights.Sum() * random.NextDouble();
    134135      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];
    137138        r -= weights[i];
    138139      }
Note: See TracChangeset for help on using the changeset viewer.