Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/25/15 14:18:07 (9 years ago)
Author:
gkronber
Message:

#2422: ported lawn mower problem to use BasicProblem and SymbolicExpressionTreeEncoding

Location:
trunk/sources/HeuristicLab.Problems.LawnMower/3.4
Files:
1 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Problem.cs

    r12504 r12899  
    3030using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    3131using HeuristicLab.PluginInfrastructure;
     32using HeuristicLab.Random;
    3233
    3334namespace HeuristicLab.Problems.LawnMower {
     
    3536  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 160)]
    3637  [Item("Lawn Mower Problem", "The lawn mower demo problem for genetic programming.")]
    37   public class Problem : SingleObjectiveHeuristicOptimizationProblem<Evaluator, ISymbolicExpressionTreeCreator> {
     38  public class Problem : SymbolicExpressionTreeProblem {
    3839    private const string LawnWidthParameterName = "LawnWidth";
    3940    private const string LawnLengthParameterName = "LawnLength";
    40     private const string LawnMowerProgramParameterName = "Program";
    41     private const string MaxLawnMowerProgramLengthParameterName = "MaxProgramLength";
    42     private const string MaxLawnMowerProgramDepthParameterName = "MaxProgramDepth";
    43     private const string LawnMowerGrammarParameterName = "Grammar";
    44     private const string MaxFunctionDefinitionsParameterName = "MaxFunctionDefinitions";
    45     private const string MaxArgumentDefinitionsParameterName = "MaxArgumentDefinitions";
    4641
    4742    public IFixedValueParameter<IntValue> LawnWidthParameter {
     
    5146      get { return (IFixedValueParameter<IntValue>)Parameters[LawnLengthParameterName]; }
    5247    }
    53     public IFixedValueParameter<IntValue> MaxLawnMowerProgramLengthParameter {
    54       get { return (IFixedValueParameter<IntValue>)Parameters[MaxLawnMowerProgramLengthParameterName]; }
    55     }
    56     public IFixedValueParameter<IntValue> MaxLawnMowerProgramDepthParameter {
    57       get { return (IFixedValueParameter<IntValue>)Parameters[MaxLawnMowerProgramDepthParameterName]; }
    58     }
    59     public IValueParameter<Grammar> GrammarParameter {
    60       get { return (IValueParameter<Grammar>)Parameters[LawnMowerGrammarParameterName]; }
    61     }
    62     public IFixedValueParameter<IntValue> MaxFunctionDefinitionsParameter {
    63       get { return (IFixedValueParameter<IntValue>)Parameters[MaxFunctionDefinitionsParameterName]; }
    64     }
    65     public IFixedValueParameter<IntValue> MaxArgumentDefinitionsParameter {
    66       get { return (IFixedValueParameter<IntValue>)Parameters[MaxArgumentDefinitionsParameterName]; }
     48
     49    public override bool Maximization {
     50      get { return true; }
    6751    }
    6852
     
    7357    protected Problem(Problem original, Cloner cloner)
    7458      : base(original, cloner) {
    75       RegisterEventHandlers();
    7659    }
    7760    public Problem()
    78       : base(new Evaluator(), new RampedHalfAndHalfTreeCreator()) {
     61      : base() {
    7962      Parameters.Add(new FixedValueParameter<IntValue>(LawnWidthParameterName, "Width of the lawn.", new IntValue(8)));
    8063      Parameters.Add(new FixedValueParameter<IntValue>(LawnLengthParameterName, "Length of the lawn.", new IntValue(8)));
    81       Parameters.Add(new FixedValueParameter<IntValue>(MaxLawnMowerProgramDepthParameterName, "Maximal depth of the lawn mower program.", new IntValue(13)));
    82       Parameters.Add(new FixedValueParameter<IntValue>(MaxLawnMowerProgramLengthParameterName, "Maximal length of the lawn mower program.", new IntValue(1000)));
    83       Parameters.Add(new FixedValueParameter<IntValue>(MaxFunctionDefinitionsParameterName, "Maximal number of automatically defined functions (ADF).", new IntValue(3)));
    84       Parameters.Add(new FixedValueParameter<IntValue>(MaxArgumentDefinitionsParameterName, "Maximal number of automatically defined arguments.", new IntValue(3)));
    85       Parameters.Add(new ValueParameter<Grammar>(LawnMowerGrammarParameterName, "Grammar for the lawn mower program.",
    86                      new Grammar()));
    87       Maximization.Value = true;
    8864
    89       GrammarParameter.Value.MaximumFunctionDefinitions = MaxFunctionDefinitionsParameter.Value.Value;
    90       GrammarParameter.Value.MaximumFunctionArguments = MaxArgumentDefinitionsParameter.Value.Value;
     65      var g = new SimpleSymbolicExpressionGrammar();
     66      g.AddSymbols(new string[] { "Sum", "Prog" }, 2, 2);
     67      g.AddSymbols(new string[] { "Frog" }, 1, 1);
     68      g.AddTerminalSymbols(new string[] { "Left", "Forward" });
     69      // initialize 20 ephemeral random constants in [0..32[
     70      var fastRand = new FastRandom(314159);
     71      for (int i = 0; i < 20; i++) {
     72        g.AddTerminalSymbol(string.Format("{0},{1}", fastRand.Next(0, 32), fastRand.Next(0, 32)));
     73      }
    9174
    92       InitializeOperators();
    93       RegisterEventHandlers();
     75      Encoding = new SymbolicExpressionTreeEncoding(g, 1000, 17);
     76    }
     77
     78    public override void Analyze(ISymbolicExpressionTree[] trees, double[] qualities, ResultCollection results, IRandom random) {
     79      const string bestSolutionResultName = "Best Solution";
     80      var bestQuality = Maximization ? qualities.Max() : qualities.Min();
     81      var bestIdx = Array.IndexOf(qualities, bestQuality);
     82
     83      if (!results.ContainsKey(bestSolutionResultName)) {
     84        results.Add(new Result(bestSolutionResultName, new Solution(trees[bestIdx], LawnLengthParameter.Value.Value, LawnWidthParameter.Value.Value, bestQuality)));
     85      } else if (((Solution)(results[bestSolutionResultName].Value)).Quality < qualities[bestIdx]) {
     86        results[bestSolutionResultName].Value = new Solution(trees[bestIdx], LawnLengthParameter.Value.Value, LawnWidthParameter.Value.Value, bestQuality);
     87      }
    9488    }
    9589
    9690
    9791    [StorableHook(HookType.AfterDeserialization)]
    98     private void AfterDeserialization() {
    99       RegisterEventHandlers();
     92    private void AfterDeserialization() { }
     93
     94    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random) {
     95      var length = LawnLengthParameter.Value.Value;
     96      var width = LawnWidthParameter.Value.Value;
     97
     98      var lawn = Interpreter.EvaluateLawnMowerProgram(length, width, tree);
     99      // count number of squares that have been mowed
     100      int numberOfMowedCells = 0;
     101      for (int i = 0; i < length; i++)
     102        for (int j = 0; j < width; j++)
     103          if (lawn[i, j]) {
     104            numberOfMowedCells++;
     105          }
     106      return numberOfMowedCells;
    100107    }
    101108
     
    103110      return new Problem(this, cloner);
    104111    }
    105 
    106     private void InitializeOperators() {
    107       Operators.AddRange(ApplicationManager.Manager.GetInstances<ISymbolicExpressionTreeOperator>());
    108       Operators.Add(new MinAverageMaxSymbolicExpressionTreeLengthAnalyzer());
    109       Operators.Add(new SymbolicExpressionSymbolFrequencyAnalyzer());
    110       Operators.Add(new BestSolutionAnalyzer());
    111       ParameterizeOperators();
    112       ParameterizeAnalyzers();
    113     }
    114 
    115 
    116     private void RegisterEventHandlers() {
    117       Evaluator.QualityParameter.ActualNameChanged += QualityParameterOnActualNameChanged;
    118       SolutionCreator.SymbolicExpressionTreeParameter.ActualNameChanged +=
    119         SymbolicExpressionTreeParameterOnActualNameChanged;
    120       MaxArgumentDefinitionsParameter.ValueChanged += ParameterizeGrammar;
    121       MaxFunctionDefinitionsParameter.ValueChanged += ParameterizeGrammar;
    122     }
    123 
    124     protected override void OnEvaluatorChanged() {
    125       Evaluator.LawnMowerProgramParameter.ActualName = LawnMowerProgramParameterName;
    126       Evaluator.LawnLengthParameter.ActualName = LawnLengthParameterName;
    127       Evaluator.LawnWidthParameter.ActualName = LawnWidthParameterName;
    128       Evaluator.QualityParameter.ActualNameChanged += QualityParameterOnActualNameChanged;
    129       ParameterizeAnalyzers();
    130       ParameterizeOperators();
    131       base.OnEvaluatorChanged();
    132     }
    133 
    134     protected override void OnSolutionCreatorChanged() {
    135       SolutionCreator.SymbolicExpressionTreeParameter.ActualName = LawnMowerProgramParameterName;
    136       SolutionCreator.SymbolicExpressionTreeParameter.ActualNameChanged += SymbolicExpressionTreeParameterOnActualNameChanged;
    137       ParameterizeAnalyzers();
    138       ParameterizeOperators();
    139       base.OnSolutionCreatorChanged();
    140     }
    141 
    142     private void SymbolicExpressionTreeParameterOnActualNameChanged(object sender, EventArgs eventArgs) {
    143       ParameterizeAnalyzers();
    144       ParameterizeOperators();
    145     }
    146 
    147     private void QualityParameterOnActualNameChanged(object sender, EventArgs eventArgs) {
    148       ParameterizeAnalyzers();
    149       ParameterizeOperators();
    150     }
    151 
    152     private void ParameterizeGrammar(object sender, EventArgs eventArgs) {
    153       GrammarParameter.Value.MaximumFunctionArguments = MaxArgumentDefinitionsParameter.Value.Value;
    154       GrammarParameter.Value.MaximumFunctionDefinitions = MaxFunctionDefinitionsParameter.Value.Value;
    155     }
    156 
    157     private void ParameterizeAnalyzers() {
    158       var analyzers = Operators.OfType<IAnalyzer>();
    159       foreach (var o in analyzers.OfType<ISymbolicExpressionTreeAnalyzer>()) {
    160         o.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
    161       }
    162       foreach (var o in analyzers.OfType<BestSolutionAnalyzer>()) {
    163         o.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
    164       }
    165     }
    166 
    167     private void ParameterizeOperators() {
    168       var operators = Parameters
    169         .OfType<IValueParameter>()
    170         .Select(p => p.Value)
    171         .OfType<IOperator>()
    172         .Union(Operators);
    173       foreach (var o in operators.OfType<ISymbolicExpressionTreeGrammarBasedOperator>()) {
    174         o.SymbolicExpressionTreeGrammarParameter.ActualName = LawnMowerGrammarParameterName;
    175       }
    176       foreach (var o in operators.OfType<ISymbolicExpressionTreeSizeConstraintOperator>()) {
    177         o.MaximumSymbolicExpressionTreeDepthParameter.ActualName = MaxLawnMowerProgramDepthParameterName;
    178         o.MaximumSymbolicExpressionTreeLengthParameter.ActualName = MaxLawnMowerProgramLengthParameterName;
    179       }
    180       foreach (var op in operators.OfType<Evaluator>()) {
    181         op.LawnMowerProgramParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
    182         op.LawnLengthParameter.ActualName = LawnLengthParameterName;
    183         op.LawnWidthParameter.ActualName = LawnWidthParameterName;
    184       }
    185       foreach (var op in operators.OfType<ISymbolicExpressionTreeCrossover>()) {
    186         op.ParentsParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
    187         op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
    188       }
    189       foreach (var op in operators.OfType<ISymbolicExpressionTreeManipulator>()) {
    190         op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
    191       }
    192       foreach (var op in operators.OfType<ISymbolicExpressionTreeCreator>()) {
    193         op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;
    194       }
    195       foreach (ISymbolicExpressionTreeArchitectureAlteringOperator op in operators.OfType<ISymbolicExpressionTreeArchitectureAlteringOperator>()) {
    196         op.MaximumFunctionDefinitionsParameter.ActualName = MaxFunctionDefinitionsParameter.Name;
    197         op.MaximumFunctionArgumentsParameter.ActualName = MaxArgumentDefinitionsParameter.Name;
    198       }
    199     }
    200112  }
    201113}
Note: See TracChangeset for help on using the changeset viewer.