From 6753acc04f0901e21e6ba304c4c5e76861673994 Mon Sep 17 00:00:00 2001 From: Elias Fierke Date: Tue, 17 Mar 2026 14:08:19 +0100 Subject: [PATCH] [chore:] working ai-slop movement for better compensation --- crafter.cs | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/crafter.cs b/crafter.cs index 682a93c..2e426d0 100644 --- a/crafter.cs +++ b/crafter.cs @@ -126,6 +126,72 @@ public class CourseCrafter } } + + // Kurs umdisponieren (besser verteilen) + // Kurs umdisponieren (besser verteilen) + bool changed; + int maxIterations = 20; + int iteration = 0; + + do + { + changed = false; + iteration++; + + // nach Sport gruppieren + var sports = GeneratedCourses + .GroupBy(c => c.Instance.Sport.ID); + + foreach (var sportGroup in sports) + { + var courses = sportGroup.ToList(); + + // paarweise vergleichen + for (int i = 0; i < courses.Count; i++) + { + for (int j = 0; j < courses.Count; j++) + { + if (i == j) continue; + + var cA = courses[i]; + var cB = courses[j]; + + // nur sinnvoll, wenn Unterschied + if (cA.Instance.Students.Count <= cB.Instance.Students.Count + 1) + continue; + + // Kandidaten aus A nach B verschieben + for (int k = cA.Instance.Students.Count - 1; k >= 0; k--) + { + string stud = cA.Instance.Students[k]; + + // 1. Zielsemester frei? + if (!isStudentFree(cB.Semester, stud)) + continue; + + // 2. Zielkurs hat noch Platz? + if (cB.Instance.Students.Count >= cB.Instance.Sport.MaxStudents) + continue; + + // 3. Quellkurs darf nicht unter Min fallen + if (cA.Instance.Students.Count - 1 < cA.Instance.Sport.MinStudents) + continue; + + // --- MOVE durchführen --- + cA.Instance.Students.RemoveAt(k); + students_in_semester[cA.Semester - 1].Remove(stud); + + cB.Instance.Students.Add(stud); + students_in_semester[cB.Semester - 1].Add(stud); + + changed = true; + break; // nach jedem Move neu bewerten + } + } + } + } + + } while (changed && iteration < maxIterations); int getSemester() {