Exemplo n.º 1
0
        public static double SearchMeanPercent(PercentDelegate SearchPercent, SearchParameters parameters, double averChange, Solver solver, Random rand)
        {
            double average        = 0;
            int    runNumber      = 0;
            int    accuracyAmount = 0;
            int    runFinish;

            do
            {
                double diff = runNumber != 0 ? average / runNumber : 0;
                average += SearchPercent(parameters, solver, rand);
                parameters.Clear();
                runNumber++;
                diff           = Math.Abs(average / runNumber - diff);
                accuracyAmount = (diff < averChange) ? accuracyAmount + 1 : 0;
            } while (accuracyAmount < 10);
            runFinish = runNumber * 10;

            var iterations = runFinish - runNumber;
            var quantity   = Environment.ProcessorCount;
            var step       = (int)Math.Ceiling((double)iterations / quantity);

            runNumber += step * quantity;

            int threadsSum = 0;

            Parallel.For(0, quantity, i =>
            {
                int sumLocal    = 0;
                var solverLocal = new Solver();
                var randLocal   = new Random();
                var paramsLocal = parameters.Copy();
                for (var j = 0; j < step; j++)
                {
                    sumLocal += SearchPercent(paramsLocal, solverLocal, randLocal);
                    paramsLocal.Clear();
                }
                Interlocked.Add(ref threadsSum, sumLocal);
            }
                         );

            average += threadsSum;
            average /= runNumber;
            return(average);
        }