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[] 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); }