From 573e7c86e80257802754ff72ecd77b5e3a5a8bb1 Mon Sep 17 00:00:00 2001 From: Elias Fierke Date: Wed, 15 Apr 2026 13:22:12 +0200 Subject: [PATCH] [fix:] course amount per semester synchronized with NumCoursesPerSemester, fixing #1 --- crafter.cs | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/crafter.cs b/crafter.cs index e91daf4..1cce44d 100644 --- a/crafter.cs +++ b/crafter.cs @@ -193,6 +193,94 @@ public class CourseCrafter } while (changed && iteration < maxIterations); + // // --- Kurse nachträglich aufteilen, um NumCoursesPerSemester exakt zu erreichen --- + // foreach (var course in GeneratedCourses) + // { + // int sem_count_total = GeneratedCourses.Count(tuple => tuple.Semester == course.Semester); + // if (sem_count_total >= Settings.Instance.NumCoursesPerSemester) break; + // + // int sem_count = GeneratedCourses.Count(tuple => tuple.Semester == course.Semester && tuple.Instance.Sport.Name == course.Instance.Sport.Name); + // + // + // if (sem_count < course.Instance.Sport.Semester[course.Semester - 1] && course.Instance.Students.Count >= course.Instance.Sport.MinStudents *2) + // { + // // hier aufteilen + // Console.WriteLine("Könnte aufgeteilt werden."); + // } + // } + // + // --- Kurse nachträglich aufteilen, um NumCoursesPerSemester exakt zu erreichen --- + for (int semester = 1; semester <= 4; semester++) + { + int cancel = 0; + while (GeneratedCourses.Count(c => c.Semester == semester) < Settings.Instance.NumCoursesPerSemester) + { + cancel++; + if (cancel >= 5) break; + // Kandidaten suchen: splittbare Kurse, deren Sport noch Kapazität hat + var candidate = GeneratedCourses + .Where(c => c.Semester == semester) + .Where(c => c.Instance.Students.Count >= c.Instance.Sport.MinStudents * 2) + .Where(c => + { + int sportCount = GeneratedCourses.Count(g => + g.Semester == semester && + g.Instance.Sport.Name == c.Instance.Sport.Name); + + int allowed = c.Instance.Sport.Semester[semester - 1]; + return sportCount < allowed; + }) + .OrderByDescending(c => c.Instance.Students.Count) + .FirstOrDefault(); + + try + { + + var students = candidate.Instance.Students; + + var newCourse = new CourseInstance + { + Sport = candidate.Instance.Sport, + Students = new List() + }; + + List moved = new(); + + for (int i = students.Count - 1; i >= 0; i--) + { + string stud = students[i]; + + if (newCourse.Students.Count >= candidate.Instance.Sport.MaxStudents) + break; + + // Sicherstellen, dass beide Kurse >= MinStudents bleiben + if (students.Count - moved.Count <= candidate.Instance.Sport.MinStudents) + break; + + newCourse.Students.Add(stud); + moved.Add(stud); + } + + // Validierung + if (newCourse.Students.Count < candidate.Instance.Sport.MinStudents) + break; + + // Move durchführen + foreach (var s in moved) + { + candidate.Instance.Students.Remove(s); + } + + GeneratedCourses.Add((semester, newCourse)); + } + catch + { + + } + + } + } + bool isStudentFree(int semester, string studentID) {