/// <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); }