Exemplo n.º 1
0
        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 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);
        }