public bool seCruzan(Grupo g) { if (this.Materia.Codigo == g.Materia.Codigo) return true; for (int i = 0; i < g.Clases.Count(); i++) { for (int j = 0; j < Clases.Count(); j++) { if (g.Clases[i].cruzaClase(Clases[j])) return true; } } return false; }
private static void pintarHorario(object[,] horariosArray, Horario horario, int rCnt, Dictionary <string, Color> colores, int counter) { string[] dias = new string[] { "Lunes", "Martes", "Miercoles", "Jueves", "Viernes!", "Sabado", "Domingo", "", "Horario# " + counter, "Codigo: " + horario.Id }; for (int i = 0; i < dias.Length; i++) { horariosArray[rCnt, i + 1] = dias[i]; } rCnt++; horario.Sort((a, b) => a.Materia.Nombre.CompareTo(b.Materia.Nombre)); for (int i = 0; i < horario.Count(); i++) { Grupo grupo = horario[i]; Materia materia = grupo.Materia; List <Clase> clases = grupo.Clases; for (int j = 0; j < clases.Count(); j++) { Clase clase = clases[j]; int dia = clase.NumeroDia + 1; horariosArray[rCnt, dia] = FileManager.reporteClase(grupo, clase); } rCnt++; } }
public void Add(Grupo g) { Grupos.Add(g); }
public static string reporteClase(Grupo g, Clase c) { return "Gr-" + g.Id + Environment.NewLine + g.Materia.Nombre.Trim() + Environment.NewLine + "Prof: " + g.NombreCortoProfesor + Environment.NewLine + c.HoraInicio + "-" + c.HoraFin; }
public static void leerArchivo(Excel.Worksheet hoja, Carrera carrera, int semestre) { Excel.Range range = hoja.UsedRange; int totalFilas = range.Rows.Count; var startCell = (Range)hoja.Cells[1, 1]; var endCell = (Range)hoja.Cells[totalFilas, 4]; var toGetRange = hoja.Range[startCell, endCell]; object[,] data = toGetRange.Value2; int filaActual = 1; while (filaActual <= totalFilas) { if (data[filaActual, 1] != null) { string nombre = (string)data[filaActual, 1]; int creditos = 0; string strCod = (string)data[filaActual, 3]; if ((nombre != null) && (strCod != null)) { int codigo = Convert.ToInt32(strCod); Materia m = new Materia(nombre, creditos, codigo); int grupoActual = 0; Grupo g = null; do { string cadena = (string)data[filaActual, 2]; if (cadena != null) { string[] cadenas = cadena.Split(' '); int numGrupo = Convert.ToInt32(cadenas[0]); if (grupoActual != numGrupo) { grupoActual = numGrupo; string nombreProfesor = ""; for (int j = 1; j < cadenas.Length; j++) nombreProfesor += cadenas[j] + " "; nombreProfesor = nombreProfesor.TrimEnd(); g = new Grupo(nombreProfesor, m, grupoActual); m.Add(g); } do { string[] clase = ((string)data[filaActual, 4]).Split(' '); string salon = clase[3]; int horaInicioInt = Convert.ToInt32(clase[1].Replace(":", "")); int horaFinInt = Convert.ToInt32(clase[2].Replace(":", "")); bool contiene = false; for (int i = 0; i < g.Clases.Count && !contiene; i++) { Clase ca = g.Clases[i]; contiene = (ca.HoraInicio == horaInicioInt && ca.HoraFin == horaFinInt && ca.NumeroDia == Clase.GetDiaSubStringToInt(clase[0])); } if (!contiene) g.Add(new Clase(Clase.GetDiaSubStringToInt(clase[0]), horaInicioInt, horaFinInt, salon)); filaActual++; } while (filaActual <= totalFilas && (data[filaActual, 2] == null || ((string)data[filaActual, 2]) == "") && data[filaActual, 4] != null); filaActual--; } filaActual++; } while (filaActual <= totalFilas && data[filaActual, 1] == null && data[filaActual, 4] != null); filaActual--; carrera.Semestres[semestre - 1].Materias.Add(m); } } filaActual++; } }
private bool verificar(Grupo grupo, Horario array, Dictionary<string, int> indicedGrupo) { int indice = indicedGrupo[grupo.Materia.Nombre + "" + grupo.Id]; foreach (Grupo g in array) { if (!g.Compatibles[indice]) return false; } return true; }
public void eliminarGrupo(Grupo g) { Grupos.Remove(g); }
private int GetNextGroupIndex(Dictionary <string, int> indicesGrupos, Horario horario) { Grupo g = horario[horario.Count() - 1]; return(indicesGrupos[g.Materia.Nombre + "" + g.Id] + 1); }
public List <Horario> GenerarHorarios(int diasLibresEsperados, bool enSemana) { if (existenMateriasRepetidas()) { throw new Exception("Existen materias repetidas en la selección actual." + Environment.NewLine + "Revise las materias seleccionadas."); } if (Materias.Count > 8) { throw new Exception("Debe seleccionar máximo " + EasyHour.LIMITE_MATERIAS + " materias"); } List <Horario> iniciales = horariosInicialesDeGrupos(Grupos); List <Horario>[] horariosPorMaterias = new List <Horario> [9]; for (int i = 0; i < horariosPorMaterias.Length; i++) { horariosPorMaterias[i] = new List <Horario>(); } foreach (Horario h in iniciales) { horariosPorMaterias[1].Add(h); } Dictionary <string, int> indicesGrupos = new Dictionary <string, int>(500); for (int i = 0; i < Grupos.Count; i++) { Grupo g = Grupos[i]; g.Compatibles = new bool[Grupos.Count]; indicesGrupos.Add(g.Materia.Nombre + "" + g.Id, i); } for (int i = 0; i < Grupos.Count; i++) { Grupo g1 = Grupos[i]; for (int j = i; j < Grupos.Count; j++) { Grupo g2 = Grupos[j]; bool ver = g1.seCruzan(g2); g1.Compatibles[j] = g2.Compatibles[i] = !ver; } } combinarHorarios(horariosPorMaterias, iniciales, Grupos, indicesGrupos); List <Horario> listaGenerados = horariosPorMaterias[Materias.Count]; int horariosGenerados = listaGenerados.Count; if (horariosGenerados != 0) { bool a = buscarHorariosRepetidos(horariosPorMaterias); int b = filtrarPorDias(listaGenerados); ordenarHorariosPorHoraMedia(listaGenerados); eliminarHorariosSinRestriccionesIdeales(listaGenerados); if (diasLibresEsperados != 0) { filtrarDiasCantidadLibre(listaGenerados, diasLibresEsperados, enSemana); } int c = filtrarHoraDia(listaGenerados); } horariosPorMaterias = null; GC.Collect(); return(listaGenerados); }
public static void leerArchivo(Excel.Worksheet hoja, Carrera carrera, int semestre) { Excel.Range range = hoja.UsedRange; int totalFilas = range.Rows.Count; var startCell = (Range)hoja.Cells[1, 1]; var endCell = (Range)hoja.Cells[totalFilas, 4]; var toGetRange = hoja.Range[startCell, endCell]; object[,] data = toGetRange.Value2; int filaActual = 1; while (filaActual <= totalFilas) { if (data[filaActual, 1] != null) { string nombre = (string)data[filaActual, 1]; int creditos = 0; string strCod = (string)data[filaActual, 3]; if ((nombre != null) && (strCod != null)) { int codigo = Convert.ToInt32(strCod); Materia m = new Materia(nombre, creditos, codigo); int grupoActual = 0; Grupo g = null; do { string cadena = (string)data[filaActual, 2]; if (cadena != null) { string[] cadenas = cadena.Split(' '); int numGrupo = Convert.ToInt32(cadenas[0]); if (grupoActual != numGrupo) { grupoActual = numGrupo; string nombreProfesor = ""; for (int j = 1; j < cadenas.Length; j++) { nombreProfesor += cadenas[j] + " "; } nombreProfesor = nombreProfesor.TrimEnd(); g = new Grupo(nombreProfesor, m, grupoActual); m.Add(g); } do { string[] clase = ((string)data[filaActual, 4]).Split(' '); string salon = clase[3]; int horaInicioInt = Convert.ToInt32(clase[1].Replace(":", "")); int horaFinInt = Convert.ToInt32(clase[2].Replace(":", "")); bool contiene = false; for (int i = 0; i < g.Clases.Count && !contiene; i++) { Clase ca = g.Clases[i]; contiene = (ca.HoraInicio == horaInicioInt && ca.HoraFin == horaFinInt && ca.NumeroDia == Clase.GetDiaSubStringToInt(clase[0])); } if (!contiene) { g.Add(new Clase(Clase.GetDiaSubStringToInt(clase[0]), horaInicioInt, horaFinInt, salon)); } filaActual++; } while (filaActual <= totalFilas && (data[filaActual, 2] == null || ((string)data[filaActual, 2]) == "") && data[filaActual, 4] != null); filaActual--; } filaActual++; } while (filaActual <= totalFilas && data[filaActual, 1] == null && data[filaActual, 4] != null); filaActual--; carrera.Semestres[semestre - 1].Materias.Add(m); } } filaActual++; } }
public static string reporteClase(Grupo g, Clase c) { return("Gr-" + g.Id + Environment.NewLine + g.Materia.Nombre.Trim() + Environment.NewLine + "Prof: " + g.NombreCortoProfesor + Environment.NewLine + c.HoraInicio + "-" + c.HoraFin); }