public void ProcessChromosome(Single[] fromZeroToOneArray) { int idx = 0; int day, slot; matrix.ResetUnforcedAllocationStates(); enumerator.Reset(); while (enumerator.GetNext(out day, out slot)) { if (!matrix[day, slot].Forced) { Single gene = fromZeroToOneArray[idx++]; if (!matrix[day, slot].Processed) { int?chosenItem = matrix[day, slot].Process(gene); foreach (var r in rules) { r.EnforceConstraint(matrix, day, slot); } } } } #if DEBUG //Test whether just the right number of genes have been provided (and used) if (idx != fromZeroToOneArray.Length) { throw new InvalidOperationException("Chromosome too long"); } #endif }