Ejemplo n.º 1
0
        private void Initiation()
        {
            Console.WriteLine("\n=== Starting Initiation ===");
            Console.WriteLine("Population Size: {0};\nGenome Size: {1};\nGene Value Range: [{2}; {3}]\n\n",
                              this.PopulationSize, this.GenomeSize, Specimen.MinGeneValue, Specimen.MaxGeneValue);

            _currGeneration = new List <Specimen>();

            var newSpecies = Enumerable.Range(0, PopulationSize).AsParallel().Select(i =>
            {
                var newSpec = new Specimen
                {
                    Length = this.GenomeSize
                };
                SpecimenHelper.GenerateGenes(ref newSpec);
                var fitness = FitnessFunction(newSpec);

                // FIXME: Replace '1e5' magic number with well described constant
                newSpec.Fitness = double.IsNaN(fitness) ? 0 : (double.IsInfinity(fitness) ? 1e5 : fitness);

                Console.WriteLine("Specimen {1} has Fitness: {0}", newSpec.Fitness, i);

                return(newSpec);
            }).OrderBy(s => s.Fitness).Take(this.PopulationSize);

            _currGeneration = newSpecies.ToList(); // Huge load starts here :)

            _fitnessTable = new List <double>();
            foreach (var spec in _currGeneration)
            {
                if (!_fitnessTable.Any())
                {
                    _fitnessTable.Add(spec.Fitness);
                }
                else
                {
                    _fitnessTable.Add(_fitnessTable.Last() + spec.Fitness);
                }
            }

            TotalFitness = _currGeneration.Sum(spec => spec.Fitness);

            var best = _currGeneration.Last();

            Console.WriteLine("=== Initiation Result ===\n");
            Console.WriteLine("Best Specimen:\n{0}", best.Print());
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                var cmd = args[0].ToLower(CultureInfo.InvariantCulture);
                switch (cmd)
                {
                case "simulate":
                case "simulation":
                    InitializeSimulator();

                    FedKfSim.PrintSimResults = true;

                    var spec = new Specimen();
                    SpecimenHelper.SetGenes(ref spec, ReadSimulationGenes());

                    FedKfSim.Simulate(spec);
                    break;

                case "set":
                    var settingName  = args[1];
                    var settingValue = args[2];
                    var config       = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                    config.AppSettings.Settings[settingName].Value = settingValue;
                    config.Save(ConfigurationSaveMode.Modified);
                    ConfigurationManager.RefreshSection("appSettings");

                    Console.WriteLine("'{0}' set to {1}", settingName, settingValue);
                    break;

                case "print":
                    Console.WriteLine("Current settings:");
                    foreach (var name in ConfigurationManager.AppSettings.AllKeys.AsParallel())
                    {
                        var value = ConfigurationManager.AppSettings[name];
                        Console.WriteLine("'{0}' => {1}", name, value);
                    }
                    break;

                case "help":
                case "?":
                case "-h":
                    PrintHelp();
                    break;

                default:
                    Console.Error.WriteLine(string.Format("\nARGUMENT ERROR\n'{0}' is unknown command!\n", cmd));
                    PrintHelp();
                    break;
                }
            }
            else
            {
                InitializeSimulator();

                var genCount     = int.Parse(ConfigurationManager.AppSettings["GenerationsCount"]);
                var popSize      = int.Parse(ConfigurationManager.AppSettings["PopulationSize"]);
                var crossOver    = double.Parse(ConfigurationManager.AppSettings["CrossoverRate"], FileParser.NumberFormat);
                var mutRate      = double.Parse(ConfigurationManager.AppSettings["MutationRate"], FileParser.NumberFormat);
                var maxGeneVal   = double.Parse(ConfigurationManager.AppSettings["MaxGeneValue"], FileParser.NumberFormat);
                var minGeneVal   = double.Parse(ConfigurationManager.AppSettings["MinGeneValue"], FileParser.NumberFormat);
                var genomeLength = int.Parse(ConfigurationManager.AppSettings["GenomeLength"]);

                SpecimenHelper.SimilarityThreshold = double.Parse(
                    ConfigurationManager.AppSettings["SimilarityThreshold"], FileParser.NumberFormat);

                var ga = new Ga(genomeLength)
                {
                    FitnessFunction  = FedKfSim.Simulate,
                    Elitism          = true,
                    GenerationsCount = genCount,
                    PopulationSize   = popSize,
                    CrossoverRate    = crossOver,
                    MutationRate     = mutRate
                };

                FedKfSim.PrintSimResults = false;
                ga.Go(maxGeneVal, minGeneVal);
            }

            Console.ReadLine();
        }