예제 #1
0
파일: AIContainer.cs 프로젝트: siupa/AIGame
        public void InitializeAI()
        {
            _gaPopulation = new List<global::AIGame.AI.GA.GenomePair>();
            _gaGenethicAlgorithm = new global::AIGame.AI.GA.GeneticAlgorithm(
                    _aiobjects.Count,
                    AIParams.MutationRate,
                    AIParams.CrossoverRate,
                    _aiobjects[0].AINeuralBrain.GetNumberOfWeights(),
                    _aiobjects[0].AINeuralBrain.CalculateSplitPoints()
                );

            #region read from dump file
            try
            {
                if (AIParams.CONFIG_GET_GENERATION_FROM_FILE)
                {
                    if (!File.Exists(AIParams.CONFIG_GET_GENERATION_FROM_FILE_PATH))
                        throw new Exception("Attempt to read start generation from file failed! File does not exist!");

                    //// set the temporary culture for importing
                    //string temp_culture = Thread.CurrentThread.CurrentCulture.Name;
                    //Thread.CurrentThread.CurrentCulture
                    //    = new CultureInfo("en-US");

                    _gaGenethicAlgorithm.Population.Clear();

                    TextReader tr = new StreamReader(AIParams.CONFIG_GET_GENERATION_FROM_FILE_PATH);
                    List<double> weights = new List<double>();
                    string line = tr.ReadLine();
                    double fitness = 0;
                    while (line != null)
                    {
                        if (line.Contains("Generation:"))
                        {
                            string[] temp_gen = line.Split(' ');
                            _generation = int.Parse(temp_gen[1]);
                            _gaGenethicAlgorithm.BestFitness = double.Parse(temp_gen[3]);
                            _gaGenethicAlgorithm.AverageFitness = double.Parse(temp_gen[5]);
                        }
                        if (line.Contains("Fitness:"))
                        {
                            fitness = double.Parse(line.Split(' ')[1]);
                        }
                        if (line.Contains("Weights:"))
                        {
                            weights.Clear();
                            line = tr.ReadLine().TrimStart().TrimEnd();
                            string[] s_w = line.Split(' ');
                            foreach (string s in s_w)
                                weights.Add(double.Parse(s));

                            double[] temp = weights.ToArray();
                            _gaGenethicAlgorithm.Population.Add(new GA.GenomePair("",new GA.Genome(new List<double>(temp), fitness)));
                        }
                        line = tr.ReadLine();
                    }

                    if (AIParams.CONFIG_GET_GENERATION_FROM_FILE_ONLY_ELITE)
                    {
                        _gaGenethicAlgorithm.Population.Sort(GA.GenomePair.GenomePairComparison);
                        _gaGenethicAlgorithm.Population.Reverse();
                        //GA.GenomePair[] temp = new global::AIGame.AI.GA.Genome[_gaGenethicAlgorithm.Population.Count];
                        //_gaGenethicAlgorithm.Population.CopyTo(temp);
                        int e = 0;
                        for (int i = 0; i < _gaGenethicAlgorithm.Population.Count; i++)
                        {
                            if (i < AIParams.NumElite * AIParams.NumCopiesElite)
                                continue;
                            _gaGenethicAlgorithm.Population[i] = _gaGenethicAlgorithm.Population[e];
                            e++;
                        }
                    }

                    //// restore current culture after importing
                    //Thread.CurrentThread.CurrentCulture = new CultureInfo(temp_culture);
                }
            }
            catch(Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("Error reading first generation from file! Exception: " + ex.Message);
            }
            #endregion

            int j = 0;
            foreach (AIObject aiobj in _aiobjects)
            {
                _gaGenethicAlgorithm.Population[j].Genome.Fitness = 0.0;
                aiobj.AINeuralBrain.PutWeights(_gaGenethicAlgorithm.Population[j].Genome.Weights);
                _gaPopulation.Add(_gaGenethicAlgorithm.Population[j]);
                j++;
            }
        }
