private CombinedOperator CreateEldersEmigrator() { var eldersEmigrator = new CombinedOperator() { Name = "Emigrate Elders" }; var selectorProsessor = new UniformSubScopesProcessor(); var eldersSelector = new EldersSelector(); var shiftToRightMigrator = new UnidirectionalRingMigrator() { Name = "Shift elders to next layer" }; var mergingProsessor = new UniformSubScopesProcessor(); var mergingReducer = new MergingReducer(); var subScopesCounter = new SubScopesCounter(); var reduceToPopulationSizeBranch = new ConditionalBranch() { Name = "ReduceToPopulationSize?" }; var countCalculator = new ExpressionCalculator() { Name = "CurrentPopulationSize = Min(CurrentPopulationSize, PopulationSize)" }; var bestSelector = new BestSelector(); var rightReducer = new RightReducer(); eldersEmigrator.OperatorGraph.InitialOperator = selectorProsessor; selectorProsessor.Operator = eldersSelector; selectorProsessor.Successor = shiftToRightMigrator; eldersSelector.AgeParameter.ActualName = AgeParameter.Name; eldersSelector.AgeLimitsParameter.ActualName = AgeLimitsParameter.Name; eldersSelector.NumberOfLayersParameter.ActualName = NumberOfLayersParameter.Name; eldersSelector.LayerParameter.ActualName = "Layer"; eldersSelector.Successor = null; shiftToRightMigrator.ClockwiseMigrationParameter.Value = new BoolValue(true); shiftToRightMigrator.Successor = mergingProsessor; mergingProsessor.Operator = mergingReducer; mergingReducer.Successor = subScopesCounter; subScopesCounter.ValueParameter.ActualName = CurrentPopulationSizeParameter.Name; subScopesCounter.AccumulateParameter.Value = new BoolValue(false); subScopesCounter.Successor = reduceToPopulationSizeBranch; reduceToPopulationSizeBranch.ConditionParameter.ActualName = ReduceToPopulationSizeParameter.Name; reduceToPopulationSizeBranch.TrueBranch = countCalculator; countCalculator.CollectedValues.Add(new LookupParameter <IntValue>(PopulationSizeParameter.Name)); countCalculator.CollectedValues.Add(new LookupParameter <IntValue>(CurrentPopulationSizeParameter.Name)); countCalculator.ExpressionParameter.Value = new StringValue("CurrentPopulationSize PopulationSize CurrentPopulationSize PopulationSize < if toint"); countCalculator.ExpressionResultParameter.ActualName = CurrentPopulationSizeParameter.Name; countCalculator.Successor = bestSelector; bestSelector.NumberOfSelectedSubScopesParameter.ActualName = CurrentPopulationSizeParameter.Name; bestSelector.CopySelected = new BoolValue(false); bestSelector.Successor = rightReducer; return(eldersEmigrator); }
private CombinedOperator CreateEldersEmigrator() { var eldersEmigrator = new CombinedOperator { Name = "Emigrate Elders" }; var selectorProcessor = new UniformSubScopesProcessor(); var eldersSelector = new EldersSelector(); var shiftToRightMigrator = new UnidirectionalRingMigrator { Name = "Shift elders to next layer" }; var mergingProcessor = new UniformSubScopesProcessor(); var mergingReducer = new MergingReducer(); var subScopesCounter1 = new SubScopesCounter(); var currentPopulationSizeComparator = new Comparator { Name = "Is CurrentPopulationSize greater than 1?" }; var currentPopulationSizeIsGreaterThanOne = new ConditionalBranch { Name = "CurrentPopulationSize > 1" }; var reduceToPopulationSizeBranch = new ConditionalBranch { Name = "ReduceToPopulationSize?" }; var countCalculator = new ExpressionCalculator { Name = "CurrentPopulationSize = Min(CurrentPopulationSize, PopulationSize)" }; var leftSelector = new LeftSelector(); var rankAndCrowdingSorter = new RankAndCrowdingSorter(); var subScopesCounter2 = new SubScopesCounter(); var rightReducer = new RightReducer(); eldersEmigrator.OperatorGraph.InitialOperator = selectorProcessor; selectorProcessor.Operator = eldersSelector; selectorProcessor.Successor = shiftToRightMigrator; eldersSelector.AgeParameter.ActualName = AgeParameter.Name; eldersSelector.AgeLimitsParameter.ActualName = AgeLimitsParameter.Name; eldersSelector.NumberOfLayersParameter.ActualName = NumberOfLayersParameter.Name; eldersSelector.LayerParameter.ActualName = "Layer"; eldersSelector.Successor = null; shiftToRightMigrator.ClockwiseMigrationParameter.Value = new BoolValue(true); shiftToRightMigrator.Successor = mergingProcessor; mergingProcessor.Operator = mergingReducer; mergingReducer.Successor = subScopesCounter1; subScopesCounter1.ValueParameter.ActualName = CurrentPopulationSizeParameter.Name; subScopesCounter1.AccumulateParameter.Value = new BoolValue(false); subScopesCounter1.Successor = currentPopulationSizeComparator; currentPopulationSizeComparator.LeftSideParameter.ActualName = CurrentPopulationSizeParameter.Name; currentPopulationSizeComparator.RightSideParameter.ActualName = OneParameter.Name; currentPopulationSizeComparator.ResultParameter.ActualName = "CurrentPopulationSizeIsGreaterThanOne"; currentPopulationSizeComparator.Comparison = new Comparison(ComparisonType.Greater); currentPopulationSizeComparator.Successor = currentPopulationSizeIsGreaterThanOne; currentPopulationSizeIsGreaterThanOne.ConditionParameter.ActualName = "CurrentPopulationSizeIsGreaterThanOne"; currentPopulationSizeIsGreaterThanOne.TrueBranch = rankAndCrowdingSorter; // We have to sort individuals before reducing, because if we shifted some of them to another layer, it can happen that they are not correctly sorted rankAndCrowdingSorter.DominateOnEqualQualitiesParameter.ActualName = DominateOnEqualQualitiesParameter.Name; rankAndCrowdingSorter.CrowdingDistanceParameter.ActualName = "CrowdingDistance"; rankAndCrowdingSorter.RankParameter.ActualName = "Rank"; rankAndCrowdingSorter.Successor = reduceToPopulationSizeBranch; reduceToPopulationSizeBranch.ConditionParameter.ActualName = ReduceToPopulationSizeParameter.Name; reduceToPopulationSizeBranch.TrueBranch = countCalculator; countCalculator.CollectedValues.Add(new LookupParameter <IntValue>(PopulationSizeParameter.Name)); countCalculator.CollectedValues.Add(new LookupParameter <IntValue>(CurrentPopulationSizeParameter.Name)); countCalculator.ExpressionParameter.Value = new StringValue("CurrentPopulationSize PopulationSize CurrentPopulationSize PopulationSize < if toint"); countCalculator.ExpressionResultParameter.ActualName = CurrentPopulationSizeParameter.Name; countCalculator.Successor = leftSelector; leftSelector.CopySelected = new BoolValue(false); leftSelector.NumberOfSelectedSubScopesParameter.ActualName = CurrentPopulationSizeParameter.Name; leftSelector.Successor = rightReducer; rightReducer.Successor = subScopesCounter2; subScopesCounter2.ValueParameter.ActualName = CurrentPopulationSizeParameter.Name; subScopesCounter2.AccumulateParameter.Value = new BoolValue(false); return(eldersEmigrator); }