/// <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);
            }
        }
Ejemplo n.º 2
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);
            }
        }