public bool backTrackingRec(Horario horario, int bloque, List <List <Leccion> > pilaPorBloque) { comp++; if (bloque < Datos.listaCursos.Count) { mem += 4; for (int i = 0; i < pilaPorBloque[bloque].Count; i++) { comp++; line++; asig++; mem += 4; for (int j = 0; j < Datos.listaAulas.Count; j++) { comp++; line++; asig++; mem += 4; for (int k = 0; k < 50; k++) { comp++; line++; asig++; pilaPorBloque[bloque][i].setAula(j); asig++; line++; comp++; if (horario.setLeccion(k, bloque, pilaPorBloque[bloque][i], true)) { comp += 8; asig += 3; Leccion temp = pilaPorBloque[bloque][i]; asig++; line++; mem += 12; pilaPorBloque[bloque].RemoveAt(i); line++; comp += 2; asig++; if (backTrackingRec(horario, pilaPorBloque[bloque].Count == 0 ? bloque + 1 : bloque, pilaPorBloque)) { pilaPorBloque[bloque].Insert(i, temp); asig++; line++; return(true); } pilaPorBloque[bloque].Insert(i, temp); asig++; line++; horario.popLeccion(bloque, k); line++; asig++; } else { podas++; } } } } return(false); } else { Datos.horarioFinal = Datos.clonar(horario); asig++; line++; mem += pesoHorario; return(true); } }
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 clonar(Horario origen) { Horario destino = new Horario(); for (int i = 0; i < Datos.listaCursos.Count; i++) { for (int j = 0; j < Datos.listaCursos[i].Count; j++) { destino.setEncargado(i, j, origen.getEncargado(i, j)); } } for (int i = 0; i < 50; i++) { for (int j = 0; j < Datos.listaCursos.Count; j++) { destino.setLeccion(i, j, clonar(origen.getLeccion_bloque(i, j)), true); } } return(destino); }
public static void insertarCria(Horario nueva) { if (nueva == null || Datos.listaHorariosHijos.Count == Datos.individuosporgeneracion) { return; } int newfit = nueva.fitness(); for (int i = 0; i < Datos.listaHorariosHijos.Count; i++) { if (!Datos.distintos(Datos.listaHorariosHijos[i], nueva, 3)) { return; } if (newfit < Datos.listaHorariosHijos[i].fitness()) { Datos.listaHorariosHijos.Insert(i, nueva); return; } } Datos.listaHorariosHijos.Add(nueva); }
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); }