public static LinearLinkage Apply(IRandom random, int length) { var groups = Enumerable.Range(0, length).Select(x => Tuple.Create(x, random.Next(length))) .GroupBy(x => x.Item2) .Select(x => x.Select(y => y.Item1).ToList()); return(LinearLinkage.FromGroups(length, groups)); }
public static LinearLinkage Apply(IRandom random, int length, int groups) { var groupNumbers = Enumerable.Range(0, length).Select(x => x % groups).Shuffle(random); var grouping = Enumerable.Range(0, groups).Select(x => new List <int>()).ToList(); var idx = 0; foreach (var g in groupNumbers) { grouping[g].Add(idx++); } return(LinearLinkage.FromGroups(length, grouping)); }
public static LinearLinkage Apply(IRandom random, ItemArray <LinearLinkage> parents) { var len = parents[0].Length; var childGroup = new List <HashSet <int> >(); var currentParent = random.Next(parents.Length); var groups = parents.Select(x => x.GetGroups().Select(y => new HashSet <int>(y)).ToList()).ToList(); bool remaining; do { var maxGroup = groups[currentParent].Select((v, i) => Tuple.Create(i, v)) .MaxItems(x => x.Item2.Count) .SampleRandom(random).Item1; var group = groups[currentParent][maxGroup]; groups[currentParent].RemoveAt(maxGroup); childGroup.Add(group); remaining = false; for (var p = 0; p < groups.Count; p++) { for (var j = 0; j < groups[p].Count; j++) { foreach (var elem in group) { groups[p][j].Remove(elem); } if (!remaining && groups[p][j].Count > 0) { remaining = true; } } } currentParent = (currentParent + 1) % parents.Length; } while (remaining); return(LinearLinkage.FromGroups(len, childGroup)); }