Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/09/12 17:29:33 (12 years ago)
Author:
bburlacu
Message:

#1772: Fixed bug in fragment tracing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.EvolutionaryTracking/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/TracingSymbolicExpressionTreeCrossover.cs

    r7522 r7788  
    2424using HeuristicLab.Common;
    2525using HeuristicLab.Core;
     26using HeuristicLab.Data;
    2627using HeuristicLab.Parameters;
    2728using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     
    3435  /// A base class for operators that perform a crossover of symbolic expression trees.
    3536  /// </summary>
    36   [Item("SymbolicExpressionTreeCrossover", "A base class for operators that perform a crossover of symbolic expression trees.")]
     37  [Item("SymbolicExpressionTreeCrossover",
     38    "A base class for operators that perform a crossover of symbolic expression trees.")]
    3739  [StorableClass]
    3840  public abstract class TracingSymbolicExpressionTreeCrossover : SymbolicExpressionTreeOperator, ISymbolicExpressionTreeCrossover {
     
    4143    private const string GlobalTraceMapParameterName = "GlobalTraceMap";
    4244    private const string GlobalCloneMapParameterName = "GlobalCloneMap";
     45    private const string GlobalFragmentMapParameterName = "GlobalFragmentMap";
     46
    4347    #region Parameter Properties
     48
    4449    public ILookupParameter<ItemArray<ISymbolicExpressionTree>> ParentsParameter {
    4550      get { return (ScopeTreeLookupParameter<ISymbolicExpressionTree>)Parameters[ParentsParameterName]; }
    4651    }
     52
    4753    public ILookupParameter<ISymbolicExpressionTree> ChildParameter {
    4854      get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[ChildParameterName]; }
    4955    }
     56
    5057    public LookupParameter<CloneMapType> GlobalCloneMapParameter {
    5158      get { return (LookupParameter<CloneMapType>)Parameters[GlobalCloneMapParameterName]; }
    5259    }
     60
    5361    public LookupParameter<TraceMapType> GlobalTraceMapParameter {
    5462      get { return (LookupParameter<TraceMapType>)Parameters[GlobalTraceMapParameterName]; }
    5563    }
     64
     65    public LookupParameter<CloneMapType> GlobalFragmentMapParameter {
     66      get { return (LookupParameter<CloneMapType>)Parameters[GlobalFragmentMapParameterName]; }
     67    }
     68
    5669    #endregion
     70
    5771    #region Properties
     72
    5873    public ItemArray<ISymbolicExpressionTree> Parents {
    5974      get { return ParentsParameter.ActualValue; }
    6075    }
     76
    6177    public ISymbolicExpressionTree Child {
    6278      get { return ChildParameter.ActualValue; }
    6379      set { ChildParameter.ActualValue = value; }
    6480    }
     81
    6582    public CloneMapType GlobalCloneMap {
    6683      get { return GlobalCloneMapParameter.ActualValue; }
    6784    }
     85
     86    public CloneMapType GlobalFragmentMap {
     87      get { return GlobalFragmentMapParameter.ActualValue; }
     88    }
     89
    6890    public TraceMapType GlobalTraceMap {
    6991      get { return GlobalTraceMapParameter.ActualValue; }
    7092    }
     93
    7194    #endregion
     95
    7296    [StorableConstructor]
    73     protected TracingSymbolicExpressionTreeCrossover(bool deserializing) : base(deserializing) { }
    74     protected TracingSymbolicExpressionTreeCrossover(TracingSymbolicExpressionTreeCrossover original, Cloner cloner) : base(original, cloner) { }
     97    protected TracingSymbolicExpressionTreeCrossover(bool deserializing)
     98      : base(deserializing) {
     99    }
     100
     101    protected TracingSymbolicExpressionTreeCrossover(TracingSymbolicExpressionTreeCrossover original, Cloner cloner)
     102      : base(original, cloner) {
     103    }
     104
    75105    protected TracingSymbolicExpressionTreeCrossover()
    76106      : base() {
    77       Parameters.Add(new ScopeTreeLookupParameter<ISymbolicExpressionTree>(ParentsParameterName, "The parent symbolic expression trees which should be crossed."));
    78       Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(ChildParameterName, "The child symbolic expression tree resulting from the crossover."));
    79       Parameters.Add(new LookupParameter<CloneMapType>(GlobalCloneMapParameterName, "A global map keeping track of trees and their clones (made during selection)."));
    80       Parameters.Add(new LookupParameter<TraceMapType>(GlobalTraceMapParameterName, "A global cache containing tracing info."));
     107      Parameters.Add(new ScopeTreeLookupParameter<ISymbolicExpressionTree>(ParentsParameterName,
     108                                                                           "The parent symbolic expression trees which should be crossed."));
     109      Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(ChildParameterName,
     110                                                                  "The child symbolic expression tree resulting from the crossover."));
     111      Parameters.Add(new LookupParameter<CloneMapType>(GlobalCloneMapParameterName,
     112                                                       "A global map keeping track of trees and their clones (made during selection)."));
     113      Parameters.Add(new LookupParameter<CloneMapType>(GlobalFragmentMapParameterName,
     114                                                       "A global map keeping track of tree fragments received via crossover."));
     115      Parameters.Add(new LookupParameter<TraceMapType>(GlobalTraceMapParameterName,
     116                                                       "A global cache containing tracing info."));
    81117    }
    82118
     
    85121        throw new ArgumentException("Number of parents must be exactly two for symbolic expression tree crossover operators.");
    86122      // add global trace cache if not already present in global scope
    87       if (GlobalTraceMap == null) {
    88         var gScope = ExecutionContext.Scope;
    89         while (gScope.Parent != null) gScope = gScope.Parent;
     123      var gScope = ExecutionContext.Scope;
     124      while (gScope.Parent != null) gScope = gScope.Parent;
     125      if (GlobalTraceMap == null)
    90126        gScope.Variables.Add(new Variable(GlobalTraceMapParameterName, new TraceMapType()));
    91       }
     127      if (GlobalFragmentMap == null)
     128        gScope.Variables.Add(new Variable(GlobalFragmentMapParameterName, new CloneMapType()));
     129      // get original parents
    92130      var originalParents = new ItemList<IItem>(Parents.Select(x => GlobalCloneMap[x]));
    93       ISymbolicExpressionTree result = Crossover(Random, Parents[0], Parents[1]);
    94       Child = result;
    95       GlobalTraceMap.Add(Child, originalParents);
    96 
     131      // save the nodes of parent0 in a list so we can track what modifications are made by crossover
     132      var nodes0 = Parents[0].IterateNodes().ToList();
     133      //perform crossover
     134      Child = Crossover(Random, Parents[0], Parents[1]);
     135      // create another list of parent0's nodes, so we can compare it with the first list to see what changed
     136      var nodes1 = Child.IterateNodes().ToList();
     137      // compare the two nodes lists and check the difference (comparing node references so we avoid false functional identity).
     138      // if no difference is found, then it is assumed that the whole tree was swapped with itself (it can happen), so the index is 0
     139      int i, min = Math.Max(nodes0.Count, nodes1.Count);
     140      for (i = 0; i != min; ++i)
     141        if (nodes0[i] != nodes1[i]) break;
     142      if (i == min) i = 0;
     143      GlobalTraceMap[Child] = originalParents;
     144      GlobalFragmentMap[Child] = new IntValue(i);
    97145      return base.Apply();
    98146    }
Note: See TracChangeset for help on using the changeset viewer.