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