Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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;
 }
Ejemplo n.º 8
0
        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);
        }