Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.StructureIdentification/RampedTreeCreator.cs @ 402

Last change on this file since 402 was 324, checked in by gkronber, 16 years ago

added Size and Height properties to interface IFunctionTree and removed the helper methods from TreeGardener (specific implementations of size and height properties in classes implementing IFunctionTree can be more efficient than the general functions in TreeGardener)

File size: 4.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System.Linq;
23using HeuristicLab.Core;
24using HeuristicLab.Data;
25using HeuristicLab.Operators;
26using System;
27using HeuristicLab.Random;
28using HeuristicLab.Functions;
29
30namespace HeuristicLab.StructureIdentification {
31  public class RampedTreeCreator : OperatorBase {
32    public override string Description {
33      get { return @"Generates a new random operator tree."; }
34    }
35
36    public RampedTreeCreator()
37      : base() {
38      AddVariableInfo(new VariableInfo("Random", "Uniform random number generator", typeof(MersenneTwister), VariableKind.In));
39      AddVariableInfo(new VariableInfo("OperatorLibrary", "The operator library containing all available operators", typeof(GPOperatorLibrary), VariableKind.In));
40      AddVariableInfo(new VariableInfo("MinTreeHeight", "The minimal allowed height of the tree", typeof(IntData), VariableKind.In));
41      AddVariableInfo(new VariableInfo("MaxTreeHeight", "The maximal allowed height of the tree", typeof(IntData), VariableKind.In));
42      AddVariableInfo(new VariableInfo("BalancedTreesRate", "Determines how many trees should be balanced", typeof(DoubleData), VariableKind.In));
43      AddVariableInfo(new VariableInfo("FunctionTree", "The created tree", typeof(IFunctionTree), VariableKind.New | VariableKind.Out));
44      AddVariableInfo(new VariableInfo("TreeSize", "The size (number of nodes) of the tree", typeof(IntData), VariableKind.New | VariableKind.Out));
45      AddVariableInfo(new VariableInfo("TreeHeight", "The height of the tree", typeof(IntData), VariableKind.New | VariableKind.Out));
46    }
47
48    public override IOperation Apply(IScope scope) {
49      IRandom random = GetVariableValue<IRandom>("Random", scope, true);
50      GPOperatorLibrary opLibrary = GetVariableValue<GPOperatorLibrary>("OperatorLibrary", scope, true);
51      int minTreeHeight = GetVariableValue<IntData>("MinTreeHeight", scope, true).Data;
52      int maxTreeHeight = GetVariableValue<IntData>("MaxTreeHeight", scope, true).Data;
53      double balancedTreesRate = GetVariableValue<DoubleData>("BalancedTreesRate", scope, true).Data;
54
55      TreeGardener gardener = new TreeGardener(random, opLibrary);
56
57      int treeHeight = random.Next(minTreeHeight, maxTreeHeight + 1);
58      IFunctionTree root;
59      if(random.NextDouble() <= balancedTreesRate) {
60        root = gardener.CreateBalancedRandomTree(Int32.MaxValue, treeHeight);
61      } else {
62        root = gardener.CreateUnbalancedRandomTree(Int32.MaxValue, treeHeight);
63      }
64
65      int actualTreeSize = root.Size;
66      int actualTreeHeight = root.Height;
67
68      scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName("FunctionTree"), root));
69      scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName("TreeSize"), new IntData(actualTreeSize)));
70      scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName("TreeHeight"), new IntData(actualTreeHeight)));
71
72      if(!gardener.IsValidTree(root)) { throw new InvalidProgramException(); }
73
74      if(actualTreeHeight > maxTreeHeight) {
75        throw new InvalidProgramException();
76      }
77
78      return gardener.CreateInitializationOperation(gardener.GetAllSubTrees(root), scope);
79    }
80  }
81}
Note: See TracBrowser for help on using the repository browser.