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);
        }
Esempio n. 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);
        }