Ejemplo n.º 1
0
        public void CourseSizeMultiplierCanDecideWhichSolutionToChoose_HardCaseAllParticipantsDifferent()
        {
            // Arrange
            var participants = new[]
            {
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000001"), 1980, Language.French, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000002"), 1972, Language.Italian, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000003"), 1984, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000004"), 2011, Language.French, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000005"), 2017, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000006"), 2004, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000007"), 1998, Language.French, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000008"), 2014, Language.Italian, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000009"), 2010, Language.French, 1)
            };

            var solverParam1 = new SolverParam(1, participants);
            var solverParam2 = new SolverParam(2, participants);
            var solverParam3 = new SolverParam(3, participants);

            // Act
            var result1 = _solver.Solve(solverParam1);
            var result2 = _solver.Solve(solverParam2);
            var result3 = _solver.Solve(solverParam3);
            var results = result1.Concat(result2).Concat(result3).OrderBy(r => r.Score * r.CourseSizeMultiplier).ToArray();

            // Assert
            AssertSolverResultIsEquivalent(
                expectedComposition: new[] { new[] { 1, 2, 3 }, new[] { 4, 5, 6, 7, 8, 9 } },
                actualResult: results.First(),
                identifierPropertyResolver: p => int.Parse(p.Id.ToString().Substring(34))
                );
        }
Ejemplo n.º 2
0
        public IEnumerable <SolverResult> Solve(SolverParam param)
        {
            // readonly
            int[] ageGroupOfParticipants = param.Participants.Select(p => p.AgeGroup).ToArray();
            int[] languageOfParticipants = param.Participants.Select(p => (int)p.Language).ToArray();
            int[] courseDaysInSameNiveauOfParticipants = param.Participants.Select(p => p.CoursesDaysInSameNiveau).ToArray();

            var courses      = Enumerable.Range(1, param.CourseCount).ToArray();
            var participants = Enumerable.Range(0, ageGroupOfParticipants.Length).ToArray();

            // mutated
            int[] courseOfParticipant;

            // solve
            var solutions = new List <Tuple <int[], double> >();

            foreach (var permutation in Combinator.PermutationsWithDublicatePatternsFiltering(courses, participants.Length))
            {
                courseOfParticipant = permutation.ToArray();

                var value = courses
                            .Select(k =>
                {
                    var ageGroup = AgeGroupStandardDeviation(courseOfParticipant, ageGroupOfParticipants, k);
                    var language = UniqueLanguages(courseOfParticipant, languageOfParticipants, k);
                    var courseDaysInSameNiveau = CourseDaysInSameNiveauStandardDeviation(courseOfParticipant, courseDaysInSameNiveauOfParticipants, k);

                    var valueForCourse = (ageGroup + 1) * language * (courseDaysInSameNiveau + 1);

                    return(valueForCourse);
                })
                            .Sum();

                solutions.Add(Tuple.Create(courseOfParticipant, value));
            }

            var bestSolutions = solutions.OrderBy(s => s.Item2).Take(10).ToArray();

            // map results
            return(bestSolutions
                   .Select(s =>
                           new SolverResult(
                               s.Item2,
                               s.Item1.Select((courseIndex, participantIndex) => new { courseIndex, participantIndex })
                               .GroupBy(cp => cp.courseIndex)
                               .Select(g => new SolverCourseResult(g.Select(i => param.Participants.ElementAt(i.participantIndex)).ToArray()))
                               .ToList()
                               )
                           ));
        }
Ejemplo n.º 3
0
        public void SolverSeperatesByAge()
        {
            // Arrange
            var solverParam = new SolverParam(2, new[]
            {
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000001"), 2000, Language.French, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000002"), 2005, Language.English, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000003"), 1989, Language.English, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000004"), 1993, Language.English, 1)
            });

            // Act
            var result = _solver.Solve(solverParam);

            // Assert
            AssertSolverResultIsEquivalent(
                expectedComposition: new[] { new[] { 2005, 2000 }, new[] { 1993, 1989 } },
                actualResult: result.First(),
                identifierPropertyResolver: p => p.AgeGroup
                );
        }
Ejemplo n.º 4
0
        public void CourseSizeMultiplierCanDecideWhichSolutionToChoose_HardCaseSingleParticipantCourse()
        {
            // Arrange
            var participants = new[]
            {
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000001"), 2014, Language.French, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000002"), 2015, Language.French, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000003"), 2013, Language.French, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000004"), 2001, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000005"), 1999, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000006"), 2000, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000007"), 2002, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000008"), 1998, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000009"), 2009, Language.Italian, 3)
            };

            var solverParam1 = new SolverParam(1, participants);
            var solverParam2 = new SolverParam(2, participants);
            var solverParam3 = new SolverParam(3, participants);

            // Act
            var result1 = _solver.Solve(solverParam1);
            var result2 = _solver.Solve(solverParam2);
            var result3 = _solver.Solve(solverParam3);
            var results = result1.Concat(result2).Concat(result3).OrderBy(r => r.Score * r.CourseSizeMultiplier).ToArray();

            // Assert
            AssertSolverResultIsEquivalent(
                expectedComposition: new[] { new[] { 2013, 2014, 2015 }, new[] { 1998, 1999, 2000, 2001, 2002 }, new[] { 2009 } },
                actualResult: results.First(),
                identifierPropertyResolver: p => p.AgeGroup
                );

            AssertSolverResultIsEquivalent(
                expectedComposition: new[] { new[] { 2013, 2014, 2015, 2009 }, new[] { 1998, 1999, 2000, 2001, 2002 } },
                actualResult: results.Skip(1).First(),
                identifierPropertyResolver: p => p.AgeGroup
                );
        }
Ejemplo n.º 5
0
        public void SolveTrickyConstellation()
        {
            // Arrange
            var solverParam = new SolverParam(2, new[]
            {
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000001"), 1960, Language.French, 5),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000002"), 1990, Language.French, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000003"), 1980, Language.French, 4),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000004"), 1982, Language.English, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000005"), 2001, Language.English, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000006"), 2003, Language.English, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000007"), 2010, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000008"), 2004, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000009"), 2002, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000010"), 1998, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000011"), 1999, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000012"), 1993, Language.SwissGerman, 0),
                new SolverParticipant(new Guid("00000000-0000-0000-0000-000000000013"), 1992, Language.SwissGerman, 0)
            });

            // Act
            var result = _solver.Solve(solverParam);

            // Assert
            var index = 1;

            foreach (var course in result.First().Courses)
            {
                Debug.WriteLine($"Course #{index++} with {course.Participants.Count()} participants");

                foreach (var par in course.Participants)
                {
                    Debug.WriteLine($"{par.Id} {par.AgeGroup} {par.Language} {par.CoursesDaysInSameNiveau}");
                }
            }

            Assert.Inconclusive("For playing around with the algorithm.");
        }