示例#1
0
        private ICandidateFactory <MpiSysConfig> CreatePopulationInitialiser(
            IClonableObjectiveEvaluator <MpiSysConfig> objectiveEvaluator,
            MpiSysConfig templateParameterSet,
            MpiSysConfig[] seedsPopulation,
            string initialisationOption = "")
        {
            Log.Debug("Root: creating population initialiser");
            var options = initialisationOption.Split(':');
            var seeds   = new List <MpiSysConfig> {
                templateParameterSet
            };

            if (seedsPopulation != null)
            {
                seeds.AddRange(seedsPopulation);
            }
            var rng = new BasicRngFactory(SceParameterDefinition.RandomizationSeed);

            ICandidateFactory <MpiSysConfig> result = CreatePopulationInitialiser(
                templateParameterSet,
                rng,
                objectiveEvaluator,
                options);

            if (result is BestOfSampling <MpiSysConfig> )
            {
                return(result);
            }
            else
            {
                return(new SeededSamplingFactory <MpiSysConfig>(result, seeds));
            }
        }
示例#2
0
        private ShuffledComplexEvolution <MpiSysConfig> CreateShuffledComplexEvolution(
            IClonableObjectiveEvaluator <MpiSysConfig> objectiveEvaluator,
            IDictionary <string, string> dict,
            ICandidateFactory <MpiSysConfig> populationInitializer,
            ILoggerMh logger)
        {
            Log.Debug("Root: creating SCE optimiser");
            ShuffledComplexEvolution <MpiSysConfig> optimEngine = new ShuffledComplexEvolution <MpiSysConfig>(
                objectiveEvaluator,
                populationInitializer,
                CreateTerminationCriterion(),
                SceParameterDefinition.Parameters.P,
                SceParameterDefinition.Parameters.M,
                SceParameterDefinition.Parameters.Q,
                SceParameterDefinition.Parameters.Alpha,
                SceParameterDefinition.Parameters.Beta,
                SceParameterDefinition.Parameters.NumShuffle,
                new BasicRngFactory(SceParameterDefinition.RandomizationSeed + 1000),
                new DefaultFitnessAssignment(),
                dict,
                trapezoidalPdfParam: SceParameterDefinition.Parameters.TrapezoidalDensityParameter,
                options: sceOptions,
                pmin: SceParameterDefinition.Parameters.Pmin)
            {
                Logger = logger
            };

            return(optimEngine);
        }
示例#3
0
        private static ShuffledComplexEvolution <T> internalCreateSceOptimizer <T>(IClonableObjectiveEvaluator <T> evaluator, T template, ITerminationCondition <T> terminationCondition, SceParameters SceParams)
            where T : ICloneableSystemConfiguration, IHyperCube <double>
        {
            var populationInitializer = new UniformRandomSamplingFactory <T>(new CSIRO.Metaheuristics.RandomNumberGenerators.BasicRngFactory(0), template);
            var sce = new ShuffledComplexEvolution <T>(evaluator, populationInitializer,
                                                       terminationCondition: terminationCondition, sceParameters: SceParams);

            return(sce);
        }
示例#4
0
 public UniformRandomSampling(IClonableObjectiveEvaluator <T> evaluator,
                              ICandidateFactory <T> populationInializer,
                              int numShuffle, IDictionary <string, string> tags = null)
 {
     this.evaluator             = evaluator;
     this.populationInitializer = populationInializer;
     this.numShuffle            = numShuffle;
     this.logTags = tags;
 }
示例#5
0
 public UniformRandomSampling(IClonableObjectiveEvaluator <T> evaluator,
                              IRandomNumberGeneratorFactory rng,
                              T template,
                              int numShuffle, IDictionary <string, string> tags = null)
 {
     this.evaluator             = evaluator;
     this.populationInitializer = new UniformRandomSamplingFactory <T>(rng, template);
     this.numShuffle            = numShuffle;
     this.logTags = tags;
 }
示例#6
0
        /// <summary>
        ///   Executes the shuffled complex evolution for nesting within the rosenbrock optimiser.
        /// </summary>
        /// <param name="objectiveEvaluator"> The compound obj calculator. </param>
        /// <param name="dict"> The dict. </param>
        /// <param name="populationInitializer"> The population initializer. </param>
        /// <param name="logger"> The logger. </param>
        /// <returns> </returns>
        private MpiSysConfig ExecuteShuffledComplexForRosen(
            IClonableObjectiveEvaluator <MpiSysConfig> objectiveEvaluator,
            IDictionary <string, string> dict,
            ICandidateFactory <MpiSysConfig> populationInitializer,
            ILoggerMh logger)
        {
            Log.Debug("Root: Executing SCE optimiser");
            var optimEngine = CreateShuffledComplexEvolution(objectiveEvaluator, dict, populationInitializer, logger);

            return(BestParameterSet(optimEngine.Evolve(), new DefaultFitnessAssignment()));
        }
