/// <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]; }
public void AddLine(AnalyzableLine analyzableLine) { analyzableLine.AnalyzablePage = this; Lines.Add(analyzableLine); }