/// <summary>
        ///
        /// </summary>
        /// <param name="input"></param>
        /// <param name="config"></param>
        public GenAlgSolver(OptimizationInput input, GenAlgConfig config)
        {
            if (!config.IsValid())
            {
                throw new ArgumentException("must not be invalid", "config");
            }

            this.input  = input;
            this.config = config;
        }
        /// <summary>
        /// Can be called concurrent.
        /// </summary>
        /// <param name="parameters"></param>
        /// <returns></returns>
        static double RunGeneticAlgorithm(double[] parameters)
        {
            // settings
            var timeLimitMilliseconds  = 500;
            var numberOfRuns           = 10;
            var maxNumberOfGenerations = long.MaxValue;

            // create solver
            var(input, _) = DatasetFactory.DatasetGATuning();
            var config = new GenAlgConfig(input.NumberOfSantas(), maxNumberOfGenerations, (int)parameters[6], parameters[0], parameters[1], parameters[2], parameters[3], parameters[4], parameters[5]);
            var solver = new GenAlgSolver(input, config);

            // run numberOfRuns times and return average
            return(Enumerable.Range(0, numberOfRuns)
                   .Select(v => solver.Solve(timeLimitMilliseconds, null, null).Cost())
                   .Average());
        }
 public EvolutionOperation(GenAlgConfig config)
 {
     this.config = config;
     this.recombinationOperation = new RecombinationOperation(RandomFactory.Instance, config.OrderBasedCrossoverProbability);
     this.mutationOperation      = new MutationOperation(RandomFactory.Instance, config.PositionMutationProbability);
 }