Ejemplo n.º 1
0
        static void Main(string[] args)
        {
            Stopwatch      crono          = new Stopwatch();
            Process        currentProcess = System.Diagnostics.Process.GetCurrentProcess();
            long           totalBytesOfMemoryUsed;
            Random         rnd = new Random();
            List <Cursos>  cursos;
            List <Horario> listaHorarios = new List <Horario>();
            Horario        horario;
            List <Profes>  listaProfes = new List <Profes>();

            //---------------------------------------------Crea los profesores---------------------------------------------------------------
            for (int i = 0; i < 20; i++)
            {
                listaProfes.Add(new Profes(i + 1, "Profe" + ((i + 1)), (rnd.Next(1, 8)) * 2));
            }

            //---------------------------------------------Construye el horario--------------------------------------------------------------
            int cont  = 1;
            int cont2 = 1;
            int vecesEnSemana;
            int semestre = 6;

            while (semestre != 0)              //Crea horarios la cantidad de semestres establecida
            {
                int horas  = 60;               // Cantidad de horas de posibles clases incluidads las libres
                int libres = rnd.Next(10, 15); //Un random de la cantidad de libres que tendra el horario
                horas  -= (libres * 2);        //Se multiplica *2 debido a que cada clase son 2 horas
                cursos  = new List <Cursos>();
                horario = new Horario();
                for (int i = 0; i < libres; i++)//Añade las libres a cursos
                {
                    cursos.Add(new Cursos(cont, "Libre"));
                    cont += 1;
                }

                while (horas != 0)//Se le iran restando hasta que llegue a 0 para saber que ya no hay mas posibles clases
                {
                    //(int ID, int nEstudiantes, String nombre, Aulas aula, int nClases,int semestre,Profes profe,int grupo)
                    if (horas == 2)//Si solo queda espacio para una clase, establece la cantidad de veces del curso a 1
                    {
                        cursos.Add(new Cursos(cont, rnd.Next(15, 31), "Curso" + cont2, null, 1, rnd.Next(1, 9), null, rnd.Next(1, 10)));
                        horas -= 2;
                    }
                    else
                    {
                        vecesEnSemana = rnd.Next(1, 3);// Random de cantidad de veces que tendra lugar una clase durante la semana
                        Cursos cursoActual = new Cursos(cont, rnd.Next(15, 31), "Curso" + cont2, null, vecesEnSemana, rnd.Next(1, 9), null, rnd.Next(1, 10));
                        cursos.Add(cursoActual);

                        if (vecesEnSemana == 1)//Si es una vez resta 2 horas, sino resta 4 por q serian 2 veces en la semana
                        {
                            horas -= 2;
                        }
                        else
                        {
                            horas -= 4;
                        }
                    }
                    cont  += 1;
                    cont2 += 1;
                }
                horario.cursos = cursos;
                horario.llenaLecciones();
                horario.DesordenarLista();
                listaHorarios.Add(horario);

                semestre -= 1;
            }
            //---------------------------------------------Imprime los horarios--------------------------------------------------------------
            foreach (Horario h in listaHorarios)
            {
                int hora = 7;
                Console.WriteLine("\t" + "Lunes" + "\t" + "Martes" + "\t" + "Mierco" + "\t" + "Jueves" + "\t" + "Viernes");
                for (int i = 0; i < 6; i++)
                {
                    Console.Write(hora + ":00" + "\t");
                    for (int k = 0; k < 5; k++)
                    {
                        Cursos a = h.matriz[k, i];
                        if (a.nombre != "Libre")
                        {
                            Console.Write(a.nombre + "\t");
                        }
                        else
                        {
                            Console.Write("Libre" + "\t");
                        }
                    }
                    hora += 2;
                    Console.WriteLine();
                }
                Console.WriteLine("-------------------------cambio semestre-------------------------");
            }

            //---------------------------------------------asdasdasdasdasdasdasdasd--------------------------------------------------------------
            Horario       p1 = new Horario();
            Horario       p2 = new Horario();
            Horario       h1 = new Horario();
            Horario       h2 = new Horario();
            Horario       h3 = new Horario();
            Horario       h4 = new Horario();
            List <Cursos> l1 = new List <Cursos>();
            List <Cursos> l2 = new List <Cursos>();

            List <Horario> listaHorariosPMX    = new List <Horario>();
            List <Horario> listaHorariosSimple = new List <Horario>();

            for (int i = 0; i < listaHorarios[0].cursos.Count; i++)
            {
                l1.Add(listaHorarios[0].cursos[i]);
                l2.Add(listaHorarios[0].cursos[i]);
                h1.cursos.Add(listaHorarios[0].cursos[i]);
                h2.cursos.Add(listaHorarios[0].cursos[i]);
                h3.cursos.Add(listaHorarios[0].cursos[i]);
                h4.cursos.Add(listaHorarios[0].cursos[i]);
            }

            p1.cursos = l1;
            p1.llenaLecciones();
            p1.DesordenarLista();

            Console.WriteLine();

            listaHorariosPMX.Add(p1);
            listaHorariosSimple.Add(p1);

            p2.cursos = l2;
            p2.llenaLecciones();
            p2.DesordenarLista();
            p2.DesordenarLista();
            listaHorariosPMX.Add(p2);
            listaHorariosSimple.Add(p2);

            int[] pruebaP1 = new int[p1.lecciones.Count];
            int[] pruebaP2 = new int[p1.lecciones.Count];
            for (int i = 0; i < p1.lecciones.Count; i++)
            {
                pruebaP1[i] = p1.lecciones[i].nleccion;
                pruebaP2[i] = p2.lecciones[i].nleccion;
            }

            Console.WriteLine("-------------------------------------------Prueba PMX-------------------------------------");
            crono.Start();
            int[] pruebaPMX  = PMX2(pruebaP1, pruebaP2);
            int[] pruebaPMX2 = PMX2(pruebaP2, pruebaP1);
            for (int i = 0; i < pruebaPMX.Length; i++)
            {
                foreach (Cursos c in listaHorarios[0].lecciones)
                {
                    if (c.nleccion == pruebaPMX[i])
                    {
                        h1.lecciones.Add(c);
                    }
                }
            }
            for (int i = 0; i < pruebaPMX2.Length; i++)
            {
                foreach (Cursos c in listaHorarios[0].lecciones)
                {
                    if (c.nleccion == pruebaPMX2[i])
                    {
                        h2.lecciones.Add(c);
                    }
                }
            }
            Console.WriteLine(h1.lecciones.Count);
            //h1.llenaHorario();
            listaHorariosPMX.Add(h1);
            listaHorariosPMX.Add(h2);

            /*for (int i = 0; i < prueba1.Length; i++)
             * {
             *  Console.Write(prueba1[i]+"-");
             * }
             * Console.WriteLine();
             * for (int i = 0; i < prueba2.Length; i++)
             * {
             *  Console.Write(prueba2[i] + "-");
             * }
             * Console.WriteLine();
             * for (int i = 0; i < prueba.Length; i++)
             * {
             *  Console.Write(prueba[i] + "-");
             * }
             * Console.WriteLine();
             */



            Tuple <Horario, Horario> nuevaGenPMX = fitnessAux(p1, p2, h1, h2);

            nuevaGenPMX.Item1.llenaHorario();
            nuevaGenPMX.Item2.llenaHorario();


            //OJO CON ESTO///////////////////////
            totalBytesOfMemoryUsed = currentProcess.WorkingSet64;
            /////////////////////////////////////
            crono.Stop();
            foreach (Horario h in listaHorariosPMX)
            {
                foreach (Cursos cur in h.lecciones)
                {
                    Console.Write(cur.nleccion + "-");
                }
                Console.WriteLine();
                Console.WriteLine("-------------------------PMX-------------------------");
            }
            Console.WriteLine("Tiempo Transcurrido: " + crono.Elapsed + " ms");
            Console.WriteLine("Cantidad de memoria utilizada: " + totalBytesOfMemoryUsed / 1000000 + " MB");
            Console.ReadKey();
            Console.WriteLine(" ");
            int horaa = 7;

            Console.WriteLine("\t" + "Lunes" + "\t" + "Martes" + "\t" + "Mierco" + "\t" + "Jueves" + "\t" + "Viernes");
            for (int i = 0; i < 6; i++)
            {
                Console.Write(horaa + ":00" + "\t");
                for (int k = 0; k < 5; k++)
                {
                    Cursos a = nuevaGenPMX.Item1.matriz[k, i];
                    Console.Write(a.nombre + a.nleccion + "\t");
                }
                horaa += 2;
                Console.WriteLine();
            }
            Console.WriteLine("-------------------------cambio semestre-------------------------");
            horaa = 7;
            Console.WriteLine("\t" + "Lunes" + "\t" + "Martes" + "\t" + "Mierco" + "\t" + "Jueves" + "\t" + "Viernes");
            for (int i = 0; i < 6; i++)
            {
                Console.Write(horaa + ":00" + "\t");
                for (int k = 0; k < 5; k++)
                {
                    Cursos a = nuevaGenPMX.Item2.matriz[k, i];
                    Console.Write(a.nombre + a.nleccion + "\t");
                }
                horaa += 2;
                Console.WriteLine();
            }
            Console.WriteLine("-------------------------cambio semestre-------------------------");

            Console.WriteLine();

            Console.ReadKey();
            // Console.WriteLine("-------------------------------------------Prueba Simple-------------------------------------");
            crono.Start();
            Tuple <int[], int[]> pruebaSimple = CruceSimple(pruebaP1, pruebaP2);

            for (int i = 0; i < pruebaSimple.Item1.Length; i++)
            {
                foreach (Cursos c in listaHorarios[0].lecciones)
                {
                    if (c.nleccion == pruebaPMX[i])
                    {
                        h3.lecciones.Add(c);
                    }
                }
            }
            for (int i = 0; i < pruebaSimple.Item2.Length; i++)
            {
                foreach (Cursos c in listaHorarios[0].lecciones)
                {
                    if (c.nleccion == pruebaPMX2[i])
                    {
                        h4.lecciones.Add(c);
                    }
                }
            }
            listaHorariosSimple.Add(h3);
            listaHorariosSimple.Add(h4);

            Tuple <Horario, Horario> nuevaGenSimple = fitnessAux(p1, p2, h1, h2);

            nuevaGenSimple.Item1.llenaHorario();
            nuevaGenSimple.Item2.llenaHorario();

            //OJO CON ESTO///////////////////////
            totalBytesOfMemoryUsed = currentProcess.WorkingSet64;
            /////////////////////////////////////
            crono.Stop();
            Console.WriteLine("Tiempo Transcurrido: " + crono.Elapsed + " ms");
            Console.WriteLine("Cantidad de memoria utilizada: " + totalBytesOfMemoryUsed / 1000000 + " MB");
            Console.ReadKey();
            Console.WriteLine(" ");

            horaa = 7;
            Console.WriteLine("\t" + "Lunes" + "\t" + "Martes" + "\t" + "Mierco" + "\t" + "Jueves" + "\t" + "Viernes");
            for (int i = 0; i < 6; i++)
            {
                Console.Write(horaa + ":00" + "\t");
                for (int k = 0; k < 5; k++)
                {
                    Cursos a = nuevaGenSimple.Item1.matriz[k, i];
                    Console.Write(a.nombre + a.nleccion + "\t");
                }
                horaa += 2;
                Console.WriteLine();
            }
            Console.WriteLine("-------------------------cambio semestre-------------------------");
            horaa = 7;
            Console.WriteLine("\t" + "Lunes" + "\t" + "Martes" + "\t" + "Mierco" + "\t" + "Jueves" + "\t" + "Viernes");
            for (int i = 0; i < 6; i++)
            {
                Console.Write(horaa + ":00" + "\t");
                for (int k = 0; k < 5; k++)
                {
                    Cursos a = nuevaGenSimple.Item2.matriz[k, i];
                    Console.Write(a.nombre + a.nleccion + "\t");
                }
                horaa += 2;
                Console.WriteLine();
            }
            Console.WriteLine("-------------------------cambio semestre-------------------------");

            Console.WriteLine();

            Console.ReadKey();
        }