public static List <Horario> crucePMX(int padre, int madre, bool multiBloque)
        {
            PMX.camada = new List <Horario>();
            camada.Add(Datos.clonar(Datos.listaHorariosPadres[padre]));
            camada.Add(Datos.clonar(Datos.listaHorariosPadres[madre]));
            int[] intervalo = new int[2];
            int   repeticiones;

            if (multiBloque)
            {
                repeticiones = Datos.randy.Next(Datos.listaCursos.Count > 1?2:0, Datos.listaCursos.Count);
            }
            else
            {
                repeticiones = 1;
            }
            for (int r = 0; r < repeticiones; r++)
            {
                int          bloque = Datos.randy.Next(0, Datos.listaCursos.Count);
                List <int[]> mapeo  = new List <int[]>();
                Leccion      aux;
                intervalo[0] = Datos.randy.Next(0, 30);
                intervalo[1] = Datos.randy.Next(intervalo[0], intervalo[0] + 20);
                //for (int i = intervalo[0]; i <= intervalo[1]; i++)
                //{
                //    for (int j = 0; j < 2; j++)
                //    {
                //        int x = camada[j].getEncargado(camada[(j + 1) % 2].getLeccion_bloque(i, bloque));
                //        if (x != -1 && !Datos.listaProfesores[x].horavalida(i))
                //        {
                //            fallos+=2;
                //            return new List<Horario>() { null, null };
                //        }
                //    }
                //}
                for (int i = intervalo[0]; i <= intervalo[1]; i++)
                {
                    aux = camada[0].popLeccion(bloque, i);
                    camada[0].insertarFuerte(i, bloque, camada[1].popLeccion(bloque, i), intervalo[0], intervalo[1]);
                    camada[1].insertarFuerte(i, bloque, aux, intervalo[0], intervalo[1]);

                    mapeo = insertarMapeo(mapeo, new int[2] {
                        camada[0].getLeccion_bloque(i, bloque) != null ? camada[0].getLeccion_bloque(i, bloque).getCurso() : -1,
                        camada[1].getLeccion_bloque(i, bloque) != null ? camada[1].getLeccion_bloque(i, bloque).getCurso() : -1
                    });
                }
                Leccion[,] pila = new Leccion[2, mapeo.Count];
                int[,] horas    = new int[mapeo.Count, 2];
                for (int h = 0; h < mapeo.Count; h++)
                {
                    for (int k = 0; k < 50; k++)
                    {
                        if (k == intervalo[0])
                        {
                            k = intervalo[1];
                        }
                        for (int m = 0; m < 2; m++)
                        {
                            if (mapeo[h][m] == -1)
                            {
                                if (camada[m].getLeccion_bloque(k, bloque) == null)
                                {
                                    pila[(m + 1) % 2, h] = null;
                                    horas[h, m]          = k;
                                }
                            }
                            else
                            {
                                if (pila[(m + 1) % 2, h] == null && camada[m].getLeccion_bloque(k, bloque) != null &&
                                    camada[m].getLeccion_bloque(k, bloque).getCurso() == mapeo[h][m])
                                {
                                    aux = camada[m].popLeccion(bloque, k);;
                                    pila[(m + 1) % 2, h] = aux;
                                    horas[h, m]          = k;
                                }
                            }
                        }
                    }
                }
                //mutacion
                for (int i = 0; i < 2; i++)
                {
                    int x = Datos.randy.Next(0, pila.GetLength(1) / 3 == 0 ? Datos.randy.Next(0, 2) : (pila.GetLength(1) / 3) + 1);
                    for (int j = 0; j < x; j++)
                    {
                        mutaciones++;
                        int a, b;
                        a          = Datos.randy.Next(0, pila.GetLength(1));
                        b          = Datos.randy.Next(0, pila.GetLength(1));
                        aux        = pila[i, a];
                        pila[i, a] = pila[i, b];
                        pila[i, b] = aux;
                    }
                }
                //mutacion
                for (int i = 0; i < pila.GetLength(1); i++)
                {
                    for (int j = 0; j < 2; j++)
                    {
                        camada[j].insertarFuerte(horas[i, j], bloque, pila[j, i], intervalo[0], intervalo[1]);
                    }
                }
            }

            for (int i = 0; i < 2; i++)
            {
                if (camada[i].apto() != null)
                {
                    camada[i] = null;
                }
            }
            if (camada[0] == null && camada[1] == null)
            {
                fallos++;
            }
            return(camada);
        }
Example #2
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);
        }