public virtual Formacion GetProximaFormacion(long t) { Formacion fMin = null; foreach (Servicio servicio in Servicios) { Formacion formacion = servicio.GetProximaFormacion(t); if (fMin != null) { if (formacion.HoraPosibleSalida < fMin.HoraPosibleSalida) { fMin = formacion; } } else { fMin = formacion; } } fMin.ActualizarHoraSalida(fMin.HoraPosibleSalida); fMin.MarcarProgramacionCorrespondiente(); return(fMin); }
public virtual int GetTiempoAtencion(Formacion formacion, int cantidadDePersonas) { // Parámetros en segundos. Retorna minutos. int tiempoPorPersona = 4; int cantPersonasXPuerta = 2; int cantVagones = formacion.TiposCoche.Values.Sum(); int cantPuertasXVagon = 3; int tiempoAtencionMinimo = 10; return(((cantidadDePersonas * tiempoPorPersona) / (cantPersonasXPuerta * cantPuertasXVagon * cantVagones) + tiempoAtencionMinimo) / 60); }
public virtual int PasajerosDescendidos(Formacion formacion, long t) { int pasajerosDescendidos; if (formacion.SentidoActual == Sentido.IDA) { pasajerosDescendidos = FDP.Normal(PersonasDesciendenMinIda, PersonasDesciendenMaxIda); } else { pasajerosDescendidos = FDP.Normal(PersonasDesciendenMinVuelta, PersonasDesciendenMaxVuelta); } if (pasajerosDescendidos > formacion.Pasajeros) { pasajerosDescendidos = formacion.Pasajeros; } return(pasajerosDescendidos); }
public virtual int PasajerosAscendidos(Formacion formacion, long t, int pasajerosDescendidos) { int pasajerosAscendidos; if (formacion.SentidoActual == Sentido.IDA) { pasajerosAscendidos = FDP.Normal(PersonasEsperandoMinIda, PersonasEsperandoMaxIda); } else { pasajerosAscendidos = FDP.Normal(PersonasEsperandoMinVuelta, PersonasEsperandoMaxVuelta); } if (formacion.Pasajeros - pasajerosDescendidos + pasajerosAscendidos > formacion.GetCapacidadReal()) { return(formacion.Pasajeros - pasajerosDescendidos + pasajerosAscendidos - formacion.GetCapacidadReal()); } return(pasajerosAscendidos); }
public virtual void Inicializar() { Desde = Tramos[0].EstacionOrigen; Desde.EsEstacionTerminal = true; Hasta = Tramos[Tramos.Count - 1].EstacionDestino; Hasta.EsEstacionTerminal = true; int count = 0; foreach (KeyValuePair <Formacion, int> kvp in TiposFormacion) { for (int i = 0; i < kvp.Value; i++) { Formacion tipoFormacion = kvp.Key; Formacion formacion = new Formacion() { Id = count, Nombre = tipoFormacion.Nombre, Servicio = this, TiposCoche = tipoFormacion.TiposCoche, HoraSalida = 0, DuracionMantenimiento = tipoFormacion.DuracionMantenimiento, KilometrosMantenimiento = tipoFormacion.KilometrosMantenimiento }; if (count < CantidadFormacionesInicio) { formacion.SentidoActual = Sentido.IDA; formacion.EstacionActual = Desde; formacion.EstacionDestino = Hasta; } else { formacion.SentidoActual = Sentido.VUELTA; formacion.EstacionActual = Hasta; formacion.EstacionDestino = Desde; } Formaciones.Add(formacion); count++; } } }
public bool EjecutarSimulacion(Traza traza, long tiempoFinal, BackgroundWorker backgroundWorker) { Traza = traza; TiempoFinal = tiempoFinal; // Inicializa la traza configurando y creando los objetos dinámicos que no se traen de la base Traza.Inicializar(); long t = 0; // A partir del tiempo t, la traza le devuelve la instancia de formacion que tiene el horario de salida mas proximo. Formacion formacion = traza.GetProximaFormacion(t); t = formacion.HoraSalida; while (t < tiempoFinal) { long tiempoDeLaFormacion; Servicio servicio = formacion.Servicio; this.log.Info("Horarios disponibles de formaciones: \n" + LogHelper.MostrarTiemposDeSalida(traza)); this.log.Info("Horarios de programaciones: \n" + LogHelper.MostrarProgramaciones(traza)); string programacionCorrespondiente = formacion.EstacionActual.EsEstacionTerminal? "Programación " + LogHelper.TimeConvert(formacion.ProgramacionCorrespondiente, false) : "Sin Programación"; this.log.Info("T: " + LogHelper.TimeConvert(t, true) + " | Servicio: " + formacion.Servicio.Nombre + " | Formacion: " + formacion.Nombre + ":" + formacion.Id + " | " + programacionCorrespondiente); // Calcular ingreso de pasajeros en estación Cabecera Inicial o Final del recorrido. tiempoDeLaFormacion = formacion.InicioRecorrido(t); //Calculo viaje hasta que llegue a destino, ya sea estacion Final o Mantenimiento. while (formacion.EstacionActual != formacion.EstacionDestino && !formacion.PasoPorMantenimiento) { //Obtengo el camino a recorrer hasta la próxima estación. //Debe poder obtener el tramo comprendido entre la estacionActual y la estacionSiguiente //en el sentido desde estacionActual -> formacion.getEstacionDestino() Tramo tramo = servicio.GetTramo(formacion.EstacionActual, formacion.SentidoActual); //Realizo todos los calculos de entre estacion 1 y estacion 2 tiempoDeLaFormacion = formacion.ArriboEstacion(tramo, tiempoDeLaFormacion); } formacion.PasoPorMantenimiento = false; if (formacion.InvertirSentidoFlag) { formacion.InvertirSentido(); } // Calcular ingreso de pasajeros en estación Cabecera Final del recorrido. // Cambiar el sentido de circulacion de la formacion formacion.invertirSentido(); formacion = traza.GetProximaFormacion(t); t = formacion.HoraSalida; backgroundWorker.ReportProgress((int)(t * 100 / tiempoFinal)); if (backgroundWorker.CancellationPending) { return(false); } } return(true); }
public AgrupacionFormacion(Formacion formacion, int cantidad) : this() { this.Formacion = formacion; this.Cantidad = cantidad; }
public virtual Formacion GetProximaFormacion(long t) { Formacion formacionMinHoraSalida = null; int minHoraProgramada = int.MinValue; int auxHoraProgramada; foreach (Formacion formacion in Formaciones) { if (minHoraProgramada == int.MinValue) { formacionMinHoraSalida = formacion; if (formacion.EstacionActual.EsEstacionTerminal) { minHoraProgramada = GetProximaProgramacion(formacion.SentidoActual); } else { break; } } else { if (formacion.HoraSalida < (minHoraProgramada)) { if (formacion.EstacionActual.EsEstacionTerminal) { auxHoraProgramada = GetProximaProgramacion(formacion.SentidoActual); if (auxHoraProgramada < minHoraProgramada) { minHoraProgramada = auxHoraProgramada; formacionMinHoraSalida = formacion; } } else { minHoraProgramada = int.MinValue; formacionMinHoraSalida = formacion; break; } } else { break; } } if (formacionMinHoraSalida.HoraSalida > (minHoraProgramada)) { break; } } if (formacionMinHoraSalida.EstacionActual.EsEstacionTerminal) { if ((minHoraProgramada) > formacionMinHoraSalida.HoraSalida) { formacionMinHoraSalida.HoraPosibleSalida = minHoraProgramada; } else { formacionMinHoraSalida.HoraPosibleSalida = formacionMinHoraSalida.HoraSalida; } formacionMinHoraSalida.ProgramacionCorrespondiente = minHoraProgramada % 1440; } else { formacionMinHoraSalida.HoraPosibleSalida = formacionMinHoraSalida.HoraSalida; formacionMinHoraSalida.ProgramacionCorrespondiente = int.MinValue; } return(formacionMinHoraSalida); }