/// <summary>
        /// This version of substracts poly performs just a 'from time to time' substract;
        /// </summary>
        /// <param name="gene"></param>
        private void performSubstract(Gene gene)
        {
            if (gene.Polygons.Count < this.NrOfPolygons / 2 + 1)
            {
                return;
            }
            int doIt = random.Next(100);

            if (doIt % 2 == 0)
            {
                return;
            }

            double referenceNegativeFitness           = double.MaxValue;
            SubstractPolygonMutationChanges bigChange = null;

            for (int i = 0; i < gene.Polygons.Count; i++)
            {
                double oldNegativeFitness = gene.NegativeFitness;
                SubstractPolygonMutationChanges changes = gene.RemovePolygonAtPosition(i);

                if (changes != null && gene.NegativeFitness < referenceNegativeFitness)
                {
                    bigChange = changes;
                    referenceNegativeFitness = gene.NegativeFitness;
                }
                gene.RestoreMutation(changes, oldNegativeFitness);
            }
            gene.ApplyMutation(bigChange);
        }
        private void performAddPolygon(Gene gene)
        {
            if (gene.Polygons.Count >= this.NrOfPolygons)
            {
                return;
            }
            double oldNegativeFitness           = gene.NegativeFitness;
            AddPolygonMutationChanges bigChange = null;

            for (int i = 0; i < NrOfMutationsTries; i++)
            {
                AddPolygonMutationChanges changes = gene.AddPolygon();
                if (changes != null && gene.NegativeFitness > oldNegativeFitness)
                {
                    gene.RestoreMutation(changes, oldNegativeFitness);
                }
                else if (changes != null)
                {
                    oldNegativeFitness = gene.NegativeFitness;
                    bigChange          = changes;
                    gene.RestoreMutation(changes, changes.OldNegativeFitness);
                }
            }
            gene.ApplyMutation(bigChange);
        }
        private void performMutateColorParam(Gene gene)
        {
            double oldNegativeFitness      = gene.NegativeFitness;
            ColorMutationChanges bigChange = null;

            for (int i = 0; i < NrOfMutationsTries; i++)
            {
                ColorMutationChanges changes = gene.MutateColorParam();
                if (changes != null && gene.NegativeFitness > oldNegativeFitness)
                {
                    gene.RestoreMutation(changes, oldNegativeFitness);
                }
                else if (changes != null)
                {
                    oldNegativeFitness = gene.NegativeFitness;
                    bigChange          = changes;
                    gene.RestoreMutation(changes, changes.OldNegativeFitness);
                }
            }
            gene.ApplyMutation(bigChange);
        }