예제 #1
0
        public void TestRefineGa()
        {
            const int seed            = 7234;
            const int order           = 36;
            const int stageCount      = 12;
            const int genomeCount     = 256;
            const int sortableCount   = 128;
            const int selectionFactor = 16;
            const int rounds          = 75;
            const int srounds         = 4;

            var sw = new Stopwatch();

            sw.Start();

            var randy = Rando.Standard(seed);
            var genomePoolDualSorter = randy.ToGenomePoolDualSorter(order, stageCount, genomeCount);

            var randomSortablePool = randy.ToRandomSortablePool(
                order: order,
                poolCount: sortableCount);

            var gaDualSorter = new GaDualSorter(
                genomePoolDualSorter: genomePoolDualSorter,
                sortablePool: randomSortablePool,
                randy: randy);

            var gaDualSorterR = new GaDualSorter(
                genomePoolDualSorter: genomePoolDualSorter,
                sortablePool: randomSortablePool,
                randy: randy);


            Console.WriteLine("n_Avg n_Min r_Avg r_Min");

            for (var i = 0; i < rounds; i++)
            {
                SortingResults eval  = null;
                SortingResults evalR = null;
                for (var j = 0; j < srounds; j++)
                {
                    eval          = gaDualSorter.Eval(false);
                    evalR         = gaDualSorterR.Eval(false);
                    gaDualSorter  = gaDualSorter.EvolveSorters(eval.SorterResults, randy, selectionFactor);
                    gaDualSorterR = gaDualSorterR.EvolveSortersRecomb(eval.SorterResults, randy, selectionFactor);
                }

                var avgE = eval.SorterResults.Select(sr => sr.Value.AverageSortedness).ToList();
                var avgR = evalR.SorterResults.Select(sr => sr.Value.AverageSortedness).ToList();

                Console.WriteLine($"{avgE.Average()} {avgE.Min()} {avgR.Average()} {avgR.Min()}");
            }

            sw.Stop();
            Console.WriteLine("\nElapsed={0}", sw.Elapsed);
        }
예제 #2
0
        public static GaData Eval(this GaData sortingGaData)
        {
            var data = sortingGaData.Data.Copy();

            var sorterPool   = data.GetSorterPool();
            var sortablePool = data.GetSortablePool();

            var sr = sortablePool.AsParallel()
                     .SelectMany(
                sb => sorterPool.Select(st => st.Sort(sb)));

            var sortingResults = new SortingResults(sr, false);

            data.SetSortingResults(sortingResults);

            return(new GaData(data: data));
        }
예제 #3
0
        public static string CompareReport(this GaData sgdNew, GaData sgdOld)
        {
            var newData = sgdNew.Data;
            var oldData = sgdOld.Data;

            var sorterPool   = newData.GetSorterPool();
            var sortablePool = oldData.GetSortablePool();

            var srtt = sortablePool.AsParallel()
                       .SelectMany(
                sb => sorterPool.Select(st => st.Sort(sb)));

            var sortingResults = new SortingResults(srtt, false);

            var avgAllSorters  = sortingResults.SorterResults.Average(sr => sr.Value.AverageSortedness);
            var avgBestSorters = newData.GetBestSorterPool().Sorters.Values
                                 .Select(s => sortingResults.SorterResults[s.Id])
                                 .Average(sr => sr.AverageSortedness);

            return($"{avgAllSorters} ");
        }
예제 #4
0
 public static void SetSortingResults(this Dictionary <string, object> dictionary, SortingResults sorterPool)
 {
     dictionary[kSortingResults] = sorterPool;
 }