示例#7
0
        private IEvolutionEngine <MpiSysConfig> CreateSceRosenEngine(
            IClonableObjectiveEvaluator <MpiSysConfig> objectiveEvaluator,
            IDictionary <string, string> dict,
            ICandidateFactory <MpiSysConfig> populationInitializer,
            ILoggerMh logger)
        {
            Log.Debug("Root: Creating Rosenbrock + SCE optimiser");
            Func <IOptimizationResults <MpiSysConfig> > rosenFunc = () => ExecuteRosenbrock(objectiveEvaluator, dict, populationInitializer, logger);

            return(new ChainOptimizations <MpiSysConfig>("Sce+Rosen", rosenFunc));
        }
        public static IObjectiveEvaluator <T> TryClone <T>(IObjectiveEvaluator <T> evaluator) where T : ISystemConfiguration
        {
            if (evaluator == null)
            {
                throw new ArgumentNullException( );
            }
            IClonableObjectiveEvaluator <T> clonable = evaluator as IClonableObjectiveEvaluator <T>;

            if (clonable == null)
            {
                throw new NotSupportedException(evaluator.GetType( ).Name + " does not implement IClonableObjectiveEvaluator");
            }
            return(clonable.Clone( ));
        }
示例#9
0
        private static ICandidateFactory <MpiSysConfig> CreatePopulationInitialiser(
            MpiSysConfig templateParameterSet,
            BasicRngFactory rng,
            IClonableObjectiveEvaluator <MpiSysConfig> objectiveEvaluator,
            params string[] options)
        {
            switch (options[0].ToLower())
            {
            case "bestof":
                int      poolSize   = int.Parse(options[1]);
                int      bestPoints = int.Parse(options[2]);
                string[] subOptions = Subset(3, options);

                if (poolSize < bestPoints)
                {
                    Log.WarnFormat(
                        "Root: Best of Sampling pool size ({0}) is smaller than best points ({1}). Setting best points to match pool size.",
                        poolSize,
                        bestPoints);
                    bestPoints = poolSize;
                }

                Log.DebugFormat("Root: creating BestOfSampling. Pool size: {0}, best points: {1}", poolSize, bestPoints);
                return
                    (new BestOfSampling <MpiSysConfig>(
                         CreatePopulationInitialiser(templateParameterSet, rng, objectiveEvaluator, subOptions),
                         poolSize,
                         bestPoints,
                         objectiveEvaluator,
                         new DefaultFitnessAssignment()));

            case "lhc":
                Log.Debug("Root: creating Latin Hypercube Sampling");
                return(new LatinHypercubeSampling <MpiSysConfig>(rng, templateParameterSet));

            case "weibull":
                Log.Debug("Root: creating weibull distribution");
                return(new SeededSamplingFactory <MpiSysConfig>(
                           new WeibullGen <MpiSysConfig>(rng, templateParameterSet),
                           new List <MpiSysConfig> {
                    templateParameterSet
                }));

            case "":
            case "urs":
            default:
                Log.Debug("Root: creating URS");
                return(new UniformRandomSamplingFactory <MpiSysConfig>(rng, templateParameterSet));
            }
        }
示例#10
0
        private IEvolutionEngine <MpiSysConfig> CreateEngine(
            IClonableObjectiveEvaluator <MpiSysConfig> objectiveEvaluator,
            MpiSysConfig templateParameterSet,
            MpiSysConfig[] seedsPopulation,
            ILoggerMh logger,
            string calibName,
            string initialisationOption)
        {
            Log.Debug("Root: creating optimisation engine");
            var dict = string.IsNullOrEmpty(calibName) ? CreateTimeStampCalibName() : CreateTag(calibName);
            var populationInitializer = CreatePopulationInitialiser(objectiveEvaluator, templateParameterSet, seedsPopulation, initialisationOption);

            return(CreateEngine(objectiveEvaluator, dict, populationInitializer, logger));
        }
示例#11
0
        private IEvolutionEngine <MpiSysConfig> CreateEngine(
            IClonableObjectiveEvaluator <MpiSysConfig> objectiveEvaluator,
            IDictionary <string, string> dict,
            ICandidateFactory <MpiSysConfig> populationInitializer,
            ILoggerMh logger)
        {
            switch (OptimisationMethod)
            {
            default:
            case OptimisationMethods.Sce:
                return(CreateShuffledComplexEvolution(objectiveEvaluator, dict, populationInitializer, logger));

            case OptimisationMethods.RosenSce:
                return(CreateSceRosenEngine(objectiveEvaluator, dict, populationInitializer, logger));
            }
        }
