예제 #1
0
        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));
        }