public void GetStudents(Schedule schedule) { double[,] scores = new double[100, 100]; int[] studentIndexes = Enumerable.Range(0, 100).ToArray(); int[] finalExamIndexes = Enumerable.Range(0, 100).ToArray(); Student[] students = ctx.Students; for (int student_id = 0; student_id < 100; student_id++) { for (int ts = 0; ts < 100; ts++) { scores[student_id, ts] = ctx.Heuristics[student_id].ScoreForTimeSlot[ts]; } } EgervaryAlgorithm.RunAlgorithm(scores, studentIndexes, finalExamIndexes); for (int f = 0; f < 100; f++) { schedule.FinalExams[f].Student = students[finalExamIndexes[f]]; schedule.FinalExams[f].Supervisor = schedule.FinalExams[f].Student.Supervisor; Console.WriteLine($"A {f}. záróvizsgán {students[finalExamIndexes[f]].Name} a diák, {scores[finalExamIndexes[f], f]} súllyal"); //Console.WriteLine(schedule.FinalExams[f].Student.Name); } }
/*public Dictionary<Student, int[]> GetStudentPoints() * { * Dictionary<Student, int[]> studentPoints = new Dictionary<Student, int[]>(); * for (int i = 0; i < 100; i++) * { * //TODO * Random random = new Random(); * int[] points = new int[100]; * for (int j = 0; j < 100; j++) * { * points[j] = random.Next(0, 5000); * * } * ctx.Heuristics[i].ScoreForTimeSlot[i] = 5; * studentPoints.Add(ctx.Students[i], points); * } * * * return studentPoints; * }*/ public void GetPresidents(Schedule schedule) { int sectionNr = ctx.Students.Length / 5; int presidentOne = (int)((sectionNr / ctx.Presidents.Length) * 1.2); int presindetAll = presidentOne * ctx.Presidents.Length; Instructor[] allPresidents = new Instructor[presindetAll]; for (int presidentNr = 0; presidentNr < ctx.Presidents.Length; presidentNr++) { for (int i = presidentNr * presidentOne; i < presidentOne * (presidentNr + 1); i++) { allPresidents[i] = ctx.Presidents[presidentNr]; } } double[,] scores = new double[presindetAll, 20]; int[] presidentIndexes = Enumerable.Range(0, presindetAll).ToArray(); int[] finalExamIndexes = Enumerable.Range(0, sectionNr).ToArray(); for (int p = 0; p < presindetAll; p++) { int j = 0; for (int f = 0; f < 100; f += 5) { int countMinus = 0; for (int i = f; i < f + 5; i++) { if (allPresidents[p].Availability[i] == false) { countMinus++; } } if (countMinus > 0) { scores[p, j] -= countMinus * Scores.PresidentNotAvailable; } j++; } } EgervaryAlgorithm.RunAlgorithm(scores, presidentIndexes, finalExamIndexes); for (int f = 0; f < finalExamIndexes.Length; f++) { for (int i = f * 5; i < f * 5 + 5; i++) { schedule.FinalExams[i] = new FinalExam(); schedule.FinalExams[i].Id = i; schedule.FinalExams[i].President = allPresidents[finalExamIndexes[f]]; Console.WriteLine($"A {i}. záróvizsgán a {allPresidents[finalExamIndexes[f]].Name} az elnök, {scores[finalExamIndexes[f], f]} súllyal"); } } }
public void GetSecretaries(Schedule schedule) { int secretaryOne = (int)((20 / ctx.Secretaries.Length) * 1.5); int secretaryAll = secretaryOne * ctx.Secretaries.Length; Instructor[] allSecretaries = new Instructor[secretaryAll]; for (int secretaryNr = 0; secretaryNr < ctx.Secretaries.Length; secretaryNr++) { for (int i = secretaryNr * secretaryOne; i < secretaryOne * (secretaryNr + 1); i++) { allSecretaries[i] = ctx.Secretaries[secretaryNr]; } } double[,] scores = new double[secretaryAll, 20]; int[] secretaryIndexes = Enumerable.Range(0, secretaryAll).ToArray(); int[] finalExamIndexes = Enumerable.Range(0, 20).ToArray(); for (int p = 0; p < secretaryAll; p++) { int j = 0; for (int f = 0; f < 100; f += 5) { int countMinus = 0; for (int i = f; i < f + 5; i++) { if (allSecretaries[p].Availability[i] == false) { countMinus++; } } if (countMinus > 0) { scores[p, j] -= countMinus * Scores.SecretaryNotAvailable; } j++; } } EgervaryAlgorithm.RunAlgorithm(scores, secretaryIndexes, finalExamIndexes); for (int f = 0; f < finalExamIndexes.Length; f++) { //FinalExam finalExam = new FinalExam(); //finalExam.Secretary = allSecretaries[finalExamIndexes[f]]; for (int i = f * 5; i < f * 5 + 5; i++) { schedule.FinalExams[i].Secretary = allSecretaries[finalExamIndexes[f]]; Console.WriteLine($"A {i}. záróvizsgán a {allSecretaries[finalExamIndexes[f]].Name} a titkár, {scores[finalExamIndexes[f], f]} súllyal"); } } }
public void GetExaminers(Schedule schedule) { /*for (int i = 0; i < 100; i++) * { * schedule.FinalExams[i].Examiner = ctx.Instructors[ctx.Rnd.Next(0, ctx.Instructors.Length)]; * }*/ foreach (Course course in ctx.Courses) { int numOfStudents = 0; List <Student> allStudents = new List <Student>(); List <int> studentFEIndexes = new List <int>(); /*foreach (Student st in ctx.Students) * { * if (st.ExamCourse == course) numOfStudents++; * allStudents.Add(st); * //Array.IndexOf(schedule.FinalExams,) * //schedule.FinalExams.Where((index) => schedule.FinalExams[index].Student == st); * //studentIndexes.Add(( * }*/ //Student[] allStudents = new Student[numOfStudents]; for (int i = 0; i < 100; i++) { if (schedule.FinalExams[i].Student.ExamCourse == course) { numOfStudents++; allStudents.Add(schedule.FinalExams[i].Student); studentFEIndexes.Add(i); } } int oneInstructorNr = ((int)Math.Ceiling((double)numOfStudents / course.Instructors.Length)); int allInstructorsNr = oneInstructorNr * course.Instructors.Length; Instructor[] allExaminer = new Instructor[allInstructorsNr]; for (int examinerNr = 0; examinerNr < course.Instructors.Length; examinerNr++) { for (int i = examinerNr * oneInstructorNr; i < oneInstructorNr * (examinerNr + 1); i++) { allExaminer[i] = course.Instructors[examinerNr]; } } double[,] scores = new double[numOfStudents, allInstructorsNr]; int[] studentIndexes = Enumerable.Range(0, numOfStudents).ToArray(); int[] instructorIndexes = Enumerable.Range(0, allInstructorsNr).ToArray(); for (int stud = 0; stud < numOfStudents; stud++) { for (int instr = 0; instr < allInstructorsNr; instr++) { if (allExaminer[instr].Availability[studentFEIndexes[stud]] == false) { scores[stud, instr] -= Scores.ExaminerNotAvailable; } if (allExaminer[instr] == schedule.FinalExams[studentFEIndexes[stud]].President) { scores[stud, instr] += Scores.ExaminerNotPresident; } } } EgervaryAlgorithm.RunAlgorithm(scores, instructorIndexes, studentIndexes); for (int f = 0; f < studentIndexes.Length; f++) { schedule.FinalExams[studentFEIndexes[f]].Examiner = allExaminer[studentIndexes[f]]; //schedule.FinalExams[f].Member = allMembers[finalExamIndexes[f]]; Console.WriteLine($"A {studentFEIndexes[f]}. záróvizsgán {allExaminer[studentIndexes[f]].Name} a vizsgáztató, {scores[studentIndexes[f], f]} súllyal"); } } }
public void GetMembers(Schedule schedule) { List <int> remainingExams = Enumerable.Range(0, schedule.FinalExams.Length).ToList(); int[] memberWorkloads = new int[ctx.Members.Length]; for (int i = 0; i < 100; i++) { if (schedule.FinalExams[i].Supervisor.Roles.HasFlag(Roles.Member)) { schedule.FinalExams[i].Member = schedule.FinalExams[i].Supervisor; remainingExams.Remove(i); memberWorkloads[Array.IndexOf(ctx.Members, schedule.FinalExams[i].Member)]++; } if (schedule.FinalExams[i].President.Roles.HasFlag(Roles.Member)) { schedule.FinalExams[i].Member = schedule.FinalExams[i].President; remainingExams.Remove(i); memberWorkloads[Array.IndexOf(ctx.Members, schedule.FinalExams[i].Member)]++; } if (schedule.FinalExams[i].Secretary.Roles.HasFlag(Roles.Member)) { schedule.FinalExams[i].Member = schedule.FinalExams[i].Secretary; remainingExams.Remove(i); memberWorkloads[Array.IndexOf(ctx.Members, schedule.FinalExams[i].Member)]++; } if (schedule.FinalExams[i].Examiner.Roles.HasFlag(Roles.Member)) { schedule.FinalExams[i].Member = schedule.FinalExams[i].Examiner; remainingExams.Remove(i); memberWorkloads[Array.IndexOf(ctx.Members, schedule.FinalExams[i].Member)]++; } } int memberOne = (int)((remainingExams.Count / ctx.Members.Length) * 3); int memberAll = memberOne * ctx.Members.Length; Instructor[] allMembers = new Instructor[memberAll]; for (int memberNr = 0; memberNr < ctx.Members.Length; memberNr++) { for (int i = memberNr * memberOne; i < memberOne * (memberNr + 1); i++) { allMembers[i] = ctx.Members[memberNr]; } } double[,] scores = new double[memberAll, remainingExams.Count]; int[] memberIndexes = Enumerable.Range(0, memberAll).ToArray(); int[] finalExamIndexes = Enumerable.Range(0, remainingExams.Count).ToArray(); for (int p = 0; p < memberAll; p++) { for (int f = 0; f < remainingExams.Count; f++) { if (allMembers[p].Availability[remainingExams[f]] == false) { scores[p, f] -= Scores.MemberNotAvailable; } scores[p, f] -= memberWorkloads[Array.IndexOf(ctx.Members, allMembers[p])] * Scores.MemberWorkloadBad; } } EgervaryAlgorithm.RunAlgorithm(scores, memberIndexes, finalExamIndexes); for (int f = 0; f < finalExamIndexes.Length; f++) { schedule.FinalExams[remainingExams[f]].Member = allMembers[finalExamIndexes[f]]; Console.WriteLine($"A {remainingExams[f]}. záróvizsgán {allMembers[finalExamIndexes[f]].Name} a tag, {scores[finalExamIndexes[f], f]} súllyal"); } }