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; } }
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); }