public Horario generarHorarioBT(string nombre, bool minDias, bool[] listaDias) { Queue<Horario> nodos_vivos = new Queue<Horario>(); Queue<Horario> nodos_vivos_aux = new Queue<Horario>(); Queue<Horario> soluciones = new Queue<Horario>(); Horario optimo = new Horario(nombre, usuario); int cant_p = 0; // como las personales siempre tienen que estar, se meten directamente en el óptimo foreach (Actividad_p personal in seleccionadas_p) { foreach (Turno item in personal.Turnos) { try { if(!listaDias[TaimerLibrary.convertToInt(item.Dia)]) throw new NotSupportedException(); optimo.AddTurno(item); cant_p++; } catch (NotSupportedException) { throw new NotSupportedException("Con las restricciones actuales, la actividad \"" + personal.Nombre + "\" no se puede insertar"); } } } nodos_vivos.Enqueue(optimo); Horario temp; // como las académicas tienen que tener un único turno, se mete cada vez en un horario distinto bool asignado = false; try { foreach (Actividad_a academica in seleccionadas_a) { asignado = false; while (nodos_vivos.Count > 0) { optimo = nodos_vivos.Dequeue(); foreach (Turno item in academica.Turnos) { temp = new Horario(optimo); try { if (!listaDias[TaimerLibrary.convertToInt(item.Dia)]) throw new NotSupportedException(); temp.AddTurno(item); if (temp.Count - cant_p < seleccionadas_a.Count) nodos_vivos_aux.Enqueue(temp); else soluciones.Enqueue(temp); asignado = true; } catch (NotSupportedException) { } } } nodos_vivos = new Queue<Horario>(nodos_vivos_aux); nodos_vivos_aux.Clear(); if (!asignado) throw new NotSupportedException("Con las restricciones actuales, la asignatura \"" + academica.Nombre + "\" no se puede insertar"); } if (seleccionadas_a.Count != 0) { posibles = new List<Horario>(soluciones.ToList()); optimo = null; } else posibles = new List<Horario>(nodos_vivos.ToList()); int puntuacion = int.MaxValue; if (minDias) { foreach (Horario sol in posibles) { if (puntuarDias(sol) < puntuacion) { optimo = sol; puntuacion = puntuarDias(sol); } } } else // suponemos que o es minDias o es minHuecos { foreach (Horario sol in posibles) { if (puntuarHorasHueco(sol) < puntuacion) { optimo = sol; puntuacion = puntuarHorasHueco(sol); } } } } catch (NotSupportedException) { if (posibles != null) { posibles.Clear(); posibles = null; } throw; } return optimo; }
protected Horario horarioPrueba() { Horario h; User user = new User("user", "12345678A", "*****@*****.**", "password", 1, "II"); h = new Horario("horario", user); Actividad_a act = new Actividad_a("Actividad_a", "descripción", "pepe", "II"); h.AddTurno(new Turno(new Hora(9, 0), new Hora(10, 0), dias.L, "ua", act)); h.AddTurno(new Turno(new Hora(21, 0), new Hora(22, 0), dias.L, "ua", act)); h.AddTurno(new Turno(new Hora(13, 30), new Hora(15, 30), dias.L, "ua", act)); h.AddTurno(new Turno(new Hora(9, 30), new Hora(10, 45), dias.M, "ua", act)); h.AddTurno(new Turno(new Hora(16, 30), new Hora(20, 0), dias.M, "ua", act)); h.AddTurno(new Turno(new Hora(9, 0), new Hora(11, 20), dias.J, "ua", act)); h.AddTurno(new Turno(new Hora(12, 30), new Hora(13, 45), dias.J, "ua", act)); h.AddTurno(new Turno(new Hora(12, 0), new Hora(14, 30), dias.V, "ua", act)); h.AddTurno(new Turno(new Hora(21, 0), new Hora(23, 0), dias.V, "ua", act)); h.AddTurno(new Turno(new Hora(13, 30), new Hora(16, 0), dias.S, "ua", act)); h.AddTurno(new Turno(new Hora(16, 0), new Hora(20, 0), dias.S, "ua", act)); return h; }
//Generación de un Horario de forma Voraz public Horario generarHorarioVoraz(string nombre) { // el user será el 1er elemento de la lista de users de Program //User usertest = new User("Aitor Tilla", "12345678X", "*****@*****.**", "password", 1, "Ingeniería de Magisterio"); Horario h = new Horario(nombre, usuario); foreach (Actividad_p personal in seleccionadas_p) { foreach (Turno item in personal.Turnos) { try { h.AddTurno(item); } catch (NotSupportedException) { throw new NotSupportedException("La actividad " + personal.Nombre + " no se puede insertar"); } } } bool asignado; foreach (Actividad_a asig in seleccionadas_a) { asignado = false; foreach (Turno item in asig.Turnos) { if (asignado) break; try { h.AddTurno(item); asignado = true; } catch (NotSupportedException) { asignado = false; } } if (!asignado) throw new NotSupportedException("La asignatura " + asig.Nombre + " no se puede insertar"); } return h; }