Example #1
0
        /// <summary>
        /// Генерирует живучесть для популяции.
        /// </summary>
        private void GenerateFitnesses()
        {
            //Проитерируем по всем хромосомам.
            var results = new List<AnalyzableLine>[_populationSize];
            for (int i = 0; i < _populationSize; i++)
            {
                //bool isString = false;
                int summHeight = 0;
                var lines = new List<AnalyzableLine>();
                int y = 0;
                while (y < _points.Length)
                {
                    //начнем строку текста
                    if (Result(_population[i], _ranges[y]))
                    {
                        //Начало строки  - текущая строчка массива.
                        int start = y;

                        var line = new AnalyzableLine(start, 0);

                        //Произведем итерации по строчкам до тех пор, пока функция
                        //не перестанет быть 'True'
                        while (Result(_population[i], _ranges[y]))
                        {
                            y++;
                            //Проверим на конец массива
                            if (y == _points.Length)
                                break;
                        }
                        int height = y - start;

                        //Вычислим высоту
                        line.Height = height;
                        summHeight += height;

                        //Добавим строку в список строк страницы.
                        lines.Add(line);
                    }
                    y++;

                }

                if (lines.Count < 2)
                {
                    _fitnesses[i] = 0.0;
                }
                else
                {
                    var medHeight = summHeight/lines.Count;
                    var newlines = lines.Where(line => line.Height > medHeight).ToList();
                    if (newlines.Count > 2)
                        lines = newlines;
                    //Вычислим однородность (фитнесс-функцию)
                    //Вычислим диапазон высот
                    int heightsRange = lines.Max(line => line.Height) - lines.Min(line => line.Height);

                    //Вычислим диапазон расстояний между строками
                    int last = lines[0].Height + lines[0].Start;
                    var ranges = new int[lines.Count];
                    for (int k = 1; k < lines.Count; k++)
                    {
                        ranges[k - 1] = lines[k].Start - last;
                        last = lines[k].Start + lines[k].Height;
                    }
                    int distancesRange = ranges.Max() - ranges.Min();
                    //summHeight = lines.Sum(line => line.Height);

                    //значение фитнесс-функции для данной хромосомы.
                    //Fitnesses[i] = 1 / ((distancesRange) + heightsRange +(double)Math.Abs(2 * summHeight - Points.Length));
                    _fitnesses[i] = 1 / (double)((distancesRange+1)*(heightsRange+1));
                    results[i] = lines;
                }
            }
            _maximumFitness = _fitnesses.Max();
            var max = 0.0;
            var bestIndex = 0;
            for (int i = 0; i < _populationSize; i++)
            {
                if (_fitnesses[i] > max)
                {
                    max = _fitnesses[i];
                    bestIndex = i;
                }

            }
            _bestResult = results[bestIndex];
        }
Example #2
0
 public void AddLine(AnalyzableLine analyzableLine)
 {
     analyzableLine.AnalyzablePage = this;
     Lines.Add(analyzableLine);
 }
Example #3
0
 public void AddLine(AnalyzableLine analyzableLine)
 {
     analyzableLine.AnalyzablePage = this;
     Lines.Add(analyzableLine);
 }