Changeset 15906 for branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SchemaDiversification/SchemaCreator.cs
- Timestamp:
- 04/16/18 08:35:59 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.EvolutionTracking/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Tracking/SchemaDiversification/SchemaCreator.cs
r15482 r15906 39 39 public class SchemaCreator : EvolutionTrackingOperator<ISymbolicExpressionTree> { 40 40 #region parameter names 41 // criteria to trigger schema-based diversification 41 42 private const string MinimumSchemaLengthParameterName = "MinimumSchemaLength"; 42 43 private const string MinimumSchemaFrequencyParameterName = "MinimumSchemaFrequency"; 43 44 private const string MinimumPhenotypicSimilarityParameterName = "MinimumPhenotypicSimilarity"; 44 private const string ReplacementRatioParameterName = "ReplacementRatio"; 45 private const string RandomReplacementParameterName = "RandomReplacement"; 45 // parameters controlling the diversification strategy 46 private const string UseAdaptiveMutationRateParameterName = "UseAdaptiveMutationRate"; // dynamically control mutation rate 47 private const string MutationRateUpdateRuleParameterName = "ReplacementRatioUpdateRule"; 48 private const string MutationRateParameterName = "MutationRate"; // fixed mutation rate when not using adaptive update 49 private const string ExclusiveMatchingParameterName = "ExclusiveMatching"; // an individual can belong to only 1 schema 50 private const string ParentsRatio = "ParentsRatio"; // use best % parents to generate schemas from 51 private const string StrictSchemaMatchingParameterName = "StrictSchemaMatching"; // use strict node comparison (for constant values and variable weights) 52 private const string SchemaDefinitionParameterName = "SchemaDefinition"; // which schema definition to use: {=}, {#} or {=,#} 53 private const string SchemaManipulatorParameterName = "SchemaManipulator"; // mutation operator to apply within schemas 54 55 // control parallel behaviour 46 56 private const string ExecuteInParallelParameterName = "ExecuteInParallel"; 47 57 private const string MaxDegreeOfParalellismParameterName = "MaxDegreeOfParallelism"; 48 private const string PercentageOfPopulationParameterName = "PercentageOfPopulationToDiversify";49 58 private const string ScaleEstimatedValuesParameterName = "ScaleEstimatedValues"; 50 private const string ExclusiveMatchingParameterName = "ExclusiveMatching"; 59 60 private const string UpdateCounterParameterName = "UpdateCounter"; 61 private const string UpdateIntervalParameterName = "UpdateInterval"; 62 63 #region information parameters 51 64 private const string NumberOfChangedTreesParameterName = "NumberOfChangedTrees"; 52 65 private const string NumberOfSchemasParameterName = "NumberOfSchemas"; 53 66 private const string AverageSchemaLengthParameterName = "AverageSchemaLength"; 54 private const string UseAdaptiveReplacementRatioParameterName = "UseAdaptiveReplacementRatio"; 55 private const string ReplacementRatioUpdateRuleParameterName = "ReplacementRatioUpdateRule"; 56 private const string StrictSchemaMatchingParameterName = "StrictSchemaMatching"; 57 private const string SchemaDefinitionParameterName = "SchemaDefinition"; 58 private const string SchemaManipulatorParameterName = "SchemaManipulator"; 67 #endregion 59 68 #endregion 60 69 … … 66 75 get { return (IConstrainedValueParameter<StringValue>)Parameters[SchemaDefinitionParameterName]; } 67 76 } 68 public IConstrainedValueParameter<StringValue> ReplacementRatioUpdateRuleParameter {69 get { return (IConstrainedValueParameter<StringValue>)Parameters[ ReplacementRatioUpdateRuleParameterName]; }70 } 71 public IFixedValueParameter<BoolValue> UseAdaptive ReplacementRatioParameter {72 get { return (IFixedValueParameter<BoolValue>)Parameters[UseAdaptive ReplacementRatioParameterName]; }77 public IConstrainedValueParameter<StringValue> MutationRateUpdateRuleParameter { 78 get { return (IConstrainedValueParameter<StringValue>)Parameters[MutationRateUpdateRuleParameterName]; } 79 } 80 public IFixedValueParameter<BoolValue> UseAdaptiveMutationRateParameter { 81 get { return (IFixedValueParameter<BoolValue>)Parameters[UseAdaptiveMutationRateParameterName]; } 73 82 } 74 83 public IFixedValueParameter<BoolValue> StrictSchemaMatchingParameter { … … 81 90 get { return (IFixedValueParameter<BoolValue>)Parameters[ScaleEstimatedValuesParameterName]; } 82 91 } 83 public IFixedValueParameter<PercentValue> P ercentageOfPopulationParameter {84 get { return (IFixedValueParameter<PercentValue>)Parameters[P ercentageOfPopulationParameterName]; }92 public IFixedValueParameter<PercentValue> ParentsRatioParameter { 93 get { return (IFixedValueParameter<PercentValue>)Parameters[ParentsRatio]; } 85 94 } 86 95 public IFixedValueParameter<IntValue> MinimumSchemaLengthParameter { … … 99 108 get { return (IFixedValueParameter<PercentValue>)Parameters[MinimumPhenotypicSimilarityParameterName]; } 100 109 } 101 public IFixedValueParameter<PercentValue> ReplacementRatioParameter {102 get { return (IFixedValueParameter<PercentValue>)Parameters[ ReplacementRatioParameterName]; }110 public IFixedValueParameter<PercentValue> MutationRateParameter { 111 get { return (IFixedValueParameter<PercentValue>)Parameters[MutationRateParameterName]; } 103 112 } 104 113 public IValueParameter<IntValue> NumberOfSchemasParameter { … … 110 119 public IValueParameter<IntValue> NumberOfChangedTreesParameter { 111 120 get { return (IValueParameter<IntValue>)Parameters[NumberOfChangedTreesParameterName]; } 121 } 122 public IFixedValueParameter<IntValue> UpdateCounterParameter { 123 get { return (IFixedValueParameter<IntValue>)Parameters[UpdateCounterParameterName]; } 124 } 125 public IFixedValueParameter<IntValue> UpdateIntervalParameter { 126 get { return (IFixedValueParameter<IntValue>)Parameters[UpdateIntervalParameterName]; } 112 127 } 113 128 #endregion … … 117 132 public int MaxDegreeOfParallelism { get { return MaxDegreeOfParallelismParameter.Value.Value; } } 118 133 public bool ExecuteInParallel { get { return ExecuteInParallelParameter.Value.Value; } } 119 public double PercentageOfPopulation { get { return P ercentageOfPopulationParameter.Value.Value; } }134 public double PercentageOfPopulation { get { return ParentsRatioParameter.Value.Value; } } 120 135 public bool StrictSchemaMatching { get { return StrictSchemaMatchingParameter.Value.Value; } } 136 public IntValue UpdateCounter { get { return UpdateCounterParameter.Value; } } 137 public IntValue UpdateInterval { get { return UpdateIntervalParameter.Value; } } 138 121 139 #endregion 122 140 123 141 private UpdateQualityOperator updateQualityOperator; 124 142 private DiversificationStatisticsOperator diversificationStatisticsOperator; 143 144 public override void InitializeState() { 145 base.InitializeState(); 146 NumberOfChangedTreesParameter.Value.Value = 0; 147 NumberOfChangedTreesParameter.Value.Value = 0; 148 AverageSchemaLengthParameter.Value.Value = 0; 149 UpdateCounter.Value = 0; 150 } 125 151 126 152 public override void ClearState() { … … 128 154 NumberOfChangedTreesParameter.Value.Value = 0; 129 155 AverageSchemaLengthParameter.Value.Value = 0; 156 UpdateCounter.Value = 0; 130 157 base.ClearState(); 131 158 } … … 136 163 Parameters.Add(new FixedValueParameter<PercentValue>(MinimumSchemaFrequencyParameterName, new PercentValue(0.01))); 137 164 Parameters.Add(new FixedValueParameter<PercentValue>(MinimumPhenotypicSimilarityParameterName, new PercentValue(0.9))); 138 Parameters.Add(new FixedValueParameter<PercentValue>(ReplacementRatioParameterName, new PercentValue(0.9))); 139 Parameters.Add(new FixedValueParameter<PercentValue>(PercentageOfPopulationParameterName, new PercentValue(1))); 140 Parameters.Add(new FixedValueParameter<BoolValue>(RandomReplacementParameterName, new BoolValue(false))); 165 Parameters.Add(new FixedValueParameter<PercentValue>(MutationRateParameterName, new PercentValue(0.9))); 166 Parameters.Add(new FixedValueParameter<PercentValue>(ParentsRatio, new PercentValue(1))); 141 167 Parameters.Add(new FixedValueParameter<BoolValue>(ExecuteInParallelParameterName, new BoolValue(false))); 142 168 Parameters.Add(new FixedValueParameter<IntValue>(MaxDegreeOfParalellismParameterName, new IntValue(-1))); … … 147 173 Parameters.Add(new ValueParameter<IntValue>(NumberOfSchemasParameterName, new IntValue(0))); 148 174 Parameters.Add(new ValueParameter<DoubleValue>(AverageSchemaLengthParameterName, new DoubleValue(0))); 149 Parameters.Add(new FixedValueParameter<BoolValue>(UseAdaptiveReplacementRatioParameterName, new BoolValue(true))); 175 Parameters.Add(new FixedValueParameter<BoolValue>(UseAdaptiveMutationRateParameterName, new BoolValue(true))); 176 Parameters.Add(new FixedValueParameter<IntValue>(UpdateCounterParameterName, new IntValue(0))); 177 Parameters.Add(new FixedValueParameter<IntValue>(UpdateIntervalParameterName, new IntValue(1))); 150 178 151 179 // add update rules 152 var replacementRatioUpdateRules = new ItemSet<StringValue>(new[] {180 var mutationRateUpdateRules = new ItemSet<StringValue>(new[] { 153 181 new StringValue("f(x) = x"), 154 182 new StringValue("f(x) = tanh(x)"), … … 158 186 new StringValue("f(x) = 1-sqrt(1-x)") 159 187 }); 160 var replacementRatioUpdateRuleParameter = new ConstrainedValueParameter<StringValue>(ReplacementRatioUpdateRuleParameterName, replacementRatioUpdateRules);161 replacementRatioUpdateRuleParameter.Value = replacementRatioUpdateRules.First();162 Parameters.Add( replacementRatioUpdateRuleParameter);188 var mutationRateUpdateRuleParameter = new ConstrainedValueParameter<StringValue>(MutationRateUpdateRuleParameterName, mutationRateUpdateRules); 189 mutationRateUpdateRuleParameter.Value = mutationRateUpdateRules.First(); 190 Parameters.Add(mutationRateUpdateRuleParameter); 163 191 164 192 // add schema definitions … … 208 236 209 237 public override IOperation Apply() { 238 UpdateCounter.Value++; 239 if (UpdateCounter.Value != UpdateInterval.Value) 240 return base.Apply(); 241 UpdateCounter.Value = 0; 242 210 243 // apply only when at least one generation has passed 211 244 var gen = Generations.Value; … … 213 246 return base.Apply(); 214 247 215 var n = (int)Math.Round(ExecutionContext.Scope.SubScopes.Count * PercentageOfPopulation);216 248 217 249 var updateEstimatedValues = new OperationCollection { Parallel = true }; … … 219 251 updateQualityOperator = new UpdateQualityOperator(); 220 252 221 foreach (var s in ExecutionContext.Scope.SubScopes.Where(s => !s.Variables.ContainsKey("EstimatedValues"))) { 253 var scope = ExecutionContext.Scope; 254 255 foreach (var s in scope.SubScopes.Where(s => !s.Variables.ContainsKey("EstimatedValues"))) { 222 256 updateEstimatedValues.Add(ExecutionContext.CreateChildOperation(updateQualityOperator, s)); 223 257 } 224 258 225 var replacementRule = ReplacementRatioUpdateRuleParameter.Value.Value;259 var updateRule = MutationRateUpdateRuleParameter.Value.Value; 226 260 var schemaManipulator = SchemaManipulatorParameter.Value; 227 261 228 262 var evaluateSchemas = new OperationCollection(); 229 263 264 Func<IScope, double> getQuality = s => ((DoubleValue)s.Variables["Quality"].Value).Value; 265 266 var bestN = (int)Math.Round(scope.SubScopes.Count * PercentageOfPopulation); 267 var scopes = new ScopeList(scope.SubScopes.OrderByDescending(getQuality).Take(bestN)); 230 268 // for now, only consider crossover offspring 231 var scopes = new ScopeList(ExecutionContext.Scope.SubScopes.OrderByDescending(x => ((DoubleValue)x.Variables["Quality"].Value).Value).Take(n));232 269 var vertices = from s in scopes 233 270 let t = (ISymbolicExpressionTree)s.Variables["SymbolicExpressionTree"].Value … … 236 273 select v; 237 274 238 List<ISymbolicExpressionTree> schemas;275 IEnumerable<ISymbolicExpressionTree> schemas; 239 276 switch (SchemaDefinitionParameter.Value.Value) { 240 277 case "=": 241 schemas = GenerateAnyNodeSchemas(vertices, MinimumSchemaLength, 0, StrictSchemaMatching) .ToList();278 schemas = GenerateAnyNodeSchemas(vertices, MinimumSchemaLength, 0, StrictSchemaMatching); 242 279 break; 243 280 case "#": 244 schemas = GenerateAnySubtreeSchemas(vertices, MinimumSchemaLength, 0, StrictSchemaMatching) .ToList();281 schemas = GenerateAnySubtreeSchemas(vertices, MinimumSchemaLength, 0, StrictSchemaMatching); 245 282 break; 246 283 case "=,#": 247 schemas = GenerateCombinedSchemas(vertices, MinimumSchemaLength, 0, StrictSchemaMatching) .ToList();284 schemas = GenerateCombinedSchemas(vertices, MinimumSchemaLength, 0, StrictSchemaMatching); 248 285 break; 249 286 default: … … 255 292 256 293 #region create schemas and add subscopes representing the individuals 294 double avgLength = 0; 295 int count = 0; 257 296 foreach (var schema in schemas) { 258 evaluateSchemas.Add(ExecutionContext.CreateChildOperation(new SchemaEvaluator { Schema = schema, ReplacementRule = replacementRule, SchemaManipulator = schemaManipulator }, ExecutionContext.Scope)); 297 avgLength += schema.Length; 298 ++count; 299 evaluateSchemas.Add(ExecutionContext.CreateChildOperation(new SchemaEvaluator { Schema = schema, MutationRateUpdateRule = updateRule, SchemaManipulator = schemaManipulator }, scope)); 259 300 } 301 avgLength /= count; 260 302 #endregion 303 304 // set parameters for statistics 305 AverageSchemaLengthParameter.Value = new DoubleValue(avgLength); 306 NumberOfSchemasParameter.Value = new IntValue(count); 307 NumberOfChangedTreesParameter.Value = new IntValue(0); 261 308 262 309 if (diversificationStatisticsOperator == null) … … 264 311 265 312 var calculateStatistics = ExecutionContext.CreateChildOperation(diversificationStatisticsOperator); 266 267 // set parameters for statistics268 AverageSchemaLengthParameter.Value = new DoubleValue(schemas.Average(x => x.Length));269 NumberOfSchemasParameter.Value = new IntValue(schemas.Count);270 NumberOfChangedTreesParameter.Value = new IntValue(0);271 313 272 314 // return an operation collection containing all the scope operations + base.Apply()
Note: See TracChangeset
for help on using the changeset viewer.