public InfoTramoParaOptimizacion(Tramo tramo, InfoTramoParaOptimizacion tramo_previo, int variacion_permitida, BuscarTramosConectadosEventHandler buscar_tramos)
        {
            this._explicacion_impuntualidad_base   = null;
            this._variacion_menos_maxima_comercial = variacion_permitida;
            this._variacion_mas_maxima_comercial   = variacion_permitida;
            this._variacion_aplicada = 0;
            this._tramo_abierto      = true;
            this._tramo_previo       = tramo_previo;
            this._tramo_original     = tramo;
            this._buscar_tramos      = buscar_tramos;

            if (tramo_previo != null)
            {
                tramo_previo.TramoSiguiente = this;
            }
        }
コード例 #2
0
        internal Dictionary <int, ExplicacionImpuntualidad> EstimarImpuntualidades(List <Simulacion> replicasBase, DateTime fechaIni, DateTime fechaFin, List <int> stds)
        {
            Dictionary <int, ExplicacionImpuntualidad> impuntualidades_tramo = new Dictionary <int, ExplicacionImpuntualidad>();
            Dictionary <int, Dictionary <int, Dictionary <TipoDisrupcion, double[]> > > contadorImpuntualidad = new Dictionary <int, Dictionary <int, Dictionary <TipoDisrupcion, double[]> > >();
            Dictionary <int, Dictionary <TipoDisrupcion, double[]> > sumaAtrasosTramo = new Dictionary <int, Dictionary <TipoDisrupcion, double[]> >();
            List <int> keys_tramos = new List <int>();

            foreach (int std in stds)
            {
                contadorImpuntualidad.Add(std, new Dictionary <int, Dictionary <TipoDisrupcion, double[]> >());
                foreach (Simulacion simReplica in replicasBase)
                {
                    //Cuenta tramos de impuntualidad para cada estándar y tipo de disrupción
                    foreach (Avion a in simReplica.Itinerario.AvionesDictionary.Values)
                    {
                        List <Tramo> listaTramos = a.ObtenerListaTramos(a.Tramo_Raiz);
                        foreach (Tramo tramo in listaTramos)
                        {
                            if (tramo.TramoBase.Fecha_Salida >= fechaIni && tramo.TramoBase.Fecha_Salida <= fechaFin)
                            {
                                int id = tramo.TramoBase.Numero_Global;
                                if (!contadorImpuntualidad[std].ContainsKey(id))
                                {
                                    contadorImpuntualidad[std].Add(id, new Dictionary <TipoDisrupcion, double[]>());
                                    foreach (TipoDisrupcion tipo in Enum.GetValues(typeof(TipoDisrupcion)))
                                    {
                                        if (tipo != TipoDisrupcion.ADELANTO)
                                        {
                                            contadorImpuntualidad[std][id].Add(tipo, new double[2]);
                                        }
                                    }
                                }
                                int atraso = tramo.TInicialRst - tramo.TInicialProg;
                                foreach (TipoDisrupcion tipo in Enum.GetValues(typeof(TipoDisrupcion)))
                                {
                                    if (tipo != TipoDisrupcion.ADELANTO)
                                    {
                                        if (tramo.CausasAtraso.ContainsKey(tipo))
                                        {
                                            if (atraso > std)
                                            {
                                                contadorImpuntualidad[std][id][tipo][0] += tramo.CausasAtraso[tipo] / ((double)(atraso));
                                            }
                                        }
                                        contadorImpuntualidad[std][id][tipo][1]++;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            foreach (Simulacion simReplica in replicasBase)
            {
                //Cuenta tramos de impuntualidad para cada estándar y tipo de disrupción
                foreach (Avion a in simReplica.Itinerario.AvionesDictionary.Values)
                {
                    List <Tramo> listaTramos = a.ObtenerListaTramos(a.Tramo_Raiz);
                    foreach (Tramo tramo in listaTramos)
                    {
                        if (tramo.TramoBase.Fecha_Salida >= fechaIni && tramo.TramoBase.Fecha_Salida <= fechaFin)
                        {
                            int id = tramo.TramoBase.Numero_Global;
                            if (!keys_tramos.Contains(id))
                            {
                                keys_tramos.Add(id);
                            }
                            if (!sumaAtrasosTramo.ContainsKey(id))
                            {
                                sumaAtrasosTramo.Add(id, new Dictionary <TipoDisrupcion, double[]>());
                                foreach (TipoDisrupcion tipo in Enum.GetValues(typeof(TipoDisrupcion)))
                                {
                                    if (tipo != TipoDisrupcion.ADELANTO)
                                    {
                                        sumaAtrasosTramo[id].Add(tipo, new double[2]);
                                    }
                                }
                            }
                            int atraso = tramo.TInicialRst - tramo.TInicialProg;
                            foreach (TipoDisrupcion tipo in Enum.GetValues(typeof(TipoDisrupcion)))
                            {
                                if (tipo != TipoDisrupcion.ADELANTO)
                                {
                                    if (tramo.CausasAtraso.ContainsKey(tipo))
                                    {
                                        sumaAtrasosTramo[id][tipo][0] += tramo.CausasAtraso[tipo];
                                    }
                                    sumaAtrasosTramo[id][tipo][1]++;
                                }
                            }
                        }
                    }
                }
            }

            foreach (int id_tramo in keys_tramos)
            {
                ExplicacionImpuntualidad explicacionImpuntualidad = new ExplicacionImpuntualidad();
                impuntualidades_tramo.Add(id_tramo, explicacionImpuntualidad);
                foreach (int std in contadorImpuntualidad.Keys)
                {
                    Dictionary <TipoDisrupcion, double> impuntualidad_tramo = new Dictionary <TipoDisrupcion, double>();
                    foreach (TipoDisrupcion tipo in Enum.GetValues(typeof(TipoDisrupcion)))
                    {
                        if (tipo != TipoDisrupcion.ADELANTO)
                        {
                            double impuntualidad_promedio = contadorImpuntualidad[std][id_tramo][tipo][0] / contadorImpuntualidad[std][id_tramo][tipo][1];
                            impuntualidad_tramo.Add(tipo, impuntualidad_promedio);
                        }
                    }
                    explicacionImpuntualidad.AgregarDisrupcion(std, impuntualidad_tramo);
                }
                foreach (TipoDisrupcion tipo in Enum.GetValues(typeof(TipoDisrupcion)))
                {
                    if (tipo != TipoDisrupcion.ADELANTO)
                    {
                        double atraso_promedio = sumaAtrasosTramo[id_tramo][tipo][0] / sumaAtrasosTramo[id_tramo][tipo][1];
                        explicacionImpuntualidad.AgregarAtraso(tipo, atraso_promedio);
                    }
                }
            }

            return(impuntualidades_tramo);
        }