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