- Timestamp:
- 08/25/15 10:38:20 (9 years ago)
- Location:
- trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.5
- Files:
-
- 1 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.ArtificialAnt/3.5/ArtificialAntProblem.cs
r12504 r12895 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.Diagnostics.Contracts; 24 25 using System.Linq; 25 26 using HeuristicLab.Common; … … 37 38 [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 170)] 38 39 [StorableClass] 39 public sealed class ArtificialAntProblem : SingleObjective HeuristicOptimizationProblem<Evaluator, ISymbolicExpressionTreeCreator>, IStorableContent {40 public sealed class ArtificialAntProblem : SingleObjectiveBasicProblem<SymbolicExpressionTreeEncoding>, IStorableContent { 40 41 public string Filename { get; set; } 41 42 42 43 #region constant for default world (Santa Fe) 43 private readonly bool[,] santaFeAntTrail = new bool[,] { 44 {false, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 45 {false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 46 {false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, false, false, false, false}, 47 {false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, true, false, false}, 48 {false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, true, false, false}, 49 {false, false, false, true, true, true, true, false, true, true, true, true, true, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false}, 50 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false}, 51 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false}, 52 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false}, 53 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, true, false, false}, 54 {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false}, 55 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 56 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false}, 57 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false}, 58 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, true, true, true, false, false, false}, 59 {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false}, 60 {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 61 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 62 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false}, 63 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false}, 64 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 65 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 66 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false}, 67 {false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false}, 68 {false, false, false, true, true, false, false, true, true, true, true, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 69 {false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 70 {false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 71 {false, true, false, false, false, false, false, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 72 {false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 73 {false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 74 {false, false, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, 75 {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false } 44 45 private static readonly char[][] santaFeAntTrail = new[] { 46 " ### ".ToCharArray(), 47 " # ".ToCharArray(), 48 " # .###.. ".ToCharArray(), 49 " # # # ".ToCharArray(), 50 " # # # ".ToCharArray(), 51 " ####.##### .##.. . ".ToCharArray(), 52 " # . # ".ToCharArray(), 53 " # # . ".ToCharArray(), 54 " # # . ".ToCharArray(), 55 " # # # ".ToCharArray(), 56 " . # . ".ToCharArray(), 57 " # . . ".ToCharArray(), 58 " # . # ".ToCharArray(), 59 " # # . ".ToCharArray(), 60 " # # ...###. ".ToCharArray(), 61 " . .#... # ".ToCharArray(), 62 " . . . ".ToCharArray(), 63 " # . . ".ToCharArray(), 64 " # # .#... ".ToCharArray(), 65 " # # # ".ToCharArray(), 66 " # # . ".ToCharArray(), 67 " # # . ".ToCharArray(), 68 " # . ...#. ".ToCharArray(), 69 " # . # ".ToCharArray(), 70 " ..##..#####. # ".ToCharArray(), 71 " # # ".ToCharArray(), 72 " # # ".ToCharArray(), 73 " # .#######.. ".ToCharArray(), 74 " # # ".ToCharArray(), 75 " . # ".ToCharArray(), 76 " .####.. ".ToCharArray(), 77 " ".ToCharArray() 76 78 }; 79 80 77 81 #endregion 78 82 79 83 #region Parameter Properties 80 public IValueParameter<ISymbolicExpressionGrammar> ArtificialAntExpressionGrammarParameter {81 get { return (IValueParameter<ISymbolicExpressionGrammar>)Parameters["ArtificialAntExpressionGrammar"]; }82 }83 public IValueParameter<IntValue> MaxExpressionLengthParameter {84 get { return (IValueParameter<IntValue>)Parameters["MaximumExpressionLength"]; }85 }86 public IValueParameter<IntValue> MaxExpressionDepthParameter {87 get { return (IValueParameter<IntValue>)Parameters["MaximumExpressionDepth"]; }88 }89 public IValueParameter<IntValue> MaxFunctionDefinitionsParameter {90 get { return (IValueParameter<IntValue>)Parameters["MaximumFunctionDefinitions"]; }91 }92 public IValueParameter<IntValue> MaxFunctionArgumentsParameter {93 get { return (ValueParameter<IntValue>)Parameters["MaximumFunctionArguments"]; }94 }95 84 public IValueParameter<BoolMatrix> WorldParameter { 96 85 get { return (IValueParameter<BoolMatrix>)Parameters["World"]; } … … 110 99 set { MaxTimeStepsParameter.Value = value; } 111 100 } 112 public IntValue MaxExpressionLength { 113 get { return MaxExpressionLengthParameter.Value; } 114 set { MaxExpressionLengthParameter.Value = value; } 115 } 116 public IntValue MaxExpressionDepth { 117 get { return MaxExpressionDepthParameter.Value; } 118 set { MaxExpressionDepthParameter.Value = value; } 119 } 120 public IntValue MaxFunctionDefinitions { 121 get { return MaxFunctionDefinitionsParameter.Value; } 122 set { MaxFunctionDefinitionsParameter.Value = value; } 123 } 124 public IntValue MaxFunctionArguments { 125 get { return MaxFunctionArgumentsParameter.Value; } 126 set { MaxFunctionArgumentsParameter.Value = value; } 127 } 128 public ArtificialAntExpressionGrammar ArtificialAntExpressionGrammar { 129 get { return (ArtificialAntExpressionGrammar)ArtificialAntExpressionGrammarParameter.Value; } 130 } 131 public IEnumerable<IAntTrailAnalyzer> AntTrailAnalyzers { 132 get { return Operators.OfType<IAntTrailAnalyzer>(); } 133 } 134 #endregion 135 136 // BackwardsCompatibility3.3 137 #region Backwards compatible code, remove with 3.4 138 [Obsolete] 139 [Storable(Name = "operators")] 140 private IEnumerable<IOperator> oldOperators { 141 get { return null; } 142 set { 143 if (value != null && value.Any()) 144 Operators.AddRange(value); 145 } 146 } 147 #endregion 148 101 #endregion 102 103 public override bool Maximization { 104 get { return true; } 105 } 106 107 public ArtificialAntProblem() 108 : base() { 109 BoolMatrix world = new BoolMatrix(ToBoolMatrix(santaFeAntTrail)); 110 Parameters.Add(new ValueParameter<BoolMatrix>("World", "The world for the artificial ant with scattered food items.", world)); 111 Parameters.Add(new ValueParameter<IntValue>("MaximumTimeSteps", "The number of time steps the artificial ant has available to collect all food items.", new IntValue(600))); 112 113 base.BestKnownQuality = 89; 114 var g = new SimpleSymbolicExpressionGrammar(); 115 g.AddSymbols(new string[] { "IfFoodAhead", "Prog2" }, 2, 2); 116 g.AddSymbols(new string[] { "Prog3" }, 3, 3); 117 g.AddTerminalSymbols(new string[] { "Left", "Right", "Move" }); 118 base.Encoding = new SymbolicExpressionTreeEncoding(g, 20, 10); 119 120 InitializeOperators(); 121 RegisterEventHandlers(); 122 } 123 124 125 public override double Evaluate(Individual individual, IRandom random) { 126 var interpreter = new AntInterpreter(individual.SymbolicExpressionTree(), World, MaxTimeSteps.Value); 127 interpreter.Run(); 128 return interpreter.FoodEaten; 129 } 130 131 // persistence 149 132 [StorableConstructor] 150 133 private ArtificialAntProblem(bool deserializing) : base(deserializing) { } … … 154 137 } 155 138 139 // cloning 156 140 private ArtificialAntProblem(ArtificialAntProblem original, Cloner cloner) 157 141 : base(original, cloner) { … … 161 145 return new ArtificialAntProblem(this, cloner); 162 146 } 163 public ArtificialAntProblem()164 : base(new Evaluator(), new ProbabilisticTreeCreator()) {165 BoolMatrix world = new BoolMatrix(santaFeAntTrail);166 Parameters.Add(new ValueParameter<IntValue>("MaximumExpressionLength", "Maximal length of the expression to control the artificial ant.", new IntValue(100)));167 Parameters.Add(new ValueParameter<IntValue>("MaximumExpressionDepth", "Maximal depth of the expression to control the artificial ant.", new IntValue(10)));168 Parameters.Add(new ValueParameter<IntValue>("MaximumFunctionDefinitions", "Maximal number of automatically defined functions in the expression to control the artificial ant.", new IntValue(3)));169 Parameters.Add(new ValueParameter<IntValue>("MaximumFunctionArguments", "Maximal number of arguments of automatically defined functions in the expression to control the artificial ant.", new IntValue(3)));170 Parameters.Add(new ValueParameter<ISymbolicExpressionGrammar>("ArtificialAntExpressionGrammar", "The grammar that should be used for artificial ant expressions.", new ArtificialAntExpressionGrammar()));171 Parameters.Add(new ValueParameter<BoolMatrix>("World", "The world for the artificial ant with scattered food items.", world));172 Parameters.Add(new ValueParameter<IntValue>("MaximumTimeSteps", "The number of time steps the artificial ant has available to collect all food items.", new IntValue(600)));173 174 Maximization.Value = true;175 MaximizationParameter.Hidden = true;176 BestKnownQuality = new DoubleValue(89);177 SolutionCreator.SymbolicExpressionTreeParameter.ActualName = "AntTrailSolution";178 ((ProbabilisticTreeCreator)SolutionCreator).SymbolicExpressionTreeGrammarParameter.ActualName = "ArtificialAntExpressionGrammar";179 Evaluator.QualityParameter.ActualName = "FoodEaten";180 InitializeOperators();181 RegisterEventHandlers();182 183 ArtificialAntExpressionGrammar.MaximumFunctionDefinitions = MaxFunctionDefinitions.Value;184 ArtificialAntExpressionGrammar.MaximumFunctionArguments = MaxFunctionArguments.Value;185 }186 147 187 148 #region Events 188 149 protected override void OnSolutionCreatorChanged() { 189 150 base.OnSolutionCreatorChanged(); 190 SolutionCreator.SymbolicExpressionTreeParameter.ActualName = "AntTrailSolution";191 var grammarBased = SolutionCreator as ISymbolicExpressionTreeGrammarBasedOperator;192 if (grammarBased != null)193 grammarBased.SymbolicExpressionTreeGrammarParameter.ActualName = "ArtificialAntExpressionGrammar";194 195 SolutionCreator.SymbolicExpressionTreeParameter.ActualNameChanged += new EventHandler(SolutionCreator_SymbolicExpressionTreeParameter_ActualNameChanged);196 151 ParameterizeAnalyzers(); 197 152 ParameterizeOperators(); … … 199 154 protected override void OnEvaluatorChanged() { 200 155 base.OnEvaluatorChanged(); 201 Evaluator.QualityParameter.ActualName = "FoodEaten";202 Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);203 156 ParameterizeAnalyzers(); 204 157 ParameterizeOperators(); … … 216 169 #region Helpers 217 170 private void RegisterEventHandlers() { 218 SolutionCreator.SymbolicExpressionTreeParameter.ActualNameChanged += new EventHandler(SolutionCreator_SymbolicExpressionTreeParameter_ActualNameChanged);171 Encoding.SolutionCreator.SymbolicExpressionTreeParameter.ActualNameChanged += new EventHandler(SolutionCreator_SymbolicExpressionTreeParameter_ActualNameChanged); 219 172 Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 220 MaxFunctionArgumentsParameter.ValueChanged += new EventHandler(MaxFunctionArgumentsParameter_ValueChanged);221 MaxFunctionArguments.ValueChanged += new EventHandler(MaxFunctionArgumentsParameter_ValueChanged);222 MaxFunctionDefinitionsParameter.ValueChanged += new EventHandler(MaxFunctionDefinitionsParameter_ValueChanged);223 MaxFunctionDefinitions.ValueChanged += new EventHandler(MaxFunctionDefinitionsParameter_ValueChanged);224 }225 226 private void MaxFunctionDefinitionsParameter_ValueChanged(object sender, EventArgs e) {227 ArtificialAntExpressionGrammar.MaximumFunctionDefinitions = MaxFunctionDefinitions.Value;228 ParameterizeOperators();229 ParameterizeAnalyzers();230 }231 private void MaxFunctionArgumentsParameter_ValueChanged(object sender, EventArgs e) {232 ArtificialAntExpressionGrammar.MaximumFunctionArguments = MaxFunctionArguments.Value;233 ParameterizeOperators();234 ParameterizeAnalyzers();235 173 } 236 174 237 175 private void InitializeOperators() { 238 Operators.AddRange(ApplicationManager.Manager.GetInstances<ISymbolicExpressionTreeOperator>().OfType<IOperator>());239 176 Operators.Add(new BestAntTrailAnalyzer()); 240 Operators.Add(new MinAverageMaxSymbolicExpressionTreeLengthAnalyzer());241 Operators.Add(new SymbolicExpressionSymbolFrequencyAnalyzer());242 177 ParameterizeAnalyzers(); 243 178 ParameterizeOperators(); … … 245 180 246 181 private void ParameterizeAnalyzers() { 247 foreach ( IAntTrailAnalyzer analyzer in AntTrailAnalyzers) {182 foreach (var analyzer in Operators.OfType<BestAntTrailAnalyzer>()) { 248 183 analyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName; 249 analyzer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName;184 analyzer.SymbolicExpressionTreeParameter.ActualName = Encoding.SolutionCreator.SymbolicExpressionTreeParameter.ActualName; 250 185 analyzer.WorldParameter.ActualName = WorldParameter.Name; 251 186 analyzer.MaxTimeStepsParameter.ActualName = MaxTimeStepsParameter.Name; 252 187 } 253 foreach (ISymbolicExpressionTreeAnalyzer analyzer in Operators.OfType<ISymbolicExpressionTreeAnalyzer>()) { 254 analyzer.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; 188 } 189 190 private void ParameterizeOperators() { 191 // no problem-specific operators to parameterize 192 } 193 194 private bool[,] ToBoolMatrix(char[][] ch) { 195 var rows = ch.Length; 196 var cols = ch[0].Length; 197 var b = new bool[rows, cols]; 198 for (int r = 0; r < rows; r++) { 199 Contract.Assert(ch[r].Length == cols); // all rows must have the same number of columns 200 for (int c = 0; c < cols; c++) { 201 b[r, c] = ch[r][c] == '#'; 202 } 255 203 } 256 } 257 258 private void ParameterizeOperators() { 259 var operators = Parameters.OfType<IValueParameter>().Select(p => p.Value).OfType<IOperator>().Union(Operators); 260 261 foreach (ISymbolicExpressionTreeGrammarBasedOperator op in operators.OfType<ISymbolicExpressionTreeGrammarBasedOperator>()) { 262 op.SymbolicExpressionTreeGrammarParameter.ActualName = ArtificialAntExpressionGrammarParameter.Name; 263 } 264 foreach (ISymbolicExpressionTreeSizeConstraintOperator op in operators.OfType<ISymbolicExpressionTreeSizeConstraintOperator>()) { 265 op.MaximumSymbolicExpressionTreeDepthParameter.ActualName = MaxExpressionDepthParameter.Name; 266 op.MaximumSymbolicExpressionTreeLengthParameter.ActualName = MaxExpressionLengthParameter.Name; 267 268 } 269 foreach (Evaluator op in operators.OfType<Evaluator>()) { 270 op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; 271 op.MaxTimeStepsParameter.ActualName = MaxTimeStepsParameter.Name; 272 op.WorldParameter.ActualName = WorldParameter.Name; 273 } 274 foreach (ISymbolicExpressionTreeCrossover op in operators.OfType<ISymbolicExpressionTreeCrossover>()) { 275 op.ParentsParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; 276 op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; 277 } 278 foreach (ISymbolicExpressionTreeManipulator op in operators.OfType<ISymbolicExpressionTreeManipulator>()) { 279 op.SymbolicExpressionTreeParameter.ActualName = SolutionCreator.SymbolicExpressionTreeParameter.ActualName; 280 } 281 foreach (ISymbolicExpressionTreeArchitectureAlteringOperator op in operators.OfType<ISymbolicExpressionTreeArchitectureAlteringOperator>()) { 282 op.MaximumFunctionDefinitionsParameter.ActualName = MaxFunctionDefinitionsParameter.Name; 283 op.MaximumFunctionArgumentsParameter.ActualName = MaxFunctionArgumentsParameter.Name; 284 } 204 return b; 285 205 } 286 206 #endregion
Note: See TracChangeset
for help on using the changeset viewer.