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