- Timestamp:
- 08/25/15 14:18:07 (9 years ago)
- 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 30 30 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 31 31 using HeuristicLab.PluginInfrastructure; 32 using HeuristicLab.Random; 32 33 33 34 namespace HeuristicLab.Problems.LawnMower { … … 35 36 [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 160)] 36 37 [Item("Lawn Mower Problem", "The lawn mower demo problem for genetic programming.")] 37 public class Problem : S ingleObjectiveHeuristicOptimizationProblem<Evaluator, ISymbolicExpressionTreeCreator>{38 public class Problem : SymbolicExpressionTreeProblem { 38 39 private const string LawnWidthParameterName = "LawnWidth"; 39 40 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";46 41 47 42 public IFixedValueParameter<IntValue> LawnWidthParameter { … … 51 46 get { return (IFixedValueParameter<IntValue>)Parameters[LawnLengthParameterName]; } 52 47 } 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; } 67 51 } 68 52 … … 73 57 protected Problem(Problem original, Cloner cloner) 74 58 : base(original, cloner) { 75 RegisterEventHandlers();76 59 } 77 60 public Problem() 78 : base( new Evaluator(), new RampedHalfAndHalfTreeCreator()) {61 : base() { 79 62 Parameters.Add(new FixedValueParameter<IntValue>(LawnWidthParameterName, "Width of the lawn.", new IntValue(8))); 80 63 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;88 64 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 } 91 74 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 } 94 88 } 95 89 96 90 97 91 [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; 100 107 } 101 108 … … 103 110 return new Problem(this, cloner); 104 111 } 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 = Parameters169 .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 }200 112 } 201 113 }
Note: See TracChangeset
for help on using the changeset viewer.