/// <summary>
        /// Starts Optimization for the selected strategy
        /// </summary>
        private void StartOptimization()
        {
            try
            {
                if (Logger.IsInfoEnabled)
                {
                    Logger.Info("Starting strategy optimization.", _type.FullName, "StartOptimization");
                }

                // Get parameters to be used for optimization
                var parameters = GetOptimizationParameters();

                if (parameters != null)
                {
                    if (parameters.Count > 0)
                    {
                        // Create a new object to be used with Event Aggregator
                        OptimizeStrategyBruteForce optimizationParameters =
                            new OptimizeStrategyBruteForce(_ctorArguments, _strategyType, parameters.ToArray(), _parmatersDetails);

                        // Raise Event to notify listeners
                        EventSystem.Publish <OptimizeStrategyBruteForce>(optimizationParameters);
                    }
                }
            }
            catch (Exception exception)
            {
                Logger.Error(exception, _type.FullName, "StartOptimization");
            }
        }
        /// <summary>
        /// Start Strategy Optimization
        /// </summary>
        /// <param name="optimizationParameters">Contains info for the parameters to be used for optimization</param>
        private void StartOptimization(OptimizeStrategyBruteForce optimizationParameters)
        {
            try
            {
                if (_asyncClassLogger.IsInfoEnabled)
                {
                    _asyncClassLogger.Info("Getting argument combinations", _type.FullName, "StartOptimization");
                }

                // Clear all previous information
                _strategiesCollection.Clear();

                // Save Parameter Details
                _parmatersDetails = optimizationParameters.ParmatersDetails;

                // Get all ctor arguments to be used for optimization
                CreateCtorCombinations(optimizationParameters.CtorArgs, optimizationParameters.ConditionalParameters);

                // Initialize Stratgey for each set of arguments
                foreach (object[] ctorArgument in _ctorArguments)
                {
                    // Get new Key.
                    string key = ApplicationIdGenerator.NextId();

                    // Save Strategy details in new Strategy Executor object
                    StrategyExecutor strategyExecutor = new StrategyExecutor(key, optimizationParameters.StrategyType, ctorArgument);

                    // Register Event
                    strategyExecutor.StatusChanged += OnStrategyExecutorStatusChanged;

                    // Add to local map
                    _strategiesCollection.AddOrUpdate(key, strategyExecutor, (ky, value) => strategyExecutor);
                }

                // Start executing each instance
                StartStrategyExecution();
            }
            catch (Exception exception)
            {
                _asyncClassLogger.Error(exception, _type.FullName, "StartOptimization");
            }
        }