Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/03/15 17:09:44 (8 years ago)
Author:
pfleck
Message:

#2269

  • Instead of hidden execution scope change logic in LayerReseeder, the new ReseedingController makes the scope change more obvious by using an OperatorParameter.
  • Instead of the classes for EldersEmigrator, LayerOpener and LayerReseeder the operator graph is created in the AlpsGeneticAlgorithmMainLoop using CombinedOperator.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ALPS/HeuristicLab.Algorithms.ALPS/3.3/AlpsGeneticAlgorithmMainLoop.cs

    r13096 r13111  
    3030using HeuristicLab.Parameters;
    3131using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     32using HeuristicLab.Selection;
    3233
    3334namespace HeuristicLab.Algorithms.ALPS {
     
    8384      var generationsIcrementor = new IntCounter() { Name = "Increment Generations" };
    8485      var evaluatedSolutionsReducer = new DataReducer() { Name = "Increment EvaluatedSolutions" };
    85       var eldersEmigrator = new EldersEmigrator() { Name = "Emigrate Elders" };
    86       var layerOpener = new LayerOpener() { Name = "Open new Layer" };
    87       var layerReseeder = new LayerReseeder() { Name = "Reseed Layer Zero" };
     86      var eldersEmigrator = CreateEldersEmigrator();
     87      var layerOpener = CreateLayerOpener();
     88      var layerReseeder = CreateReseeder();
    8889      var layerAnalyzerProcessor = new UniformSubScopesProcessor();
    8990      var layerAnalyzerPlaceholder = new Placeholder() { Name = "LayerAnalyzer (Placeholder)" };
     
    153154      termination.ContinueBranch = matingPoolCreator;
    154155    }
     156
     157    private static CombinedOperator CreateEldersEmigrator() {
     158      var eldersEmigrator = new CombinedOperator() { Name = "Emigrate Elders" };
     159      var selectorProsessor = new UniformSubScopesProcessor();
     160      var eldersSelector = new EldersSelector();
     161      var shiftToRightMigrator = new UnidirectionalRingMigrator();
     162      var mergingProsessor = new UniformSubScopesProcessor();
     163      var mergingReducer = new MergingReducer();
     164      var subScopesCounter = new SubScopesCounter();
     165      var countCalculator = new ExpressionCalculator() { Name = "LayerPopulationSize = Min(LayerPopulationSize, PopulationSize)" };
     166      var bestSelector = new BestSelector();
     167      var rightReducer = new RightReducer();
     168
     169      eldersEmigrator.OperatorGraph.InitialOperator = selectorProsessor;
     170
     171      selectorProsessor.Operator = eldersSelector;
     172      selectorProsessor.Successor = shiftToRightMigrator;
     173
     174      shiftToRightMigrator.ClockwiseMigrationParameter.Value = new BoolValue(true);
     175      shiftToRightMigrator.Successor = mergingProsessor;
     176
     177      mergingProsessor.Operator = mergingReducer;
     178
     179      mergingReducer.Successor = subScopesCounter;
     180
     181      subScopesCounter.ValueParameter.ActualName = "LayerPopulationSize";
     182      subScopesCounter.AccumulateParameter.Value = new BoolValue(false);
     183      subScopesCounter.Successor = countCalculator;
     184
     185      countCalculator.CollectedValues.Add(new LookupParameter<IntValue>("PopulationSize"));
     186      countCalculator.CollectedValues.Add(new LookupParameter<IntValue>("LayerPopulationSize"));
     187      countCalculator.ExpressionParameter.Value = new StringValue("LayerPopulationSize PopulationSize LayerPopulationSize PopulationSize < if toint");
     188      countCalculator.ExpressionResultParameter.ActualName = "LayerPopulationSize";
     189      countCalculator.Successor = bestSelector;
     190
     191      bestSelector.NumberOfSelectedSubScopesParameter.ActualName = "LayerPopulationSize";
     192      bestSelector.CopySelected = new BoolValue(false);
     193      bestSelector.Successor = rightReducer;
     194
     195      return eldersEmigrator;
     196    }
     197
     198    private static CombinedOperator CreateLayerOpener() {
     199      var layerOpener = new CombinedOperator() { Name = "Open new Layer if needed" };
     200      var maxLayerReached = new Comparator() { Name = "MaxLayersReached = OpenLayers >= NumberOfLayers" };
     201      var maxLayerReachedBranch = new ConditionalBranch() { Name = "MaxLayersReached?" };
     202      var openNewLayerCalculator = new ExpressionCalculator() { Name = "OpenNewLayer = Generations >= AgeLimits[OpenLayers - 1]" };
     203      var openNewLayerBranch = new ConditionalBranch() { Name = "OpenNewLayer?" };
     204      var layerCreator = new LayerCreator() { Name = "Create Layer" };
     205      var createChildrenViaCrossover = AlpsGeneticAlgorithmMainOperator.Create();
     206      var incrEvaluatedSolutionsForNewLayer = new SubScopesCounter() { Name = "Update EvaluatedSolutions" };
     207      var incrOpenLayers = new IntCounter() { Name = "Incr. OpenLayers" };
     208      var newLayerResultsCollector = new ResultsCollector() { Name = "Collect new Layer Results" };
     209
     210      layerOpener.OperatorGraph.InitialOperator = maxLayerReached;
     211
     212      maxLayerReached.LeftSideParameter.ActualName = "OpenLayers";
     213      maxLayerReached.RightSideParameter.ActualName = "NumberOfLayers";
     214      maxLayerReached.ResultParameter.ActualName = "MaxLayerReached";
     215      maxLayerReached.Comparison = new Comparison(ComparisonType.GreaterOrEqual);
     216      maxLayerReached.Successor = maxLayerReachedBranch;
     217
     218      maxLayerReachedBranch.ConditionParameter.ActualName = "MaxLayerReached";
     219      maxLayerReachedBranch.FalseBranch = openNewLayerCalculator;
     220
     221      openNewLayerCalculator.CollectedValues.Add(new LookupParameter<IntArray>("AgeLimits"));
     222      openNewLayerCalculator.CollectedValues.Add(new LookupParameter<IntValue>("Generations"));
     223      openNewLayerCalculator.CollectedValues.Add(new LookupParameter<IntValue>("NumberOfLayers"));
     224      openNewLayerCalculator.CollectedValues.Add(new LookupParameter<IntValue>("OpenLayers"));
     225      openNewLayerCalculator.ExpressionResultParameter.ActualName = "OpenNewLayer";
     226      openNewLayerCalculator.ExpressionParameter.Value = new StringValue("Generations 1 + AgeLimits OpenLayers 1 - [] >");
     227      openNewLayerCalculator.Successor = openNewLayerBranch;
     228
     229      openNewLayerBranch.ConditionParameter.ActualName = "OpenNewLayer";
     230      openNewLayerBranch.TrueBranch = layerCreator;
     231
     232      layerCreator.NewLayerOperator = createChildrenViaCrossover;
     233      layerCreator.Successor = incrOpenLayers;
     234
     235      createChildrenViaCrossover.Successor = incrEvaluatedSolutionsForNewLayer;
     236
     237      incrEvaluatedSolutionsForNewLayer.ValueParameter.ActualName = "EvaluatedSolutions";
     238      incrEvaluatedSolutionsForNewLayer.AccumulateParameter.Value = new BoolValue(true);
     239
     240      incrOpenLayers.ValueParameter.ActualName = "OpenLayers";
     241      incrOpenLayers.Increment = new IntValue(1);
     242      incrOpenLayers.Successor = newLayerResultsCollector;
     243
     244      newLayerResultsCollector.CollectedValues.Add(new ScopeTreeLookupParameter<ResultCollection>("LayerResults", "Result set for each layer", "LayerResults"));
     245      newLayerResultsCollector.CopyValue = new BoolValue(false);
     246      newLayerResultsCollector.Successor = null;
     247
     248      return layerOpener;
     249    }
     250
     251    private static CombinedOperator CreateReseeder() {
     252      var reseeder = new CombinedOperator() { Name = "Reseed Layer Zero if needed" };
     253      var reseedingController = new ReseedingController() { Name = "Reseeding needed (Generation % AgeGap == 0)?" };
     254      var removeIndividuals = new SubScopesRemover();
     255      var createIndividuals = new SolutionsCreator();
     256      var initializeAgeProsessor = new UniformSubScopesProcessor();
     257      var initializeAge = new VariableCreator() { Name = "Initialize Age" };
     258      var incrEvaluatedSolutionsAfterReseeding = new SubScopesCounter() { Name = "Update EvaluatedSolutions" };
     259
     260      reseeder.OperatorGraph.InitialOperator = reseedingController;
     261
     262      reseedingController.FirstLayerOperator = removeIndividuals;
     263
     264      removeIndividuals.Successor = createIndividuals;
     265
     266      createIndividuals.NumberOfSolutionsParameter.ActualName = "PopulationSize";
     267      createIndividuals.Successor = initializeAgeProsessor;
     268
     269      initializeAgeProsessor.Operator = initializeAge;
     270      initializeAgeProsessor.Successor = incrEvaluatedSolutionsAfterReseeding;
     271
     272      initializeAge.CollectedValues.Add(new ValueParameter<DoubleValue>("Age", new DoubleValue(0)));
     273
     274      incrEvaluatedSolutionsAfterReseeding.ValueParameter.ActualName = "EvaluatedSolutions";
     275      incrEvaluatedSolutionsAfterReseeding.AccumulateParameter.Value = new BoolValue(true);
     276
     277      return reseeder;
     278    }
    155279  }
    156280}
Note: See TracChangeset for help on using the changeset viewer.