//פונקציות שיוצרות שיבוצים של כל האמהות על פי הבקשות שלהן //כל פונקציה תמיין את רשימת האמהות לפי פרמטר אחר // וכן תבצע חלק מהשיבוצים באמצעות הגרלה //כמובן שכל הפונקציות מתיחסות גם לשמירה על רצף קטן ככל האפשר בין אחיות //פונקצית שיבוץ לכל התלמידות public bool func_shibutz() { while (lst_studens.Count != 0) { studens s = lst_studens[0]; lst_studens.RemoveAt(0); if (Shibutz_stud(s)) { return(func_shibutz()); } lstscheduling.RemoveAll(ss => ss.id_student == s.id); lst_studens.Add(s); } return(false); }
//פונקצית שיבוץ לתלמידה בודדת // אם יכול לשבץ מוסיף לאוסף השיבוץ ומחזיר אמת //אחרת מחזיר שקר bool Shibutz_stud(studens s) { //נשלוף את הבקשות של האמא //את השיבוצים של האחיות של התלמידה // את השעות הפנויות בכיתה שלה //וננסה לשבץ באופן שמתאים לכל הקריטריונים request r = s.parents.request.FirstOrDefault(); if (r == null) { r = new request(); r.id_parent = s.id_parent; r.from_hour = s.classes.times.FirstOrDefault().from_hour; r.to_hour = s.classes.times.FirstOrDefault().to_hour; } List <scheduling> lstSis = lstscheduling.Where(ss => ss.studens.id_parent == s.id_parent).ToList(); List <scheduling> lstClass = lstscheduling.Where(ss => ss.studens.code_class == s.code_class) .OrderBy(ss => ss.hour_).ToList(); //לולאה שעוברת על כל השעות שבטווח הבקשה של האמא //ומנסה לשבץ //אם הצליחה מחזירה אמת for (TimeSpan h = r.from_hour; h < r.to_hour; h.Add(new TimeSpan(0, 15, 0))) { if (lstSis == null || lstSis.Where(ss => ss.hour_.Equals(h)).FirstOrDefault() == null) { if (lstClass.Where(ss => ss.hour_.Equals(h)).ToList().Count < 2) { //שיבוץ בפועל //והחזרת אמת scheduling x = new scheduling(); x.code_class = s.code_class; x.hour_ = h; x.id_student = s.id; lstscheduling.Add(x); return(true); } } } //אם לא הצליחה //לולאה שעוברת על כל הטווח של הכיתה //ומנסה לשבץ //!!!!!!!!!!!!!!!!!!!!!!!!!!חובה לשנות שישלוף את הזמנים של הכיתה times tt = new times();//global.PARENTS.times.Where(t => t.code_class == s.code_class); for (TimeSpan h = tt.from_hour; h < tt.to_hour; h.Add(new TimeSpan(0, 15, 0))) { if (lstClass.Where(ss => ss.hour_.Equals(h)).ToList().Count < 2) { if (lstSis == null || lstSis.Where(ss => ss.hour_.Equals(h)).FirstOrDefault() == null) { { //שיבוץ בפועל //והחזרת אמת scheduling x = new scheduling(); x.code_class = s.code_class; x.hour_ = h; x.id_student = s.id; lstscheduling.Add(x); return(true); } } } } //אם לא הצליחה יחזיר שקר return(false); }
//פונקצית שיבוץ לתלמידה בודדת // אם יכול לשבץ מוסיף לאוסף השיבוץ ומחזיר אמת //אחרת מחזיר שקר public bool Shibutz_stud(studens s) { //נשלוף את הבקשות של האמא //את השיבוצים של האחיות של התלמידה // את השעות הפנויות בכיתה שלה //וננסה לשבץ באופן שמתאים לכל הקריטריונים //בקשות parents p = new parents(); p = allParents .Where(t => t.id == s.id_parent).FirstOrDefault(); request r = allRquest .Where(rr => rr.id_parent == p.id).FirstOrDefault(); if (r == null) { r = new request(); r.id_parent = s.id_parent; r.from_hour = allTimes.Where(t => t.code_class == s.code_class).FirstOrDefault().from_hour; r.to_hour = allTimes.Where(t => t.code_class == s.code_class).FirstOrDefault().to_hour; } //שיבוצים של אחיות List <studens> lst_sis = allStudents .Where(a => a.id_parent == s.id_parent).ToList(); List <scheduling> lstSis = new List <scheduling>(); foreach (studens item in lst_sis) { scheduling scd = lstscheduling .Where(u => u.id_student == item.id) .FirstOrDefault(); if (scd != null) { lstSis.Add(scd); } } //שעות פנויות בכיתה ממוין לפי שעה List <studens> all_class = allStudents .Where(cc => cc.code_class == s.code_class).ToList(); List <scheduling> lstClassNotEmpty = new List <scheduling>(); foreach (var item in all_class) { scheduling scd = lstscheduling .Where(cc => cc.id_student == item.id).FirstOrDefault(); if (scd != null) { lstClassNotEmpty.Add(scd); } } lstClassNotEmpty = lstClassNotEmpty.OrderBy(ss => ss.hour_).ToList(); TimeSpan t1 = allTimes .Where(o => o.code_class == s.code_class) .FirstOrDefault().from_hour; TimeSpan t2 = allTimes .Where(o => o.code_class == s.code_class) .FirstOrDefault().to_hour; List <TimeSpan> lstClass = new List <TimeSpan>(); for (TimeSpan h = t1; h < t2; h += (new TimeSpan(0, 15, 0))) { if (lstClassNotEmpty.Where(ss => ss.hour_.Equals(h)).ToList().Count() == 1) { lstClass.Add(h); } else if (lstClassNotEmpty.Where(ss => ss.hour_.Equals(h)).ToList().Count() == 0) { lstClass.Add(h); lstClass.Add(h); } } //לולאה שעוברת על כל השעות שבטווח הבקשה של האמא //ומנסה לשבץ //אם הצליחה מחזירה אמת for (TimeSpan h = r.from_hour; h < r.to_hour; h += (new TimeSpan(0, 15, 0))) { if (lstSis == null || lstSis.Where(ss => ss.hour_.Equals(h)).FirstOrDefault() == null) { TimeSpan f = lstClass.Where(ss => ss == h).FirstOrDefault(); if (lstClass.Where(ss => ss == h).FirstOrDefault() != (new TimeSpan(00, 00, 00)) && h >= t1 && h < t2) { //שיבוץ בפועל //והחזרת אמת scheduling x = new scheduling(); x.code_class = s.code_class; x.hour_ = h; x.id_student = s.id; lstscheduling.Add(x); return(true); } } } //אם לא הצליחה //לולאה שעוברת על כל הטווח של הכיתה //ומנסה לשבץ foreach (TimeSpan h in lstClass) { if (lstSis == null || lstSis.Where(ss => ss.hour_.Equals(h)).FirstOrDefault() == null) { { //שיבוץ בפועל //והחזרת אמת scheduling x = new scheduling(); x.code_class = s.code_class; x.hour_ = h; x.id_student = s.id; lstscheduling.Add(x);; return(true); } } } //אם לא הצליחה יחזיר שקר return(false); }