示例#12
0
 static IObjectiveScores[] EvaluateScoresSerial <T>(T[] population, Func <bool> isCancelled,
                                                    IClonableObjectiveEvaluator <T> evaluator) where T : ISystemConfiguration
 {
     IObjectiveScores[] result = new IObjectiveScores[population.Length];
     for (int j = 0; j < population.Length; j++)
     {
         if (!isCancelled())
         {
             result [j] = evaluator.EvaluateScore(population [j]);
         }
         else
         {
             result [j] = null;
         }
     }
     return(result);
 }
示例#13
0
        private IOptimizationResults <MpiSysConfig> ExecuteRosenbrock(
            IClonableObjectiveEvaluator <MpiSysConfig> objectiveEvaluator,
            IDictionary <string, string> dict,
            ICandidateFactory <MpiSysConfig> populationInitializer,
            ILoggerMh logger)
        {
            Log.Debug("Root: Executing Rosenbrock optimiser");
            var engine = new RosenbrockOptimizer <MpiSysConfig, double>(
                objectiveEvaluator,
                ExecuteShuffledComplexForRosen(objectiveEvaluator, dict, populationInitializer, logger),
                new RosenbrockOptimizer <MpiSysConfig, double> .RosenbrockOptimizerIterationTermination(RosenbrockIterations),
                logTags: dict)
            {
                Logger = logger, AlgebraProvider = new TimeAlgebraProvider()
            };

            return(engine.Evolve());
        }
示例#14
0
        public static IObjectiveScores[] EvaluateScores <T>(IClonableObjectiveEvaluator <T> evaluator, T[] population, Func <bool> isCancelled, ParallelOptions parallelOptions = null) where T : ISystemConfiguration
        {
            if (population.Length == 0)
            {
                return(new IObjectiveScores[0]);
            }
            if (parallelOptions == null)
            {
                parallelOptions = new ParallelOptions()
                {
                    MaxDegreeOfParallelism = -1
                }
            }
            ;

            var procCount = System.Environment.ProcessorCount;

            IObjectiveScores[] result;
            if (evaluator.SupportsThreadSafeCloning)
            {
                // There is presumably no point cloning
                // the system more times than the max level of parallelism
                int nParallel = procCount;
                if (parallelOptions.MaxDegreeOfParallelism > 0)
                {
                    nParallel = Math.Min(nParallel, parallelOptions.MaxDegreeOfParallelism);
                }
                T[][] subPop   = MetaheuristicsHelper.MakeBins(population, nParallel);
                var   taskPkgs = new List <Tuple <T[], IClonableObjectiveEvaluator <T> > >();
                taskPkgs.Add(Tuple.Create(subPop[0], evaluator));
                for (int i = 1; i < subPop.Length; i++)
                {
                    taskPkgs.Add(Tuple.Create(subPop[i], evaluator.Clone()));
                }
                // Need to use Parallel.ForEach rather than Parallel.For to work around a Parallel.For
                // oddity in Mono 3.12.1. Need an identity to iterate over...
                var ramp = new int[subPop.Length];
                // Map of index of subpopulations to indices in the variable result:
                //var offsets = new int[subPop.Length];
                var resultBins = new IObjectiveScores[ramp.Length][];
                for (int i = 1; i < ramp.Length; i++)
                {
                    ramp[i] = i;
                }
                Parallel.ForEach(ramp, parallelOptions,
                                 (i => {
                    resultBins[i] = EvaluateScoresSerial(taskPkgs[i], isCancelled);
                })
                                 );
                result = Gather(resultBins);
            }
            else
            {
                result = new IObjectiveScores[population.Length];
                for (int i = 0; i < population.Length; i++)
                {
                    if (!isCancelled())
                    {
                        result [i] = evaluator.EvaluateScore(population [i]);
                    }
                    else
                    {
                        result [i] = null;
                    }
                }
            }
            return(result);
        }
示例#15
0
        private static ShuffledComplexEvolution <ICloneableSystemConfiguration> createSce(IClonableObjectiveEvaluator <ICloneableSystemConfiguration> evaluator)
        {
            var rng    = new BasicRngFactory(0);
            var engine = new ShuffledComplexEvolution <ICloneableSystemConfiguration>(
                evaluator,
                new UniformRandomSamplingFactory <IHyperCube <double> >(rng.CreateFactory(), new UnivariateReal(0)),
                new ShuffledComplexEvolution <ICloneableSystemConfiguration> .MaxShuffleTerminationCondition(),
                5, 20, 10, 3, 20, 7,
                rng,
                new ZitlerThieleFitnessAssignment());

            return(engine);
        }
示例#16
0
 public CombinedSCEwithRosenbrock(ShuffledComplexEvolution <T> shuffledComplexEvolution, IClonableObjectiveEvaluator <T> evaluator,
                                  ITerminationCondition <T> rosenTerminationCondition, object AlgabraProvider)
 {
     this.evaluator  = evaluator;
     this.shuffledCE = shuffledComplexEvolution;
     this.rosenTerminationCondition = rosenTerminationCondition;
     this.rosenAlgabraProvider      = AlgabraProvider;
 }