Esempio n. 1
0
        /// <summary>
        /// generates a chromosome gene from its index containing a random row permutation
        /// amongst those respecting the target mask.
        /// </summary>
        /// <param name="geneIndex">the index for the gene</param>
        /// <returns>a gene generated for the index</returns>
        public override Gene GenerateGene(int geneIndex)
        {
            var rnd = RandomizationProvider.Current;
            int permIdx;

            do
            {
                //we randomize amongst the permutations that account for the target mask.
                permIdx = rnd.GetInt(0, TargetRowsPermutations[geneIndex].Count);
                var perm = GetPermutation(geneIndex, permIdx);

                //We pick a random previous row to check compatibility with
                if (geneIndex == 0)
                {
                    //we skip first row
                    break;
                }
                var checkRowIdx = rnd.GetInt(0, geneIndex);
                var checkPerm   = GetPermutation(checkRowIdx);
                if (Range9.All(i => perm[i] != checkPerm[i]))
                {
                    break;
                }
            } while (true);



            return(new Gene(permIdx));
        }
        private IList <IList <IList <int> > > GetRowsPermutationsUncached()
        {
            var toReturn = new List <IList <IList <int> > >(9);

            for (int i = 0; i < 9; i++)
            {
                var tempList = new List <IList <int> >();
                foreach (var perm in AllPermutations)
                {
                    // Permutation should be compatible with current row extended mask domains
                    if (Range9.All(j => ExtendedMask[i * 9 + j].Contains(perm[j])))
                    {
                        tempList.Add(perm);
                    }
                }
                toReturn.Add(tempList);
            }

            return(toReturn);
        }