private void ResuelveEmpalme(ListaVariables empalme)
        {
            ListaGrupos    Temp;
            ListaVariables aux;
            Salon          s;

            aux = empalme.Empalmados();

            //Chequeo de empalme
            if (aux.Count > 1 && permiteEmpalmes.busca(aux[0].Cve_espacio) == null)
            {
                s = salones.busca(empalme[0].Cve_espacio);
                if (s == null)
                {
                    return;             //Si no encuentra el salon es porque es algo como Campo o asi. Se valen los empalmes
                }
                aux.SetSalones(salones);

                Temp = new ListaGrupos(empalme.EnSalonesFijos().Where(g => g.Salon_fijo == s.Cve_espacio).ToList());

                if (Temp.Count() != 0)//Solo uno tiene preferencia, y a ese se le va a dar
                {
                    AsignacionPreferencial(empalme, s);
                }
                else    // Si no hay preferencial entonces se elegira por otro medio
                {
                    AsignacionMejorEleccion(empalme, s);
                }
            }

            grupos.Actualiza(empalme);
        }
        /// <summary>
        /// Selecciona entre la lista de grupos el salon que tiene mas puntos en la base de datos para el salon
        /// </summary>
        /// <param name="empalme"></param>
        /// <param name="s"></param>
        private void AsignacionMejorEleccion(ListaVariables empalme, Salon s)
        {
            Variable gOtrosSemestres = null, gAux = null, g = null;

            //Obtiene los gupos validos
            ListaVariables validos = empalme.Validos();
            //Obtiene los grupos que estaban
            ListaVariables otrosSemestres = new ListaVariables(validos.AsignacionOtrosSemestres(s.Cve_espacio));

            otrosSemestres.SetSalones(salones);
            validos.SetSalones(salones);
            otrosSemestres = otrosSemestres.OrdenarMejorPuntuacion(s);
            ListaVariables aux = validos.OrdenarMejorPuntuacion(s);

            gAux            = aux.Count != 0 ? (aux as IList <Variable>)[0] : null;
            gOtrosSemestres = otrosSemestres.Count != 0 ? (otrosSemestres as IList <Variable>)[0] : null;

            if (gAux != null && gOtrosSemestres != null)
            {
                g = gAux.Puntos > gOtrosSemestres.Puntos ? gAux : gOtrosSemestres;
            }
            else if (gAux != null && gOtrosSemestres == null)
            {
                g = gAux;
            }
            else
            {
                g = gOtrosSemestres;
            }

            QuitaSalon(empalme, g);
        }
        /// <summary>
        /// Checa si el salon se puede asignar, y si no evalua los cambios que hay que hacer y si los hace
        /// </summary>
        /// <param name="grupo">Grupo a asignar</param>
        /// <param name="s">Salon en que se quiere asignar</param>
        /// <returns></returns>
        private bool AsignaEnSalon(Variable grupo, Salon s)
        {
            try
            {
                //Checa si es apto para el grupo
                if (grupo.CalculaPuntos(s) <= 0 ||
                    grupo.Cupo >= s.Cupo)
                {
                    return(false);
                }

                if (s.Disponible(grupo.horario))
                {
                    grupo.Salon = s;
                    return(true);
                }

                //Obtiene los grupos que estan asignados de este salon
                ListaVariables enSalon = new ListaVariables(Grupos.EnSalon(s.Cve_espacio));

                //Obtiene los grupos con los que se crusaria
                ListaVariables conEmpalme = enSalon.Empalmados(grupo);

                //Compara el maximo puntaje de los grupos contra el que tendria estre grupo
                if (grupo.CalculaPuntos(s) > conEmpalme.MaxPuntos())
                {
                    //Quita la asignacon de los grupos y asigna al nuevo grupo
                    foreach (Variable g in conEmpalme)
                    {
                        g.Salon = null;
                    }

                    if (s.Disponible(grupo.horario))    //Checa si no hay problemas con grupos de otras horas
                    {
                        Grupos.Actualiza(conEmpalme);   //actualiza los grupos en otros horarios

                        grupo.Salon = s;

                        return(true);
                    }
                    else
                    {
                        foreach (Variable g in conEmpalme)
                        {
                            g.Salon = s;
                        }
                    }
                }
            }
            catch (Exception) { }

            return(false);
        }
        /// <summary>
        /// Asigna salon a los que estan marcados con un salon fijo
        /// </summary>
        /// <param name="forzado">Si quiere que se cambie al salon preferencial sin importar si ya tiene salon asignado</param>
        /// <returns></returns>
        public void preferencial()
        {
            ListaVariables gruposPreferencial = new ListaVariables(grupos.SalonFijo());

            foreach (Variable g in gruposPreferencial)
            {
                if (g.Cve_espacio == "")
                {
                    g.salonPreferencial();
                    GruposModificados.Add(g);
                }
            }
        }
        /// <summary>
        /// Busca el grupo que tiene preferencia sobre el salon y a ese se le asigna
        /// </summary>
        /// <param name="empalmes"></param>
        /// <param name="s"></param>
        private void AsignacionPreferencial(ListaVariables empalmes, Salon s)
        {
            Grupo g = null;

            QuitaSalon(empalmes, g);

            foreach (Grupo grupo in empalmes)
            {
                if (grupo.Salon_fijo == s.Cve_espacio)
                {
                    g.Cve_espacio = s.Cve_espacio;
                }
            }
        }
 public ChecaEmpalmes(ListaGrupos _grupos, IList <Salon> _salones)
 {
     EmpalmesResueltos = new List <Grupo>();
     grupos            = new ListaVariables(_grupos);
     salones           = new ListaSalones(_salones);
     permiteEmpalmes   = salones.PermiteEmpalmes();
     if (Grupos.Count != 0)
     {
         ciclo = Grupos[0].Ciclo;
     }
     else
     {
         ciclo = "";
     }
 }
        /// <summary>
        /// Marca el inicio del algoritmo
        /// </summary>
        /// <returns>Lista con los grupos asignados</returns>
        public void AsignaSalones()
        {
            rescate();

            //Generacion
            for (int g = 0; g < generaciones; g++)
            {
                foreach (Individuo i in poblacion)
                {
                    try { i.Mutacion(); }
                    catch (Exception)
                    { /*Solo ignorala ya saldra otra que si sirva*/ }
                }

                rescate();
            }

            gruposAsignados = mejorRespuesta();
        }
        /// <summary>
        /// Constructor de la iteracion del algoritmo
        /// </summary>
        /// <param name="grupos">Lista de grupos a asignar</param>
        /// <param name="salones">Lista de salones disponibles para asignar</param>
        public Algoritmo(ListaGrupos grupos, ListaSalones salones, int hora, int _tamPoblacion = 5, int _generaciones = 50)
        {
            this.grupos  = new ListaVariables(grupos.SinAsignar());
            this.grupos  = this.grupos.EnHoras(hora, hora + 1);
            this.grupos  = this.grupos.EnDias();
            this.salones = salones.Asignables();
            this.hora    = hora;
            tamPoblacion = _tamPoblacion;
            generaciones = _generaciones;
            errores      = new ListaVariables();

            poblacion      = new Individuo[tamPoblacion];
            mejorPoblacion = new Individuo[tamPoblacion];

            for (int i = 0; i < tamPoblacion; i++)
            {
                poblacion[i] = new Individuo(Grupos, hora);
                poblacion[i].asignaSalones(Salones);
            }
        }
        /// <summary>
        /// Busca los empalmes en el horario designado y comienza a acomodarlos
        /// </summary>
        /// <returns></returns>
        public void ejecuta()
        {
            List <ListaVariables> empalmados = new List <ListaVariables>();
            ListaGrupos           checando   = new ListaGrupos();

            //obtiene grupos de grupos empalmados
            empalmados = new ListaVariables(grupos.NoEn(permiteEmpalmes)).AgrupaGruposEmpalmados();

            foreach (ListaVariables empalme in empalmados)
            {
                try
                { ResuelveEmpalme(empalme); }
                catch (Exception)//Se le quita el salon a todos
                { QuitaSalon(empalme); }

                foreach (Grupo g in empalme)
                {
                    EmpalmesResueltos.Add(g);
                }
            }
        }
 public PreAsignacion(ListaVariables _g, ListaSalones _s)
 {
     GruposModificados = new ListaVariables();
     grupos            = _g;
     salones           = _s;
 }
 public ListaVariables(ListaVariables grupos, IList <Profesor> Profesores = null, IList <Materia> Materias = null) : base(grupos, Profesores != null ? Profesores :grupos.profesores, Materias != null ? Materias: grupos.materias)
 {
 }