예제 #2
0
파일: AIContainer.cs 프로젝트: siupa/AIGame
        public void InitializeAI()
        {
            _gaPopulation        = new List <global::AIGame.AI.GA.GenomePair>();
            _gaGenethicAlgorithm = new global::AIGame.AI.GA.GeneticAlgorithm(
                _aiobjects.Count,
                AIParams.MutationRate,
                AIParams.CrossoverRate,
                _aiobjects[0].AINeuralBrain.GetNumberOfWeights(),
                _aiobjects[0].AINeuralBrain.CalculateSplitPoints()
                );

            #region read from dump file
            try
            {
                if (AIParams.CONFIG_GET_GENERATION_FROM_FILE)
                {
                    if (!File.Exists(AIParams.CONFIG_GET_GENERATION_FROM_FILE_PATH))
                    {
                        throw new Exception("Attempt to read start generation from file failed! File does not exist!");
                    }

                    //// set the temporary culture for importing
                    //string temp_culture = Thread.CurrentThread.CurrentCulture.Name;
                    //Thread.CurrentThread.CurrentCulture
                    //    = new CultureInfo("en-US");

                    _gaGenethicAlgorithm.Population.Clear();

                    TextReader    tr      = new StreamReader(AIParams.CONFIG_GET_GENERATION_FROM_FILE_PATH);
                    List <double> weights = new List <double>();
                    string        line    = tr.ReadLine();
                    double        fitness = 0;
                    while (line != null)
                    {
                        if (line.Contains("Generation:"))
                        {
                            string[] temp_gen = line.Split(' ');
                            _generation = int.Parse(temp_gen[1]);
                            _gaGenethicAlgorithm.BestFitness    = double.Parse(temp_gen[3]);
                            _gaGenethicAlgorithm.AverageFitness = double.Parse(temp_gen[5]);
                        }
                        if (line.Contains("Fitness:"))
                        {
                            fitness = double.Parse(line.Split(' ')[1]);
                        }
                        if (line.Contains("Weights:"))
                        {
                            weights.Clear();
                            line = tr.ReadLine().TrimStart().TrimEnd();
                            string[] s_w = line.Split(' ');
                            foreach (string s in s_w)
                            {
                                weights.Add(double.Parse(s));
                            }

                            double[] temp = weights.ToArray();
                            _gaGenethicAlgorithm.Population.Add(new GA.GenomePair("", new GA.Genome(new List <double>(temp), fitness)));
                        }
                        line = tr.ReadLine();
                    }

                    if (AIParams.CONFIG_GET_GENERATION_FROM_FILE_ONLY_ELITE)
                    {
                        _gaGenethicAlgorithm.Population.Sort(GA.GenomePair.GenomePairComparison);
                        _gaGenethicAlgorithm.Population.Reverse();
                        //GA.GenomePair[] temp = new global::AIGame.AI.GA.Genome[_gaGenethicAlgorithm.Population.Count];
                        //_gaGenethicAlgorithm.Population.CopyTo(temp);
                        int e = 0;
                        for (int i = 0; i < _gaGenethicAlgorithm.Population.Count; i++)
                        {
                            if (i < AIParams.NumElite * AIParams.NumCopiesElite)
                            {
                                continue;
                            }
                            _gaGenethicAlgorithm.Population[i] = _gaGenethicAlgorithm.Population[e];
                            e++;
                        }
                    }


                    //// restore current culture after importing
                    //Thread.CurrentThread.CurrentCulture = new CultureInfo(temp_culture);
                }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("Error reading first generation from file! Exception: " + ex.Message);
            }
            #endregion

            int j = 0;
            foreach (AIObject aiobj in _aiobjects)
            {
                _gaGenethicAlgorithm.Population[j].Genome.Fitness = 0.0;
                aiobj.AINeuralBrain.PutWeights(_gaGenethicAlgorithm.Population[j].Genome.Weights);
                _gaPopulation.Add(_gaGenethicAlgorithm.Population[j]);
                j++;
            }
        }