Changeset 14875 for branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblem.cs
- Timestamp:
- 04/18/17 01:15:25 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblem.cs
r14834 r14875 12 12 using Expressions; 13 13 using HeuristicLab.Data; 14 using HeuristicLab.Problems.ProgramSynthesis. Push.Erc;14 using HeuristicLab.Problems.ProgramSynthesis.Base.Erc; 15 15 16 16 using Instances; … … 25 25 [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 180)] 26 26 [Item("Push Problem", "")] 27 public class PushProblem : SingleObjectiveBasicProblem<IntegerVectorEncoding>, IProblemInstanceConsumer< Data> {27 public class PushProblem : SingleObjectiveBasicProblem<IntegerVectorEncoding>, IProblemInstanceConsumer<ProblemData> { 28 28 [Storable] 29 29 private readonly PushConfiguration config; … … 32 32 33 33 public const string CaseQualitiesScopeParameterName = "CaseQualities"; 34 private const string BestTrainingSolutionResultName = "Best Solution"; 35 private const string TestQualityResultName = "Test Quality"; 34 36 35 37 public PushProblem() { … … 63 65 private void InitData() { 64 66 pool = new PushInterpreterPool(Environment.ProcessorCount * 2, 4096, 1024, config); 65 66 //var solutionCreator = new PointsBasedPushProgramCreator(config.ErcOptions);67 //SolutionCreator = solutionCreator;68 //Encoding.SolutionCreator = solutionCreator;69 67 } 70 68 … … 93 91 private const string TopLevelPopCodeParameterName = "TopLevelPopCode"; 94 92 private const string TopLevelPopCodeParameterDescription = "When TRUE, the CODE stack will be popped at the end of top level calls to the interpreter. The default is FALSE."; 95 private const string MinRandomIntegerParameterName = "MinRandomInteger";96 private const string MinRandomIntegerParameterDescription = "The minimum INTEGER that will be produced as an ephemeral random INTEGER constant or from a call to INTEGER.RAND.";97 private const string MaxRandomIntegerParameterName = "MaxRandomInteger";98 private const string MaxRandomIntegerParameterDescription = "The maximum INTEGER that will be produced as an ephemeral random INTEGER constant or from a call to INTEGER.RAND.";99 private const string MinRandomFloatParameterName = "MinRandomFloat";100 private const string MinRandomFloatParameterDescription = "The minimum FLOAT that will be produced as an ephemeral random FLOAT constant or from a call to FLOAT.RAND.";101 private const string MaxRandomFloatParameterName = "MaxRandomFloat";102 private const string MaxRandomFloatParameterDescription = "The maximum FLOAT that will be produced as an ephemeral random FLOAT constant or from a call to FLOAT.RAND.";103 private const string NewErcNameProbabilityParameterName = "NewErcNameProbability";104 private const string NewErcNameProbabilityParameterDescription = "The probability that the selection of the ephemeral random NAME constant for inclusion in randomly generated code will produce a new name.";105 93 private const string MaxPointsInRandomInstructionParameterName = "MaxPointsInRandomInstruction"; 106 94 private const string MaxPointsInRandomInstructionParameterDescription = "MaxPointsInRandomInstruction"; … … 117 105 config)); 118 106 119 Parameters.Add(new ValueParameter< Data>(107 Parameters.Add(new ValueParameter<ProblemData>( 120 108 DataParameterName, 121 109 DataParameterDescription)); 122 110 123 Parameters.Add(new FixedValueParameter<ErcOptions>(ErcOptionsParameterName, config.ErcOptions));111 Parameters.Add(new ValueParameter<ErcOptions>(ErcOptionsParameterName, config.ErcOptions)); 124 112 125 113 Parameters.Add(new FixedValueParameter<IntValue>( … … 188 176 } 189 177 190 public IValueParameter< Data> DataParameter191 { 192 get { return (IValueParameter< Data>)Parameters[DataParameterName]; }193 } 194 195 public Data Data178 public IValueParameter<ProblemData> DataParameter 179 { 180 get { return (IValueParameter<ProblemData>)Parameters[DataParameterName]; } 181 } 182 183 public ProblemData Data 196 184 { 197 185 get { return DataParameter.Value; } … … 356 344 357 345 public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) { 358 const string bestSolutionResultName = "Best Solution";359 346 var bestQuality = Maximization ? qualities.Max() : qualities.Min(); 360 347 var bestIdx = Array.IndexOf(qualities, bestQuality); 361 var bestIndividual = individuals[bestIdx]; 362 var solution = new PushSolution(bestIndividual.IntegerVector(), bestQuality, Data, random, config, DataBounds.TrainingRange.Start, DataBounds.TrainingRange.End); 363 364 if (!results.ContainsKey(bestSolutionResultName)) { 365 results.Add(new Result(bestSolutionResultName, solution)); 348 var bestIndividual = individuals[bestIdx].IntegerVector(); 349 350 var isIndividualBetter = AnalyzeBestTrainingSolution(bestIndividual, bestQuality, results, random); 351 352 if (isIndividualBetter) { 353 AnalyzeBestTestSolution(bestIndividual, results, random); 354 } 355 } 356 357 private void AnalyzeBestTestSolution(IntegerVector bestIndividual, ResultCollection results, IRandom random) { 358 var program = bestIndividual.ToPushProgram(config, randomPool); 359 var trainingResult = PushEvaluator.Evaluate(program, pool, random, Data, DataBounds.TestRange.Start, DataBounds.TestRange.End); 360 361 if (!results.ContainsKey(TestQualityResultName)) { 362 results.Add(new Result(TestQualityResultName, new DoubleValue(trainingResult.TotalQuality))); 366 363 } else { 367 var currentBestQuality = ((PushSolution)results[bestSolutionResultName].Value).Quality; 368 369 if (Maximization && currentBestQuality < bestQuality || 370 !Maximization && currentBestQuality > bestQuality) { 371 results[bestSolutionResultName].Value = solution; 372 } 373 } 364 ((DoubleValue)results[TestQualityResultName].Value).Value = trainingResult.TotalQuality; 365 } 366 } 367 368 private bool AnalyzeBestTrainingSolution(IntegerVector bestIndividual, double bestQuality, ResultCollection results, IRandom random) { 369 var solution = new PushSolution(bestIndividual, bestQuality, Data, random, config, DataBounds.TrainingRange.Start, DataBounds.TrainingRange.End); 370 371 if (!results.ContainsKey(BestTrainingSolutionResultName)) { 372 results.Add(new Result(BestTrainingSolutionResultName, solution)); 373 return true; 374 } 375 376 var currentBestQuality = ((PushSolution)results[BestTrainingSolutionResultName].Value).Quality; 377 378 if (Maximization && currentBestQuality < bestQuality || 379 !Maximization && currentBestQuality > bestQuality) { 380 results[BestTrainingSolutionResultName].Value = solution; 381 return true; 382 } 383 384 return false; 374 385 } 375 386 … … 389 400 } 390 401 391 public void Load( Data data) {402 public void Load(ProblemData data) { 392 403 Data = data; 393 404 BestKnownQuality = data.BestResult; 394 405 MaxPointsInProgram = data.MaxSize; 395 406 EvalPushLimit = data.EvalLimit; 407 ErcOptions = data.ErcOptions; 396 408 397 409 config.EnabledExpressions = (IList<string>)ExpressionTable.GetExpressionsByStackTypes((StackTypes)data.EnabledDataTypes); … … 408 420 409 421 DataBounds.TrainingRange.Start = 0; 410 DataBounds.TrainingRange.End = Data. OriginalTrainingCount;411 DataBounds.TestRange.Start = Data. OriginalTrainingCount;412 DataBounds.TestRange.End = Data. OriginalTrainingCount + Data.OriginalTestCount;422 DataBounds.TrainingRange.End = Data.TrainingCount; 423 DataBounds.TestRange.Start = Data.TrainingCount; 424 DataBounds.TestRange.End = Data.TrainingCount + Data.TestCount; 413 425 } 414 426 }
Note: See TracChangeset
for help on using the changeset viewer.