/// <summary> /// Обучение ИИС. /// </summary> /// <param name="trainingSet">Обучающая выборка.</param> /// <param name="accuracy">Требуемая точность, от 0 до 1.</param> /// <param name="selectionForCloningAmount">Число лучших антител, отбираемых для клонирования.</param> /// <param name="mutationProbability">Максимальная вероятность мутации.</param> public void Training(Antigen[] trainingSet, double accuracy, int selectionForCloningAmount, int mutationProbability) { this.currentAgNumber = 0; while (this.currentAgNumber < trainingSet.Length) { this.currentAg = trainingSet[this.currentAgNumber]; while (true) { SetPopulationAffinity(); abPopulation = BubbleSort(abPopulation); CloneBest(selectionForCloningAmount); Mutation(mutationProbability); CloneReplace(); Edit(); Console.WriteLine("TreningAgNumber: {0} Generation: {1} MemCellAff: {2}", this.currentAgNumber, genNumber, memCellsPopulation[this.currentAgNumber].Affinnity.ToString("F2")); if (memCellsPopulation[this.currentAgNumber].Affinnity >= accuracy) { break; } genNumber++; } currentAgNumber++; } // показать популяцию клеток памяти, сформированную в результате обучения foreach (MemoryCell mc in memCellsPopulation) { mc.ShowCell(); } }
/// <summary> /// Определение значения аффинности для антитела. /// </summary> /// <param name="ag">Антиген, с которым сравнивается антитело.</param> public void SetAffinnity(Antigen ag) { this.Ag = ag; // связали антитело с антигеном, с которым выполняется сравнение. int h = HemMeasure(ag); // определение аффинности. this.Affinnity = (double)(PixelCount - h) / PixelCount; // получили значение аффинности от 0 (если совпало ноль позиций) до 1 (если совпали все позиции) }
/// <summary> /// Получение значения аффинности заданному антигену. /// </summary> /// <param name="ag">Антиген, с которым сопоставляется клетка памяти.</param> /// <returns>Значение аффинности.</returns> public double GetAffinnity(Antigen ag) { double aff = 0; int h = HemMeasure(ag); // определение аффинности. aff = (double)(PixelCount - h) / PixelCount; // получили значение аффинности от 0 (если совпало ноль позиций) до 1 (если совпали все позиции) return(aff); }
/// <summary> /// Получение результата распознавания. /// </summary> /// <param name="testAg">Проверяемый антиген.</param> public void GetResult(Antigen testAg) { int? res = 0; double currentmaxAffinity = 0; foreach (MemoryCell memcell in memCellsPopulation) { double aff = memcell.GetAffinnity(testAg); if (aff > currentmaxAffinity) { res = memcell.RecognizedNumber; currentmaxAffinity = aff; } } Console.WriteLine("Result: " + res); Console.Read(); }
/// <summary> /// Вычисление расстояния Хэмминга для булевых массивов, описывающих изображения. /// </summary> /// <param name="ag">Антиген, описываемый булевым массивом.</param> /// <returns>Число расхождений между данным антителом и заданным антигеном.</returns> protected int HemMeasure(Antigen ag) { int h = 0; // расстояние Хемминга, можно использовать как меру близости антитела антигену. // антитела и антигены должны описываться массивами одинакового размера. if (DemensionX != ag.Pixels.GetLength(0) && DemensionY != ag.Pixels.GetLength(1)) { throw new Exception(); } // подсчет расстояния Хемминга. for (int i = 0; i < DemensionX; i++) { for (int j = 0; j < DemensionY; j++) { if (this.Pixels[i, j] != ag.Pixels[i, j]) { h++; } } } return(h); }
/// <summary> /// Копирующий конструктор для антитела. /// </summary> /// <param name="ab">Антитело, с которого снимается копия.</param> public Antibody(Antibody ab) { this.Pixels = (bool[, ])ab.Pixels.Clone(); this.Ag = ab.Ag; this.Affinnity = ab.Affinnity; }