/// <summary> /// Constructor de objeto controlador de información /// </summary> /// <param name="itin"> Itinerario analizado</param> /// <param name="parametros">Objeto de parámetros de la simulación</param> /// <param name="disrupciones">Objeto de modelo de disrupciones</param> public ControladorInformacion(Itinerario itin, ParametrosSimuLAN parametros, ModeloDisrupciones disrupciones) { this._itinerario = itin; this._parametros = parametros; this._modelo_disrupciones = disrupciones; this._faltas = new Dictionary <TipoFaltaInformacion, List <Falta> >(); CargarTiposFalta(); }
/// <summary> /// Constrye un itinerario /// </summary> /// <param name="filename">Nombre del itinerario</param> /// <param name="extension">Extensión del archivo de origen del itinerario</param> /// <param name="parametros">Objeto de parámetros de la simulación</param> /// <param name="fs">Stream con referencia al archivo de origen del itinerario</param> /// <param name="OK_Itinerario">True si la carga finalizó correctamente</param> /// <returns>Itinerario</returns> public static Itinerario CargarItinerario(string filename, string extension, ParametrosSimuLAN parametros, Stream fs, ref bool OK_Itinerario) { //Inicializa objetos DataTable datosItinerarioProgramado = new DataTable(); Itinerario itinerario = new Itinerario(filename); _primera_fila = true; //Si ya se cargaron los parámetros consolida los AcTypes en el itinerario if (parametros != null && parametros.MapFlotas != null && parametros.MapFlotas.Dict != null && parametros.MapFlotas.Dict.Count > 0) { itinerario.CargarFlotasEnAcTypes(parametros.MapFlotas.Dict); } //Para archivos de MS Excel if (extension == "xls" || extension == "XLS") { //Se obtiene el libro Utils.ExcelDataReader spreadsheet = new Utils.ExcelDataReader(fs); fs.Close(); //Se obtiene la primera hoja con el itinerario datosItinerarioProgramado = spreadsheet.WorkbookData.Tables[0]; //Se carga el itinerario CrearItinerarioDeDataTable(datosItinerarioProgramado, itinerario, OrigenItinerario.XLS, parametros); OK_Itinerario = true; return(itinerario); } //Para archivos CSV y sin extensión else { try { //Lee tabla datosItinerarioProgramado = CrearDataTableItinerarioDesdeArchivo(new StreamReader(fs)); fs.Close(); //Se carga el itinerario CrearItinerarioDeDataTable(datosItinerarioProgramado, itinerario, OrigenItinerario.CSV, parametros); OK_Itinerario = true; return(itinerario); } catch { OK_Itinerario = false; return(null); } } }
public Optimizador(Itinerario itinerario_base, ParametrosSimuLAN parametros, ModeloDisrupciones disrupciones, List <int> stds, int std_objetivo, DateTime fechaIni, DateTime fechaFin, int variacion_permitida) { this.ItinerarioBase = itinerario_base; this.Parametros = parametros; this.Disrupciones = disrupciones; this._stds = stds; this._variacion_permitida = variacion_permitida; this._fecha_ini = fechaIni; this._fecha_fin = fechaFin; this._tramos_optimizacion = new OrganizadorTramos(itinerario_base, variacion_permitida); this._salto_variaciones = 5; this._log_info_optimizacion = new LogOptimizacion(); this._std_objetivo = std_objetivo; this._marcador = DateTime.Now; this._tiempo_simulacion = TimeSpan.Zero; this._tiempo_optimizacion = TimeSpan.Zero; }
/// <summary> /// Carga los parámetros de la simulación. /// </summary> /// <param name="ds">DataSet con las hojas de parámetros</param> /// <param name="parametros">Parámetros en construcción</param> /// <param name="factoresEscenarios">Factores de desviación de probabilidades</param> /// <param name="filename">Path de origen del DataSet</param> internal static void CargarParametros(DataSet ds, ParametrosSimuLAN parametros, Dictionary <TipoDisrupcion, Dictionary <string, Dictionary <TipoEscenarioDisrupcion, double> > > factoresEscenarios, string filename) { factoresEscenarios.Clear(); parametros.Conexiones.Hubs.Clear(); parametros.Conexiones.PaxConex.Clear(); parametros.Conexiones.Pairings.Clear(); parametros.InfoGruposFlotas.Clear(); parametros.InfoAOG.Clear(); #region MAP ACTYPE-FLOTA try { parametros.MapFlotas.Dict = parametros.MapFlotas.DataTableToDictionary(ds.Tables[parametros.MapFlotas.Nombre], 1); } catch (Exception) { throw new Exception("No se puede cargar tabla de actypes-flotas desde archivo de parámetros en " + filename); } #endregion #region MAP FLOTA-GRUPO try { parametros.MapGruposFlotas.Dict = parametros.MapGruposFlotas.DataTableToDictionary(ds.Tables[parametros.MapGruposFlotas.Nombre], 1); } catch (Exception) { throw new Exception("No se puede cargar tabla de grupos de flotas desde archivo de parámetros en " + filename); } #endregion #region MAP SUBFLOTA-MATRICULA try { parametros.MapSubFlotasMatriculas.Dict = parametros.MapSubFlotasMatriculas.DataTableToDictionary(ds.Tables[parametros.MapSubFlotasMatriculas.Nombre], 1); } catch (Exception) { throw new Exception("No se puede cargar tabla de grupos de flotas desde archivo de parámetros en " + filename); } #endregion #region MAP VUELO_RUTA try { parametros.MapVuelosRutas.Dict = parametros.MapVuelosRutas.DataTableToDictionary(ds.Tables[parametros.MapVuelosRutas.Nombre], 1); } catch (Exception) { throw new Exception("No se puede cargar tabla de vuelos-rutas desde archivo de parámetros en " + filename); } #endregion #region TURN AROUND MIN try { parametros.TurnAroundMin.Dict = parametros.TurnAroundMin.DataTableToDictionary(ds.Tables[parametros.TurnAroundMin.Nombre], 1); } catch (Exception) { throw new Exception("No se puede cargar tabla de Turn Around desde archivo de parámetros en " + filename); } #endregion #region MATRIZ FLOTA-FLOTA try { parametros.CargarMatrizFlotaFlota(ds.Tables["matrizFlotaFlota"]); } catch (Exception) { throw new Exception("No se puede cargar matriz flota-flota desde archivo de parámetros en " + filename); } #endregion #region MATRIZ MULTIOPERADOR try { parametros.CargarMatrizMultioperador(ds.Tables["matrizMultioperador"]); } catch (Exception) { throw new Exception("No se puede cargar matriz flota-flota desde archivo de parámetros en " + filename); } #endregion #region INFO HUBS try { parametros.Conexiones.LlenarInputHubs(ds.Tables["hubs"]); } catch (Exception) { throw new Exception("No se puede cargar tabla de HUBs desde archivo de parámetros en " + filename); } #endregion #region VUELOS EN CONEXION try { parametros.Conexiones.LlenarInputPaxConex(ds.Tables["conexiones"]); } catch (Exception) { throw new Exception("No se puede cargar tabla de vuelos en conexión desde archivo de parámetros en " + filename); } #endregion #region PAIRINGS try { parametros.Conexiones.LlenarInputPairings(ds.Tables["pairings"]); } catch (Exception) { throw new Exception("No se puede cargar tabla de pairings desde archivo de parámetros en " + filename); } #endregion #region FACTORES ESCENARIOS METEREOLOGIA try { factoresEscenarios.Add(TipoDisrupcion.METEREOLOGIA, CargarFactoresDesviacion(ds.Tables["fd_WXS"], false)); } catch (Exception) { throw new Exception("No se puede cargar tabla de factores de desviación de clima desdesde archivo de parámetros en " + filename); } #endregion #region FACTORES ESCENARIOS MANTTO try { factoresEscenarios.Add(TipoDisrupcion.MANTENIMIENTO, CargarFactoresDesviacion(ds.Tables["fd_Mantto"], false)); } catch (Exception) { throw new Exception("No se puede cargar tabla de factores de desviación de mantto desdesde archivo de parámetros en " + filename); } #endregion #region GRUPOS FLOTAS try { parametros.CargarInputGruposFlotas(ds.Tables["turnos"]); } catch (Exception) { throw new Exception("No se puede cargar informacion de turnos por grupos de flota desdesde archivo de parámetros en " + filename); } #endregion #region DECISION VUELOS EN CONEXION try { parametros.Conexiones.LlenarParametrosDecisionVuelosConexion(ds.Tables["conex_intervalos"], ds.Tables["conex_espera"]); } catch (Exception) { throw new Exception("No se puede cargar informacion de turnos por grupos de flota desdesde archivo de parámetros en " + filename); } #endregion #region AOG try { parametros.CargarInfoAOG(ds.Tables["AOG"]); } catch (Exception) { throw new Exception("No se puede cargar informacion de AOG's en " + filename); } #endregion }
/// <summary> /// Construye un itinerario desde un DataTable /// </summary> /// <param name="datosItinerarioProgramado">DataTable con el itinerario</param> /// <param name="itinerario">Itinerario en construcción</param> /// <param name="fuente">Tipo de archivo de origen del itinerario</param> /// <param name="parametros">Objeto de parámetros de la simulación</param> private static void CrearItinerarioDeDataTable(DataTable datosItinerarioProgramado, Itinerario itinerario, OrigenItinerario fuente, ParametrosSimuLAN parametros) { Dictionary <CamposArchivoItinerario, int> camposIndices = CargarCamposArchivoItinerario(); bool primeraFila = true; foreach (DataRow row in datosItinerarioProgramado.Rows) { object[] items = row.ItemArray; //La primera fila contiene las fechas de inicio y término del itinerario if (primeraFila) { primeraFila = false; itinerario.FechaInicioString = items[3].ToString(); itinerario.FechaTerminoString = items[4].ToString(); try { itinerario.FechaInicio = Itinerario.FechaDesdeNumeroSerieExcel(itinerario.FechaInicioString); itinerario.FechaTermino = Itinerario.FechaDesdeNumeroSerieExcel(itinerario.FechaTerminoString); _tipo_fecha = TipoFecha.Serial; } catch { itinerario.FechaInicio = Convert.ToDateTime(itinerario.FechaInicioString); itinerario.FechaTermino = Convert.ToDateTime(itinerario.FechaTerminoString); _tipo_fecha = TipoFecha.Texto; } //Se setea a un día de distancia desde la fecha leída. itinerario.FechaInicio = itinerario.FechaInicio.AddDays(-1); itinerario.FechaTermino = itinerario.FechaTermino.AddDays(1); } //Para el resto de las filas se valida que tenga información y se agrega al itinerario en construcción. else { if (FilaValida(items, camposIndices.Count - 5)) { AgregarFila(items, camposIndices, itinerario, fuente, parametros); } } } }
/// <summary> /// Procesa una fila del archivo de itinerario /// </summary> /// <param name="items">Arreglo con la información</param> /// <param name="camposIndices">Diccionario con el número de columna para cada campo leido del itinerario</param> /// <param name="itinerario">Itinerario en construcción</param> /// <param name="fuente">Tipo de origen del itinerario</param> /// <param name="parametros">Objeto de parámetros de la simulación</param> private static void AgregarFila(object[] items, Dictionary <CamposArchivoItinerario, int> camposIndices, Itinerario itinerario, OrigenItinerario fuente, ParametrosSimuLAN parametros) { try { //Carga objeto buffer con la información de la fila. DataObjetoTramoXLS dataObjeto = new DataObjetoTramoXLS(items, camposIndices); #region Carga aeropuertos y aviones //Actualiza aeropuertos if (!itinerario.AeropuertosDictionary.ContainsKey(dataObjeto.origen)) { Aeropuerto a = new Aeropuerto(dataObjeto.origen, 0); itinerario.AgregarAeropuerto(a, dataObjeto.origen); } if (!itinerario.AeropuertosDictionary.ContainsKey(dataObjeto.destino)) { Aeropuerto a = new Aeropuerto(dataObjeto.destino, 0); itinerario.AgregarAeropuerto(a, dataObjeto.destino); } //Carga aviones if (!itinerario.AvionesDictionary.ContainsKey(dataObjeto.idAvion)) { string subFlota = dataObjeto.operador + " " + dataObjeto.acType; //Cargar AcTypes if (!itinerario.AcTypeDictionary.ContainsKey(dataObjeto.acType)) { itinerario.AcTypeDictionary.Add(dataObjeto.acType, new AcType(dataObjeto.acType)); } Avion a = new Avion(dataObjeto.acType, subFlota, dataObjeto.idAvion); itinerario.AgregarAvion(dataObjeto.idAvion, a); } #endregion #region Carga tramos/mantto/backups //procesa las fechas itinerario.ContadorTramos++; DateTime fecha_ini_base = new DateTime(); DateTime fecha_fin_base = new DateTime(); if (_primera_fila) { _primera_fila = false; try { fecha_ini_base = Itinerario.FechaDesdeNumeroSerieExcel(dataObjeto.fechaInicio); fecha_fin_base = Itinerario.FechaDesdeNumeroSerieExcel(dataObjeto.fechaTermino); _tipo_fecha = TipoFecha.Serial; } catch { fecha_ini_base = Convert.ToDateTime(dataObjeto.fechaInicio); fecha_fin_base = Convert.ToDateTime(dataObjeto.fechaTermino); _tipo_fecha = TipoFecha.Texto; } } else { if (_tipo_fecha == TipoFecha.Serial) { fecha_ini_base = Itinerario.FechaDesdeNumeroSerieExcel(dataObjeto.fechaInicio); fecha_fin_base = Itinerario.FechaDesdeNumeroSerieExcel(dataObjeto.fechaTermino); } else { fecha_ini_base = Convert.ToDateTime(dataObjeto.fechaInicio); fecha_fin_base = Convert.ToDateTime(dataObjeto.fechaTermino); } } //Carga tramo base TramoBase tramoBase = new TramoBase(itinerario.ContadorTramos, dataObjeto.idAvion, dataObjeto.idTramoAvion, dataObjeto.numSubFlota, dataObjeto.acType, dataObjeto.operador, dataObjeto.carrier, dataObjeto.idTramoGlobal, dataObjeto.op_suf, dataObjeto.stc, dataObjeto.config_asientos, dataObjeto.origen, fecha_ini_base, dataObjeto.STD.ToString(), dataObjeto.domInt, dataObjeto.destino, fecha_fin_base, dataObjeto.STA.ToString()); //Agrega Backup if (tramoBase.Tipo == TipoTramoBase.Backup) { UnidadBackup bu = new UnidadBackup(tramoBase, itinerario.FechaInicio); itinerario.ControladorBackups.BackupsLista.Add(bu); } //Agrega Mantto else if (tramoBase.Tipo == TipoTramoBase.Mantto) { Avion avion_actual = itinerario.AvionesDictionary[dataObjeto.idAvion]; SlotMantenimiento slotMantto = new SlotMantenimiento(tramoBase, itinerario.AcTypeDictionary[tramoBase.AcType].Flota, avion_actual.Ultimo_Tramo_Agregado, itinerario.FechaInicio); avion_actual.SlotsMantenimiento.Add(slotMantto); //Caso en que hay un mantto programado al inicio del itinerario if (avion_actual.Ultimo_Tramo_Agregado == null) { avion_actual.PrimerSlotEsMantenimiento = true; } else { slotMantto.TramoPrevio.MantenimientoPosterior = slotMantto; } } //Agrega Tramo else { Tramo tramo = new Tramo(tramoBase, itinerario.AvionesDictionary[dataObjeto.idAvion].UltimoTramoAgregado, itinerario.FechaInicio); tramo.GetAvion = itinerario.GetAvion; tramo.GetTurnAroundMinimo = parametros.GetDelegateTurnAroundMin(); itinerario.AvionesDictionary[dataObjeto.idAvion].AgregarTramoEnOrden(tramo); itinerario.Tramos.Add(itinerario.ContadorTramos, tramo); } #endregion } catch (Exception) { throw new Exception("Problemas al cargar itinerario de Excel"); } }