Esempio n. 1
0
        public bool backTrackingRec(Horario horario, int bloque, List <List <Leccion> > pilaPorBloque)
        {
            comp++; if (bloque < Datos.listaCursos.Count)
            {
                mem += 4; for (int i = 0; i < pilaPorBloque[bloque].Count; i++)
                {
                    comp++; line++; asig++;
                    mem += 4; for (int j = 0; j < Datos.listaAulas.Count; j++)
                    {
                        comp++; line++; asig++;
                        mem += 4; for (int k = 0; k < 50; k++)
                        {
                            comp++; line++; asig++;
                            pilaPorBloque[bloque][i].setAula(j); asig++; line++;

                            comp++;  if (horario.setLeccion(k, bloque, pilaPorBloque[bloque][i], true))
                            {
                                comp += 8; asig += 3;
                                Leccion temp = pilaPorBloque[bloque][i]; asig++; line++; mem += 12;
                                pilaPorBloque[bloque].RemoveAt(i); line++;
                                comp += 2; asig++; if (backTrackingRec(horario, pilaPorBloque[bloque].Count == 0 ? bloque + 1 : bloque, pilaPorBloque))
                                {
                                    pilaPorBloque[bloque].Insert(i, temp); asig++; line++;
                                    return(true);
                                }
                                pilaPorBloque[bloque].Insert(i, temp); asig++; line++;
                                horario.popLeccion(bloque, k); line++; asig++;
                            }
                            else
                            {
                                podas++;
                            }
                        }
                    }
                }
                return(false);
            }
            else
            {
                Datos.horarioFinal = Datos.clonar(horario); asig++; line++; mem += pesoHorario;
                return(true);
            }
        }
        public static bool distintos(Horario a, Horario b, int x)
        {
            int diferencias = 0;

            for (int i = 0; i < Datos.listaCursos.Count; i++)
            {
                for (int j = 0; j < 50; j++)
                {
                    if (!Datos.cursoEqual(a.getLeccion_bloque(j, i), b.getLeccion_bloque(j, i)))
                    {
                        diferencias++;
                        if (diferencias > cantidadlecciones / x)
                        {
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
        public static Horario clonar(Horario origen)
        {
            Horario destino = new Horario();

            for (int i = 0; i < Datos.listaCursos.Count; i++)
            {
                for (int j = 0; j < Datos.listaCursos[i].Count; j++)
                {
                    destino.setEncargado(i, j, origen.getEncargado(i, j));
                }
            }
            for (int i = 0; i < 50; i++)
            {
                for (int j = 0; j < Datos.listaCursos.Count; j++)
                {
                    destino.setLeccion(i, j, clonar(origen.getLeccion_bloque(i, j)), true);
                }
            }
            return(destino);
        }
        public static void insertarCria(Horario nueva)
        {
            if (nueva == null || Datos.listaHorariosHijos.Count == Datos.individuosporgeneracion)
            {
                return;
            }
            int newfit = nueva.fitness();

            for (int i = 0; i < Datos.listaHorariosHijos.Count; i++)
            {
                if (!Datos.distintos(Datos.listaHorariosHijos[i], nueva, 3))
                {
                    return;
                }
                if (newfit < Datos.listaHorariosHijos[i].fitness())
                {
                    Datos.listaHorariosHijos.Insert(i, nueva);
                    return;
                }
            }
            Datos.listaHorariosHijos.Add(nueva);
        }
Esempio n. 5
0
        public static Horario[] cruceCyclex(int padre, int madre)
        {
            Horario[] camada = new Horario[2] {
                new Horario(), new Horario()
            };
            Horario a = Datos.listaHorariosPadres[padre];
            Horario b = Datos.listaHorariosPadres[madre];

            camada[0].datocurso = a.datocurso;
            camada[1].datocurso = b.datocurso;

            int bloque = Datos.randy.Next(0, Datos.listaCursos.Count);

            for (int i = 0; i < Datos.listaCursos.Count; i++)
            {
                if (i != bloque)
                {
                    for (int j = 0; j < 50; j++)
                    {
                        camada[0].setLeccion(j, i, a.getLeccion_bloque(j, i), true);
                        camada[1].setLeccion(j, i, b.getLeccion_bloque(j, i), true);
                    }
                }
            }
            List <int> restantes = new List <int>();

            for (int i = 0; i < 50; i++)
            {
                restantes.Add(i);
            }
            List <List <int> > ciclos = new List <List <int> >();

            while (restantes.Count != 0)
            {
                ciclos.Add(new List <int>());
                int inicio = Datos.randy.Next(0, restantes.Count);
                ciclos[ciclos.Count - 1].Add(restantes[inicio]);
                restantes.RemoveAt(inicio);
                while (!Datos.cursoEqual(a.getLeccion_bloque(ciclos[ciclos.Count - 1][0], bloque),
                                         b.getLeccion_bloque(ciclos[ciclos.Count - 1][ciclos[ciclos.Count - 1].Count - 1], bloque)))
                {
                    for (int i = 0; i < restantes.Count; i++)
                    {
                        if (Datos.cursoEqual(a.getLeccion_bloque(restantes[i], bloque),
                                             b.getLeccion_bloque(ciclos[ciclos.Count - 1][ciclos[ciclos.Count - 1].Count - 1], bloque)))
                        {
                            ciclos[ciclos.Count - 1].Add(restantes[i]);
                            restantes.RemoveAt(i);
                            break;
                        }
                    }
                }
            }
            Horario[] padres = new Horario[2] {
                a, b
            };
            int index;

            for (int i = 0; i < ciclos.Count; i++)
            {
                if (Datos.randy.Next(0, 9) == 0)
                {
                    index = i + 1;
                    mutaciones++;
                }
                else
                {
                    index = i;
                }
                while (ciclos[i].Count != 0)
                {
                    if (camada[0] != null && !camada[0].insertarFuerte(ciclos[i][0], bloque, padres[index % 2].getLeccion_bloque(ciclos[i][0], bloque), 51, -2))
                    {
                        camada[0] = null;
                        fallos++;
                    }
                    if (camada[1] != null && !camada[1].insertarFuerte(ciclos[i][0], bloque, padres[(index + 1) % 2].getLeccion_bloque(ciclos[i][0], bloque), 51, -2))
                    {
                        camada[1] = null;
                        fallos++;
                    }
                    ciclos[i].RemoveAt(0);
                    if (camada[0] == null && camada[1] == null)
                    {
                        return(camada);
                    }
                }
            }
            return(camada);
        }