예제 #1
0
        private void GenerateTimetable()
        {
            //Generam tabela de profesori goala
            GenerateInitialStateProfessorsTimetable();

            TimetableDataContext context = new TimetableDataContext();

            //Initializam toate clasele cu module si sunt toate libere
            List <bool> moduleLibere = new List <bool> {
                false, false, false, false, false
            };

            //Lista cu id-uri si zilele saptamanii
            List <int> classRooms_ID = (from c in context.ClassRooms
                                        select c.ID).ToList();
            List <string> zileSaptaman = new List <string> {
                "luni", "marti", "miercuri", "joi", "vineri"
            };

            //Dictionar final legaturi clasa->zile_saptamana->Module
            Dictionary <int, Dictionary <string, List <bool> > > classRooms_Zile_Module = new Dictionary <int, Dictionary <string, List <bool> > >();

            foreach (int index in classRooms_ID)
            {
                Dictionary <string, List <bool> > zileSaptaman_Module_temp = new Dictionary <string, List <bool> >();
                zileSaptaman_Module_temp.Add("luni", moduleLibere.ToList());
                zileSaptaman_Module_temp.Add("marti", moduleLibere.ToList());
                zileSaptaman_Module_temp.Add("miercuri", moduleLibere.ToList());
                zileSaptaman_Module_temp.Add("joi", moduleLibere.ToList());
                zileSaptaman_Module_temp.Add("vineri", moduleLibere.ToList());

                classRooms_Zile_Module.Add(index, zileSaptaman_Module_temp);
            }

            //Selectam toate grupele
            IEnumerable <Group> grupeStudenti = from g in context.Groups
                                                select g;

            Random rnd = new Random();

            //Parchurgem fiecare grupa
            foreach (Group grupa in grupeStudenti)
            {
                //Selectam orele de curs
                IEnumerable <Attend> oreCurs = from a in context.Attends
                                               where a.Group_ID == grupa.ID
                                               select a;

                GroupTimetable gt = new GroupTimetable();
                gt.NumeGrupa = grupa.Description;
                gt.Clasa     = new List <string>();
                gt.Zi        = new List <string>();
                gt.Modul     = new List <int>();
                gt.OraCurs   = new List <string>();

                //Parcurgem fiecare ora de Curs de 2 ori!
                for (int i = 0; i < 2; i++)
                {
                    foreach (var oraCurs in oreCurs)
                    {
                        bool clasaGasita = false;
                        int  contorEsec  = -1;

                        while (!clasaGasita)
                        {
                            int croom_rnd   = rnd.Next(0, classRooms_ID.Count());
                            int weekday_rnd = rnd.Next(0, 5);
                            int modul_rnd;
                            contorEsec++;
                            if (contorEsec >= 12)
                            {
                                modul_rnd = rnd.Next(0, 5);
                            }
                            else
                            {
                                modul_rnd = rnd.Next(0, 3);
                            }

                            if (classRooms_Zile_Module[classRooms_ID[croom_rnd]][zileSaptaman[weekday_rnd]][modul_rnd] == false)
                            {
                                string numeSala = (from sal in context.ClassRooms
                                                   where sal.ID == classRooms_ID[croom_rnd]
                                                   select sal.Name).First();

                                //Verificam daca nu avem deja modulul acela ocupat
                                bool checkOcupat = false;
                                for (int j = 0; j < gt.Zi.Count(); j++)
                                {
                                    if (zileSaptaman[weekday_rnd] == gt.Zi[j] && modul_rnd == gt.Modul[j])
                                    {
                                        checkOcupat = true;
                                        break;
                                    }
                                }
                                //Verificam daca nu se suprapun 2 profesori
                                if (CheckProfessorsSync(numeSala, zileSaptaman[weekday_rnd], modul_rnd, oraCurs.Class.Name, grupa.Description, oraCurs.Class.Professor.Name) == false)
                                {
                                    checkOcupat = true;
                                }

                                if (checkOcupat == true)
                                {
                                    continue;
                                }

                                //Adaugam in lista aici
                                gt.Clasa.Add(numeSala);
                                gt.Zi.Add(zileSaptaman[weekday_rnd]);
                                gt.Modul.Add(modul_rnd);
                                gt.OraCurs.Add(oraCurs.Class.Name);

                                classRooms_Zile_Module[classRooms_ID[croom_rnd]][zileSaptaman[weekday_rnd]][modul_rnd] = true;
                                clasaGasita = true;
                            }
                        }
                    }
                }
                orarFinalGrupe.Add(gt);
            }
        }
        private void cbox_Groups_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbox_Groups.SelectedIndex == -1)
            {
                return;
            }

            lview_Orar.Items.Clear();


            GroupTimetable gt = new GroupTimetable();

            foreach (var item in orarFinalGrupe)
            {
                if (item.NumeGrupa == cbox_Groups.Text)
                {
                    gt = item;
                    break;
                }
            }

            string[] rowLuni     = { "Luni", "", "", "", "", "" };
            string[] rowMarti    = { "Marti", "", "", "", "", "" };
            string[] rowMiercuri = { "Miercuri", "", "", "", "", "" };
            string[] rowJoi      = { "Joi", "", "", "", "", "" };
            string[] rowVineri   = { "Vineri", "", "", "", "", "" };

            List <ListViewItem> items = new List <ListViewItem>();

            for (int i = 0; i < gt.Zi.Count(); i++)
            {
                if (gt.Zi[i] == "luni")
                {
                    rowLuni[gt.Modul[i] + 1] = gt.OraCurs[i] + " : " + gt.Clasa[i];
                }
                else if (gt.Zi[i] == "marti")
                {
                    rowMarti[gt.Modul[i] + 1] = gt.OraCurs[i] + " : " + gt.Clasa[i];
                }
                else if (gt.Zi[i] == "miercuri")
                {
                    rowMiercuri[gt.Modul[i] + 1] = gt.OraCurs[i] + " : " + gt.Clasa[i];
                }
                else if (gt.Zi[i] == "joi")
                {
                    rowJoi[gt.Modul[i] + 1] = gt.OraCurs[i] + " : " + gt.Clasa[i];
                }
                else if (gt.Zi[i] == "vineri")
                {
                    rowVineri[gt.Modul[i] + 1] = gt.OraCurs[i] + " : " + gt.Clasa[i];
                }
            }

            items.Add(new ListViewItem(rowLuni));
            items.Add(new ListViewItem(rowMarti));
            items.Add(new ListViewItem(rowMiercuri));
            items.Add(new ListViewItem(rowJoi));
            items.Add(new ListViewItem(rowVineri));

            foreach (var item in items)
            {
                lview_Orar.Items.Add(item);
            }
        }