/// <summary>
 /// Validates the population metadata properties.
 /// </summary>
 /// <param name="populationMetadata">The population metadata to validate.</param>
 private static void ValidatePopulationProperties(IPopulationMetadata populationMetadata)
 {
     if (populationMetadata.SurvivalRate < 0 || populationMetadata.SurvivalRate > 1)
     {
         throw new ArgumentException("Error! Survival rate must be a value between 0 and 1.");
     }
     if (populationMetadata.DistanceThreshold < 0)
     {
         throw new ArgumentException("Error! Distance threshold must be a positive value.");
     }
 }
        /// <summary>
        /// Performs semantic validation on the given <see cref="IPopulationMetadata"/>.
        /// </summary>
        /// <param name="populationMetadata">The given <see cref="IPopulationMetadata"/>.</param>
        internal static void Validate(IPopulationMetadata populationMetadata)
        {
            var seen = InitializeSeenTracker(populationMetadata);

            ValidatePopulationProperties(populationMetadata);
            foreach (var chromosomeMetadata in populationMetadata)
            {
                seen(chromosomeMetadata.Name);
                ValidateChromosomeProperties(chromosomeMetadata);
            }
        }
Example #3
0
        /// <summary>
        /// Constructs a new instance of the <see cref="Population"/> class.
        /// </summary>
        /// <param name="populationMetadata">The population metadata.</param>
        internal Population(IPopulationMetadata populationMetadata)
        {
            _populationMetadata = populationMetadata;

            if (_populationMetadata.CooperativeCoevolution)
            {
                _species = new Species[_populationMetadata.Count()];
                for (var i = 0; i < _populationMetadata.Count(); i++)
                {
                    _species[i] = new Species(this, _populationMetadata[i].Name);
                }
            }
            else
            {
                _species    = new Species[1];
                _species[0] = new Species(this);
            }

            _optimalSpecies = _species[0];
        }
        /// <summary>
        /// Initializes the seen tracker.
        /// </summary>
        /// <param name="populationMetadata">The population metadata to initialize against.</param>
        /// <returns>The seen tracker.</returns>
        private static Action <string> InitializeSeenTracker(IPopulationMetadata populationMetadata)
        {
            var seen = new Dictionary <string, bool>();

            foreach (var chromosomeMetadata in populationMetadata)
            {
                seen[chromosomeMetadata.Name] = false;
            }

            return(name =>
            {
                if (seen[name])
                {
                    throw new ArgumentException("Error! Every chromosome must have a unique name.");
                }
                else
                {
                    seen[name] = true;
                }
            });
        }
Example #5
0
 /// <summary>
 /// Creates a population object.
 /// </summary>
 /// <param name="metadata">The population metadata.</param>
 /// <returns>The constructed population.</returns>
 public IPopulation CreatePopulation(IPopulationMetadata metadata)
 {
     SemanticValidator.Validate(metadata);
     return(new Population(metadata) as IPopulation);
 }