/// <summary> /// Редактирование популяции. /// </summary> /// <remarks>Для разнообразия пытаемся добавить случайное антитело, если его аффинность лучше чем у худшего антитела в популяции - заменяем.</remarks> private void Edit() { Antibody someAb = new Antibody(); someAb.SetAffinnity(this.currentAg); if (someAb.Affinnity > abPopulation[PopulationAbSize - 1].Affinnity) { abPopulation[PopulationAbSize - 1] = someAb; } }
/// <summary> /// Конструктор. /// </summary> /// <param name="ab">Антитело, взятое за основу при создании клетки памяти.</param> /// <param name="RecognizedNumber">Число, распознавать которое приспособлено антитело.</param> public MemoryCell(Antibody ab, int?RecognizedNumber) { this.RecognizedNumber = RecognizedNumber; this.Ag = ab.Ag; this.Affinnity = ab.Affinnity; this.Pixels = new bool[DemensionX, DemensionY]; for (int i = 0; i < DemensionX; i++) { for (int j = 0; j < DemensionY; j++) { Pixels[i, j] = ab.Pixels[i, j]; } } }
/// <summary> /// Клонирование антител с лучшей аффинностью. /// </summary> /// <param name="amount"></param> private void CloneBest(int amount) { List <Antibody> clones = new List <Antibody>(); for (int i = 0; i < amount; i++) { int cloneAmount = abPopulation.Length / (i + 1); for (int j = 0; j < cloneAmount; j++) { Antibody someClone = abPopulation[i].Clone(); clones.Add(someClone); } } clonePopulation = clones.ToArray(); }
/// <summary> /// Оператор клонирования и замены. /// </summary> private void CloneReplace() { for (int i = 0; i < clonePopulation.Count(); i++) { clonePopulation[i].SetAffinnity(this.currentAg); } clonePopulation = BubbleSort(clonePopulation); Antibody bestAb = clonePopulation[0].Affinnity > abPopulation[0].Affinnity ? clonePopulation[0] : abPopulation[0]; if (memCellsPopulation[this.currentAgNumber] != null) { if (bestAb.Affinnity > memCellsPopulation[this.currentAgNumber].Affinnity) { memCellsPopulation[this.currentAgNumber] = new MemoryCell(bestAb, this.currentAg.RecognizedNumber); } } else { memCellsPopulation[this.currentAgNumber] = new MemoryCell(bestAb, this.currentAg.RecognizedNumber); } }
/// <summary> /// Копирующий конструктор для антитела. /// </summary> /// <param name="ab">Антитело, с которого снимается копия.</param> public Antibody(Antibody ab) { this.Pixels = (bool[, ])ab.Pixels.Clone(); this.Ag = ab.Ag; this.Affinnity = ab.Affinnity; }