/// <summary> /// V databazi vzplni slovnik, ktery slouzi pro ziskani odkazu na vsechny studenty, /// kteri navstevuji danou rozvrhovou akci, tj. preklar RoakIdno na seznam studentu. /// </summary> /// <param name="data"></param> private static void FillStudentsOnRoakIdno(STAG_Database data) { foreach (Student student in data.Students) { foreach (RozvrhovaAkce ra in student.Rozvrh) { if (!data.StudentsOnRoakIdno.ContainsKey(ra.RoakIdno)) { // Na zkoumanou akci jsme narazili poprve => pridame do slovniku // "Zapiseme" na ni studenta, u ktereho jsme ji objevili List <Student> studentList = new List <Student>(); studentList.Add(student); // Pridame zaznam do slovniku data.StudentsOnRoakIdno.Add(ra.RoakIdno, studentList); } else { // Zkoumanou akci jsme uz nekdy zavedli => staci jen pridat studenta // Student bude v kazdem listu zaveden jen jednou, protoze informace zpracovavam po jednotlivych studentech data.StudentsOnRoakIdno[ra.RoakIdno].Add(student); } } } }
/// <summary> /// Přidá list akcí jako jednu SRA /// </summary> private static void PridejSRADoDatabaze(List <NormalizovanaAkce> listAkci, ref STAG_Database data) { List <RozvrhovaAkce> rAkce = new List <RozvrhovaAkce>(); foreach (var akce in listAkci) { rAkce.Add(akce.Akce); } data.SuperRozvrhoveAkce.Add(new SRA(rAkce)); }
/// <summary> /// Hlavní funkce, která zpracuje rozvrhové akce do SRA /// </summary> /// <param name="data">STAG databáze</param> public static void Preprocess(this STAG_Database data) { Dictionary <Tuple <string, string, string>, List <NormalizovanaAkce> > zimakRozdelene = new Dictionary <Tuple <string, string, string>, List <NormalizovanaAkce> >(); Dictionary <Tuple <string, string, string>, List <NormalizovanaAkce> > letnakRozdelene = new Dictionary <Tuple <string, string, string>, List <NormalizovanaAkce> >(); Dictionary <string, List <string> > zimakBudovyMistnosti = new Dictionary <string, List <string> >(); Dictionary <string, List <string> > letnakBudovyMistnosti = new Dictionary <string, List <string> >(); Debug.WriteLine("---- Zacatek Preprocess debug vypisu ----"); foreach (var dvojce in data.Akce) { var akce = dvojce.Value; switch (akce.Semestr) { case ("ZS"): if (akce.DenZkr != null && akce.Budova != null && akce.Mistnost != null) { RozdelAkce(akce, ref zimakRozdelene, ref zimakBudovyMistnosti); } else { //Debug.WriteLine("Akce bez dne/budovy/mistnosti (ZS): "+akce.Katedra+"/"+ akce.Predmet); PridejSRADoDatabaze(akce, ref data); } break; case ("LS"): if (akce.DenZkr != null && akce.Budova != null && akce.Mistnost != null) { RozdelAkce(akce, ref letnakRozdelene, ref letnakBudovyMistnosti); } else { //Debug.WriteLine("Akce bez dne/budovy/mistnosti (LS): " + akce.Katedra + "/" + akce.Predmet); PridejSRADoDatabaze(akce, ref data); } break; default: Debug.WriteLine("!!! Akce bez semestru (0S): " + akce.Katedra + "/" + akce.Predmet); //TODO by asi nemělo nastat takže jinak asi vyhodit nějakou chybu break; } } VytvorSuperRozvrhoveAkce(zimakRozdelene, zimakBudovyMistnosti, ref data); VytvorSuperRozvrhoveAkce(letnakRozdelene, letnakBudovyMistnosti, ref data); Debug.WriteLine("---- Konec Preprocess debug vypisu ----"); }
/// <summary> /// Analyza zateze pomoci SRA. /// </summary> /// <param name="data"></param> private static void Normalni_metoda(STAG_Database data) { // Zjistime si, kdo chodi na predmety FillStudentsOnRoakIdno(data); SRAAnalyzer analyzer = new SRAAnalyzer(data.zatezNaStudenta, data.StudentsOnRoakIdno); foreach (SRA sra in data.SuperRozvrhoveAkce) { analyzer.AnalyzeSRA(sra); } }
private static void Fandova_hloupa_metoda(STAG_Database data) { foreach (var student in data.Students) { List <Predmet> kredityLS = new List <Predmet>(); List <Predmet> kredityZS = new List <Predmet>(); int maxKredituZS = 0; int maxKredituLS = 0; // projdu vsechny akce na ktere student chodi a ulozim nazev predmetu foreach (var akce in student.Rozvrh) { if (akce.Semestr == "LS") { if (!kredityLS.Contains(akce.PredmetRef)) { kredityLS.Add(akce.PredmetRef); } } else { if (!kredityZS.Contains(akce.PredmetRef)) { kredityZS.Add(akce.PredmetRef); } } } int a; if (student.OsCislo == "F13104") { a = 5; } // spocteni kreditu ze vsech predmetu v ZS a LS maxKredituZS = (from predmet in kredityZS select predmet.Kreditu).Sum(); maxKredituLS = (from predmet in kredityLS select predmet.Kreditu).Sum(); if (maxKredituZS == 0) { continue; } // spocteni zatizeni kateder v zimnim semestru SpoctiPodil(student.PodilKatedryZS, kredityZS, maxKredituZS); SpoctiPodil(student.PodilKatedry, kredityZS, maxKredituZS + maxKredituLS); // podil za oba semestry if (maxKredituLS == 0) { continue; } // spocteni zatizeni kateder v letnim semestru SpoctiPodil(student.PodilKatedryLS, kredityLS, maxKredituLS); SpoctiPodil(student.PodilKatedry, kredityLS, maxKredituZS + maxKredituLS); // podil za oba semestry Debug.WriteLine("Hloupá analýza hotavá"); } }
/// <summary> /// Přidá jednu akci jako jednu SRA /// </summary> private static void PridejSRADoDatabaze(RozvrhovaAkce akce, ref STAG_Database data) { data.SuperRozvrhoveAkce.Add(new SRA(akce)); }
/// <summary> /// Funkce, která zpracuje všechny a propojí akce, které probíhají společně /// </summary> private static void VytvorSuperRozvrhoveAkce( Dictionary <Tuple <string, string, string>, List <NormalizovanaAkce> > rozdeleneAkce, Dictionary <string, List <string> > budovyMistnosti, ref STAG_Database data) { List <string> dny = new List <string>() { "Po", "Út", "St", "Čt", "Pá", "So", "Ne" }; //vytvoření Listu pro projetí dnů //TextWriter tw = new StreamWriter("kontrola_pakci.txt"); foreach (var budova in budovyMistnosti.Keys) //budovy { foreach (var mistnost in budovyMistnosti[budova]) //místnosti v budově { foreach (var den in dny) //den v týdnu { var denBudovaMistnost = new Tuple <string, string, string>(den, budova, mistnost); //vytvoření trojce - budova-místnost-den if (!rozdeleneAkce.ContainsKey(denBudovaMistnost)) { break; //zjištení jestli existuje toto spojení } var normAkce = rozdeleneAkce[denBudovaMistnost]; //získání akcí v dané budově, místnosti a dnu List <List <NormalizovanaAkce> > listPodezdrelichAkci = new List <List <NormalizovanaAkce> >() { }; //vyvoření listu pro spol rozvrhové akce pro pozdější zpracování //tw.WriteLine(budova + " " + mistnost + " - " + den); //tw.WriteLine("--- Všechny akce ---"); foreach (var nAkce in normAkce) //všechny akce v dané budově-místnosti-dni { //tw.WriteLine(nAkce.ToString()); bool jePouzita = false; foreach (var podezdreleAkce in listPodezdrelichAkci) { foreach (var pAkce in podezdreleAkce) { if (nAkce.NormZacatek >= pAkce.NormZacatek && nAkce.NormKonec <= pAkce.NormKonec && nAkce.Tyden == pAkce.Tyden && nAkce.TydenOd >= pAkce.TydenOd && nAkce.TydenDo <= pAkce.TydenDo) //kontrola, zda li patří k již roztříděné akci { podezdreleAkce.Add(nAkce); jePouzita = true; break; } } if (jePouzita) { break; } } if (!jePouzita) { listPodezdrelichAkci.Add(new List <NormalizovanaAkce>() { nAkce }); //nepatřila k žádné jiné akci tak dostane vlastní list } } //tw.WriteLine("--- Podezdřelé akce ---"); //int pocet = 1; foreach (var podezdeleAkce in listPodezdrelichAkci) //zpracování roztříděný akcí do SRA { PridejSRADoDatabaze(podezdeleAkce, ref data); /* * tw.WriteLine("--- List " + pocet + " ---"); * foreach (var pAkce in podezdeleAkce) * { * tw.WriteLine(pAkce.ToString()); * } * pocet++; */ } //tw.WriteLine("--------------------------------------"); //tw.WriteLine(); } } } //tw.Flush(); //tw.Close(); }