/// <summary> /// Сгенерировать новый ген, представляющий случайный КПД для связьи устройства учёта и управления и УСПД, /// выбирается такой, чтобы подходил к устройству и к КПД. /// </summary> /// <param name="chromosome">Текущая хромосома.</param> /// <param name="sectionIndex">Индекс секции, для которой генерируется ген.</param> /// <returns>Целочисленное значение случайного гена, соответствующее индексу в массиве доступных каналов передачи данных.</returns> protected static int GenerateDataChannelGene(TopologyChromosome chromosome, int sectionIndex) { try { // Декодируем КУ из гена, которое выбрано в данной секции (оно идёт первым в хромосоме) var mcd = chromosome.CurrentProject.Equipments.MCDs[(int)chromosome.GetGene(sectionIndex * TopologyChromosome.GENES_IN_SECTION).Value]; // Декодируем УСПД из гена, которое выбрано в данной секции (оно идёт третьим в хромосоме) var dad = chromosome.CurrentProject.Equipments.DADs[(int)chromosome.GetGene(sectionIndex * TopologyChromosome.GENES_IN_SECTION + 2).Value]; // Выбираем те КПД, которые совместимы и с выбранным КУ, и с выбранным УСПД var suitableDataChannels = chromosome.CurrentProject.Equipments.DCs .Select((dataChannel, index) => new { DataChannel = dataChannel, Index = index }) .Where(indexedChannel => mcd.SendingCommunications.Contains(indexedChannel.DataChannel.Communication) && dad.ReceivingCommunications.Keys.Contains(indexedChannel.DataChannel.Communication)) .ToArray(); // Если не нашли подходящего УСПД, то выбираем случайный if (!suitableDataChannels.Any()) { return(RandomizationProvider.Current.GetInt(0, chromosome.CurrentProject.Equipments.DCs.Length)); } // Иначе берём случайный КПД из подходящих var randomIndex = RandomizationProvider.Current.GetInt(0, suitableDataChannels.Count()); return(suitableDataChannels[randomIndex].Index); } catch (Exception ex) { Console.WriteLine("GenerateDataChannelGene failed! {0}", ex.Message); return(0); } }
/// <summary> /// Сгенерировать новый ген, представляющий случайное устройство сбора и передачи данных. /// </summary> /// <param name="chromosome">Текущая хромосома.</param> /// <param name="sectionIndex">Индекс секции, для которой генерируется ген.</param> /// <returns>Целочисленное значение случайного гена, соответствующее индексу в массиве УСПД.</returns> public static int GenerateDeviceGene(TopologyChromosome chromosome, int sectionIndex) { try { // Декодируем КУ из гена, которое выбрано в данной секции (оно идёт первым в хромосоме) var mcd = chromosome.CurrentProject.Equipments.MCDs[(int)chromosome.GetGene(sectionIndex * TopologyChromosome.GENES_IN_SECTION).Value]; // Выбираем только те УСПД, которые подходят для КУ var suitableDADs = chromosome.CurrentProject.Equipments.DADs .Select((dad, index) => new { DAD = dad, Index = index }) .Where(indexedDAD => indexedDAD.DAD.ReceivingCommunications.Keys.Any(communiction => mcd.SendingCommunications.Contains(communiction))) .ToArray(); // Если не нашли подходящего УСПД, берём просто случайный if (!suitableDADs.Any()) { return(RandomizationProvider.Current.GetInt(0, chromosome.CurrentProject.Equipments.DADs.Length)); } // Иначе берём случайный из подходящих var randomIndex = RandomizationProvider.Current.GetInt(0, suitableDADs.Count()); return(suitableDADs[randomIndex].Index); } catch (Exception ex) { Console.WriteLine("GenerateDADeviceGene failed! {0}", ex.Message); return(0); } }