예제 #1
0
        /// <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();
            }
        }
예제 #2
0
        /// <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 (если совпали все позиции)
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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();
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
 /// <summary>
 /// Копирующий конструктор для антитела.
 /// </summary>
 /// <param name="ab">Антитело, с которого снимается копия.</param>
 public Antibody(Antibody ab)
 {
     this.Pixels    = (bool[, ])ab.Pixels.Clone();
     this.Ag        = ab.Ag;
     this.Affinnity = ab.Affinnity;
 }