Exemple #1
0
        private StateRow arrastrarVariablesEst(StateRow _anterior)
        {
            StateRow nuevo = new StateRow();

            nuevo.maxEEVTime         = _anterior.maxEEVTime;
            nuevo.maxEETTime         = _anterior.maxEETTime;
            nuevo.porcAvionesAyDInst = _anterior.porcAvionesAyDInst;
            nuevo.cantAvionesAyDInst = _anterior.cantAvionesAyDInst;
            nuevo.acumEETTime        = _anterior.acumEETTime;
            nuevo.acumEEVTime        = _anterior.acumEEVTime;
            nuevo.avgEETTime         = _anterior.avgEETTime;
            nuevo.avgEEVTime         = _anterior.avgEEVTime;

            return(nuevo);
        }
Exemple #2
0
        private StateRow CrearStateRowInicioInestabilidad(StateRow anterior, double tiempoProximoEvento)
        {
            StateRow nuevo = new StateRow();

            nuevo        = this.arrastrarVariablesEst(anterior);
            nuevo.evento = "Inicio Inestabilidad";
            nuevo.reloj  = tiempoProximoEvento;
            nuevo.pista  = new Pista();

            // Calcular siguiente tiempo de llegada de prox avion
            nuevo.tiempoProximaLlegada = anterior.tiempoProximaLlegada;

            // Calcular variables de aterrizaje
            if (anterior.tiempoFinAterrizaje != 0)
            {
                nuevo.tiempoFinAterrizaje = 0;
                this.clientes[anterior.pista.idClienteActual - 1].estado = "IA";
                this.clientes[anterior.pista.idClienteActual - 1].tiempoFinAterrizaje = 0;
                nuevo.pista.tiempoRestanteAoD = anterior.tiempoFinAterrizaje - nuevo.reloj;
            }
            // Calcular variables de despegue
            else if (anterior.tiempoFinDeDespegue != 0)
            {
                nuevo.tiempoFinDeDespegue = 0;
                this.clientes[anterior.pista.idClienteActual - 1].estado = "ID";
                this.clientes[anterior.pista.idClienteActual - 1].tiempoFinDeDespegue = 0;
                nuevo.pista.tiempoRestanteAoD = anterior.tiempoFinDeDespegue - nuevo.reloj;
            }

            // Calculos variables de pista
            nuevo.pista.state           = "Inestable";
            nuevo.pista.idClienteActual = anterior.pista.idClienteActual;
            nuevo.pista.colaEEV         = new Queue <Avion>(anterior.pista.colaEEV);
            nuevo.pista.colaEET         = new Queue <Avion>(anterior.pista.colaEET);

            // Calculos purga
            nuevo.tiempoFinPurga = nuevo.reloj + 20.0000;

            // Se recalculan variables estadísticas
            nuevo.porcAvionesAyDInst = (Convert.ToDouble(nuevo.cantAvionesAyDInst) / Convert.ToDouble(this.clientes.Count)) * 100;

            nuevo.avgEETTime = Convert.ToDouble(nuevo.acumEETTime) / Convert.ToDouble(this.clientes.Count);
            nuevo.avgEEVTime = Convert.ToDouble(nuevo.acumEEVTime) / Convert.ToDouble(this.clientes.Count);

            return(nuevo);
        }
Exemple #3
0
        public StateRow NextStateRow(StateRow anterior, int i)
        {
            // Creo vector de estado para fila actual
            StateRow actual = new StateRow();

            // Diccionario de eventos (nombre de evento y su tiempo) para determinar el siguiente evento
            Dictionary <string, double> tiempos = new Dictionary <string, double>();
            var siguienteEvento = this.DeterminarSiguienteEvento(tiempos, anterior);

            int avion = 0;

            switch (siguienteEvento.Key)
            {
            case "tiempoProximaLlegada":
                actual = CrearStateRowLlegadaAvion(anterior, siguienteEvento.Value, i);
                break;

            case var val when new Regex(@"tiempoFinAterrizaje_*").IsMatch(val):
                avion  = Convert.ToInt32(siguienteEvento.Key.Split('_')[1]);
                actual = CrearStateRowFinAterrizaje(anterior, siguienteEvento.Value, avion);
                break;

            case var val when new Regex(@"tiempoFinDeDespegue_*").IsMatch(val):
                avion  = Convert.ToInt32(siguienteEvento.Key.Split('_')[1]);
                actual = CrearStateRowFinDeDespegue(anterior, siguienteEvento.Value, avion);
                break;

            case var val when new Regex(@"tiempoPermanencia_*").IsMatch(val):
                avion  = Convert.ToInt32(siguienteEvento.Key.Split('_')[1]);
                actual = CrearStateRowFinDePermanencia(anterior, siguienteEvento.Value, avion);
                break;

            case "tiempoInestabilidad":
                actual = CrearStateRowInicioInestabilidad(anterior, siguienteEvento.Value);
                break;

            case "tiempoFinPurga":
                actual = CrearStateRowFinPurga(anterior, siguienteEvento.Value);
                break;
            }

            actual.iterationNum = i + 1;

            return(actual);
        }
        public IList <StateRow> simulate(int quantity, int from, int maxReservations)
        {
            Random random = new Random();

            IList <StateRow> stateRows = new List <StateRow>();
            int  currentPassengers;
            long acumProfit = 0;
            int  deniedSeats;
            int  totalProfit;
            int  extraPassengersCost;

            for (int i = 0; i < quantity; i++)
            {
                deniedSeats         = 0;
                totalProfit         = 0;
                extraPassengersCost = 0;

                double rndNumber = random.NextDouble();

                currentPassengers = this.getCurrentPassengers(rndNumber, maxReservations);

                if (currentPassengers > 30)
                {
                    deniedSeats         = currentPassengers - 30;
                    extraPassengersCost = deniedSeats * 150;
                }

                totalProfit = (currentPassengers * 100) - (extraPassengersCost);
                acumProfit += totalProfit;

                if ((i >= from - 1 && i <= from + 99) || i == (quantity - 1))
                {
                    StateRow row = new StateRow {
                        currentPassengers = currentPassengers, deniedSeats = deniedSeats, iterationNum = i + 1, extraPassengersCost = extraPassengersCost, rndNumber = Math.Truncate(rndNumber * 10000) / 10000, totalEarnings = currentPassengers * 100, totalProfit = totalProfit, acumProfit = acumProfit
                    };

                    stateRows.Add(row);
                }
            }

            return(stateRows);
        }
Exemple #5
0
        private StateRow CrearStateRowFinPurga(StateRow anterior, double tiempoProximoEvento)
        {
            StateRow nuevo = new StateRow();

            nuevo        = this.arrastrarVariablesEst(anterior);
            nuevo.evento = "Fin Purga";
            nuevo.reloj  = tiempoProximoEvento;

            // Calculos variables de pista
            nuevo.pista                 = new Pista();
            nuevo.pista.colaEEV         = new Queue <Avion>(anterior.pista.colaEEV);
            nuevo.pista.colaEET         = new Queue <Avion>(anterior.pista.colaEET);
            nuevo.pista.idClienteActual = anterior.pista.idClienteActual;


            // Calcular siguiente tiempo de llegada de prox avion
            nuevo.tiempoProximaLlegada = anterior.tiempoProximaLlegada;


            // Calcular variables de aterrizaje
            if (anterior.pista.idClienteActual != -1)
            {
                if (this.clientes[anterior.pista.idClienteActual - 1].estado == "IA")
                {
                    // Calcular variables de aterrizaje
                    nuevo.tiempoFinAterrizaje = anterior.pista.tiempoRestanteAoD + nuevo.reloj;
                    this.clientes[anterior.pista.idClienteActual - 1].estado = "EA";
                    this.clientes[anterior.pista.idClienteActual - 1].tiempoFinAterrizaje = anterior.pista.tiempoRestanteAoD + nuevo.reloj;
                }
                else
                {
                    // Calcular variables de despegue
                    nuevo.tiempoFinDeDespegue = anterior.pista.tiempoRestanteAoD + nuevo.reloj;
                    this.clientes[anterior.pista.idClienteActual - 1].estado = "ED";
                    this.clientes[anterior.pista.idClienteActual - 1].tiempoFinDeDespegue = anterior.pista.tiempoRestanteAoD + nuevo.reloj;
                }
                nuevo.pista.state = "Ocupado";
            }
            else if (nuevo.pista.colaEEV.Count != 0)
            {
                // Calculos variables aterrizaje
                Avion avionNuevo = nuevo.pista.colaEEV.Dequeue();
                nuevo.rndAterrizaje         = this.generator.NextRnd();
                nuevo.tiempoAterrizaje      = this.uniformGeneratorAterrizaje.Generate(nuevo.rndAterrizaje);
                nuevo.tiempoFinAterrizaje   = nuevo.tiempoAterrizaje + nuevo.reloj;
                nuevo.pista.state           = "Ocupado";
                nuevo.pista.idClienteActual = avionNuevo.id;
                this.clientes[avionNuevo.id - 1].tiempoFinAterrizaje = nuevo.tiempoFinAterrizaje;
                this.clientes[avionNuevo.id - 1].estado = "EA";

                // Se chequea si el tiempo de espera en cola del avión desencolado es mayor al máx registrado,
                // de ser así lo asigna como maxEEVTime.
                if (this.clientes[avionNuevo.id - 1].tiempoEEVin != 0)
                {
                    double eevTime = nuevo.reloj - this.clientes[avionNuevo.id - 1].tiempoEEVin;
                    if (eevTime > nuevo.maxEEVTime)
                    {
                        nuevo.maxEEVTime = eevTime;
                    }

                    nuevo.acumEEVTime += eevTime;
                }
            }
            else if (nuevo.pista.colaEET.Count != 0)
            {
                // Calculos variables de despegue
                Avion avionNuevo = nuevo.pista.colaEET.Dequeue();
                nuevo.rndDespegue           = this.generator.NextRnd();
                nuevo.tiempoDeDespegue      = this.uniformGeneratorDespegue.Generate(nuevo.rndDespegue);
                nuevo.tiempoFinDeDespegue   = nuevo.tiempoDeDespegue + nuevo.reloj;
                nuevo.pista.state           = "Ocupado";
                nuevo.pista.idClienteActual = avionNuevo.id;
                this.clientes[avionNuevo.id - 1].tiempoFinDeDespegue = nuevo.tiempoFinDeDespegue;
                this.clientes[avionNuevo.id - 1].estado = "ED";

                if (this.clientes[avionNuevo.id - 1].tiempoEETin != 0)
                {
                    double eetTime = nuevo.reloj - this.clientes[avionNuevo.id - 1].tiempoEETin;
                    if (eetTime > nuevo.maxEETTime)
                    {
                        nuevo.maxEETTime = eetTime;
                    }

                    nuevo.acumEETTime += eetTime;
                }
            }
            else
            {
                nuevo.pista.state           = "Libre";
                nuevo.pista.idClienteActual = -1;
            }

            // Calculos nuevo evento inestabilidad
            nuevo.rndInestable = generator.NextRnd();
            if (nuevo.rndInestable < 0.2)
            {
                nuevo.tiempoInestabilidad = nuevo.reloj + 320.7;
            }
            else if (nuevo.rndInestable < 0.5)
            {
                nuevo.tiempoInestabilidad = nuevo.reloj + 367.5;
            }
            else
            {
                nuevo.tiempoInestabilidad = nuevo.reloj + 417.2;
            }


            return(nuevo);
        }
Exemple #6
0
        private StateRow CrearStateRowFinDePermanencia(StateRow anterior, double tiempoProximoEvento, int avion)
        {
            StateRow nuevo = new StateRow();

            nuevo        = this.arrastrarVariablesEst(anterior);
            nuevo.evento = "Fin permanencia (" + avion.ToString() + ")";
            nuevo.reloj  = tiempoProximoEvento;


            // Calcular siguiente tiempo de llegada de prox avion
            nuevo.tiempoProximaLlegada = anterior.tiempoProximaLlegada;

            // Calcular variables de aterrizaje
            nuevo.tiempoFinAterrizaje = anterior.tiempoFinAterrizaje;

            nuevo.tiempoFinDeDespegue = anterior.tiempoFinDeDespegue;

            // Calculos variables de pista
            nuevo.pista                   = new Pista();
            nuevo.pista.state             = anterior.pista.state;
            nuevo.pista.idClienteActual   = anterior.pista.idClienteActual;
            nuevo.pista.tiempoRestanteAoD = anterior.pista.tiempoRestanteAoD;
            nuevo.pista.colaEEV           = new Queue <Avion>(anterior.pista.colaEEV);
            nuevo.pista.colaEET           = new Queue <Avion>(anterior.pista.colaEET);


            if (nuevo.pista.state == "Libre")
            {
                // Calcular variables de despegue
                this.clientes[avion - 1].estado = "ED";
                nuevo.rndDespegue         = this.generator.NextRnd();
                nuevo.tiempoDeDespegue    = this.uniformGeneratorDespegue.Generate(nuevo.rndDespegue);
                nuevo.tiempoFinDeDespegue = nuevo.tiempoDeDespegue + nuevo.reloj;
                this.clientes[avion - 1].tiempoFinDeDespegue = nuevo.tiempoFinDeDespegue;
                nuevo.pista.state           = "Ocupado";
                nuevo.pista.idClienteActual = avion;

                if (this.clientes[avion - 1].instantLanding)
                {
                    nuevo.cantAvionesAyDInst++;
                }
            }
            else
            {
                this.clientes[avion - 1].estado = "EET";
                nuevo.pista.colaEET.Enqueue(this.clientes[avion - 1]);
                this.clientes[avion - 1].tiempoEETin = nuevo.reloj;
            }
            this.clientes[avion - 1].tiempoPermanencia = 0;

            // Inestabilidad
            nuevo.tiempoInestabilidad = anterior.tiempoInestabilidad;
            nuevo.tiempoFinPurga      = anterior.tiempoFinPurga;

            // Se recalculan variables estadísticas
            nuevo.porcAvionesAyDInst = (Convert.ToDouble(nuevo.cantAvionesAyDInst) / Convert.ToDouble(this.clientes.Count)) * 100;

            nuevo.avgEETTime = Convert.ToDouble(nuevo.acumEETTime) / Convert.ToDouble(this.clientes.Count);
            nuevo.avgEEVTime = Convert.ToDouble(nuevo.acumEEVTime) / Convert.ToDouble(this.clientes.Count);

            return(nuevo);
        }
Exemple #7
0
        private StateRow CrearStateRowFinAterrizaje(StateRow anterior, double tiempoProximoEvento, int avion)
        {
            StateRow nuevo = new StateRow();

            nuevo        = this.arrastrarVariablesEst(anterior);
            nuevo.evento = "Fin Aterrizaje (" + avion.ToString() + ")";
            nuevo.reloj  = tiempoProximoEvento;
            nuevo.tiempoProximaLlegada = anterior.tiempoProximaLlegada;
            // Se arrastran variables estadísticas


            //Calcular variables tiempo permanencia
            double ac = 0;

            nuevo.tiempoDePermanencia  = convolutionGenerator.Generate(out ac);
            nuevo.rndPermanencia       = ac;
            nuevo.tiempoFinPermanencia = nuevo.reloj + nuevo.tiempoDePermanencia;
            this.clientes[avion - 1].tiempoPermanencia   = nuevo.tiempoFinPermanencia;
            this.clientes[avion - 1].tiempoFinAterrizaje = 0;
            this.clientes[avion - 1].estado = "EP";

            // Calculos variables de pista
            nuevo.pista                   = new Pista();
            nuevo.pista.state             = anterior.pista.state;
            nuevo.pista.idClienteActual   = anterior.pista.idClienteActual;
            nuevo.pista.tiempoRestanteAoD = anterior.pista.tiempoRestanteAoD;
            nuevo.pista.colaEEV           = new Queue <Avion>(anterior.pista.colaEEV);
            nuevo.pista.colaEET           = new Queue <Avion>(anterior.pista.colaEET);

            if (nuevo.pista.colaEEV.Count != 0)
            {
                // Calculos variables aterrizaje
                Avion avionNuevo = nuevo.pista.colaEEV.Dequeue();
                nuevo.rndAterrizaje         = this.generator.NextRnd();
                nuevo.tiempoAterrizaje      = this.uniformGeneratorAterrizaje.Generate(nuevo.rndAterrizaje);
                nuevo.tiempoFinAterrizaje   = nuevo.tiempoAterrizaje + nuevo.reloj;
                nuevo.pista.state           = "Ocupado";
                nuevo.pista.idClienteActual = avionNuevo.id;
                this.clientes[avionNuevo.id - 1].tiempoFinAterrizaje = nuevo.tiempoFinAterrizaje;
                this.clientes[avionNuevo.id - 1].estado = "EA";

                // Se chequea si el tiempo de espera en cola del avión desencolado es mayor al máx registrado,
                // de ser así lo asigna como maxEEVTime.
                if (this.clientes[avionNuevo.id - 1].tiempoEEVin != 0)
                {
                    double eevTime = nuevo.reloj - this.clientes[avionNuevo.id - 1].tiempoEEVin;
                    if (eevTime > nuevo.maxEEVTime)
                    {
                        nuevo.maxEEVTime = eevTime;
                    }

                    nuevo.acumEEVTime += eevTime;
                }
            }
            else if (nuevo.pista.colaEET.Count != 0)
            {
                // Calculos variables de despegue
                Avion avionNuevo = nuevo.pista.colaEET.Dequeue();
                nuevo.rndDespegue           = this.generator.NextRnd();
                nuevo.tiempoDeDespegue      = this.uniformGeneratorDespegue.Generate(nuevo.rndDespegue);
                nuevo.tiempoFinDeDespegue   = nuevo.tiempoDeDespegue + nuevo.reloj;
                nuevo.pista.state           = "Ocupado";
                nuevo.pista.idClienteActual = avionNuevo.id;
                this.clientes[avionNuevo.id - 1].tiempoFinDeDespegue = nuevo.tiempoFinDeDespegue;
                this.clientes[avionNuevo.id - 1].estado = "ED";

                if (this.clientes[avionNuevo.id - 1].tiempoEETin != 0)
                {
                    double eetTime = nuevo.reloj - this.clientes[avionNuevo.id - 1].tiempoEETin;
                    if (eetTime > nuevo.maxEETTime)
                    {
                        nuevo.maxEETTime = eetTime;
                    }

                    nuevo.acumEETTime += eetTime;
                }
            }
            else
            {
                nuevo.pista.state           = "Libre";
                nuevo.pista.idClienteActual = -1;
            }

            // Inestabilidad
            nuevo.tiempoInestabilidad = anterior.tiempoInestabilidad;
            nuevo.tiempoFinPurga      = anterior.tiempoFinPurga;

            // Se recalculan variables estadísticas
            nuevo.porcAvionesAyDInst = (Convert.ToDouble(nuevo.cantAvionesAyDInst) / Convert.ToDouble(this.clientes.Count)) * 100;
            nuevo.avgEETTime         = Convert.ToDouble(nuevo.acumEETTime) / Convert.ToDouble(this.clientes.Count);
            nuevo.avgEEVTime         = Convert.ToDouble(nuevo.acumEEVTime) / Convert.ToDouble(this.clientes.Count);

            return(nuevo);
        }
Exemple #8
0
        private StateRow CrearStateRowLlegadaAvion(StateRow anterior, double tiempoProximoEvento, int i)
        {
            StateRow nuevo = new StateRow();

            // Controlamos que los aviones en tierra sean menores a 30, si lo son, pasamos al siguiente menor tiempo, es decir, el siguiente evento
            int cantAvionesEnPermanencia = GetCantidadAvionesEnPermanencia();

            if (anterior.pista.colaEET.Count + anterior.pista.colaEEV.Count + cantAvionesEnPermanencia >= 30)
            {
                nuevo        = this.arrastrarVariablesEst(anterior);
                nuevo.evento = "Rechazo avión";
                nuevo.reloj  = tiempoProximoEvento;

                if (anterior.tiempoProximaLlegada != nuevo.reloj)
                {
                    nuevo.tiempoProximaLlegada = anterior.tiempoProximaLlegada;
                }
                else
                {
                    // Calcular siguiente tiempo de llegada de prox avion
                    nuevo.rndLlegada           = this.generator.NextRnd();
                    nuevo.tiempoEntreLlegadas  = this.exponentialGenerator.Generate(nuevo.rndLlegada);
                    nuevo.tiempoProximaLlegada = nuevo.tiempoEntreLlegadas + nuevo.reloj;
                }

                // Arrastro todos los valores del vector de estado anterior
                nuevo.pista                   = new Pista();
                nuevo.pista.state             = anterior.pista.state;
                nuevo.pista.colaEET           = new Queue <Avion>(anterior.pista.colaEET);
                nuevo.pista.colaEEV           = new Queue <Avion>(anterior.pista.colaEEV);
                nuevo.pista.tiempoRestanteAoD = anterior.pista.tiempoRestanteAoD;
                nuevo.pista.idClienteActual   = anterior.pista.idClienteActual;

                nuevo.tiempoFinAterrizaje = anterior.tiempoFinAterrizaje;

                nuevo.tiempoFinDeDespegue = anterior.tiempoFinDeDespegue;

                nuevo.tiempoFinPermanencia = anterior.tiempoFinPermanencia;

                nuevo.tiempoFinPurga      = anterior.tiempoFinPurga;
                nuevo.tiempoInestabilidad = anterior.tiempoInestabilidad;

                // Se recalculan variables estadísticas
                nuevo.porcAvionesAyDInst = (Convert.ToDouble(nuevo.cantAvionesAyDInst) / Convert.ToDouble(this.clientes.Count)) * 100;
                nuevo.avgEETTime         = Convert.ToDouble(nuevo.acumEETTime) / Convert.ToDouble(this.clientes.Count);
                nuevo.avgEEVTime         = Convert.ToDouble(nuevo.acumEEVTime) / Convert.ToDouble(this.clientes.Count);

                return(nuevo);
            }

            Avion.count += 1;
            Avion avionNuevo = new Avion();

            nuevo        = this.arrastrarVariablesEst(anterior);
            nuevo.evento = "Llegada Avion (" + Avion.count.ToString() + ")";
            nuevo.reloj  = tiempoProximoEvento;

            // Se arrastran variables estadísticas.

            // Calcular siguiente tiempo de llegada de prox avion
            nuevo.rndLlegada           = this.generator.NextRnd();
            nuevo.tiempoEntreLlegadas  = this.exponentialGenerator.Generate(nuevo.rndLlegada);
            nuevo.tiempoProximaLlegada = nuevo.tiempoEntreLlegadas + nuevo.reloj;

            // Calculos variables de pista
            nuevo.pista                   = new Pista();
            nuevo.pista.state             = anterior.pista.state;
            nuevo.pista.idClienteActual   = anterior.pista.idClienteActual;
            nuevo.pista.tiempoRestanteAoD = anterior.pista.tiempoRestanteAoD;
            nuevo.pista.colaEEV           = new Queue <Avion>(anterior.pista.colaEEV);
            nuevo.pista.colaEET           = new Queue <Avion>(anterior.pista.colaEET);
            if (nuevo.pista.state == "Libre")
            {
                avionNuevo.estado              = "EA";
                nuevo.rndAterrizaje            = this.generator.NextRnd();
                nuevo.tiempoAterrizaje         = this.uniformGeneratorAterrizaje.Generate(nuevo.rndAterrizaje);
                nuevo.tiempoFinAterrizaje      = nuevo.tiempoAterrizaje + nuevo.reloj;
                avionNuevo.tiempoFinAterrizaje = nuevo.tiempoFinAterrizaje;
                nuevo.pista.state              = "Ocupado";
                nuevo.pista.idClienteActual    = avionNuevo.id;
                avionNuevo.instantLanding      = true;
            }
            else
            {
                // Ver tema "Inestable"
                avionNuevo.estado = "EEV";
                nuevo.pista.colaEEV.Enqueue(avionNuevo);
                nuevo.tiempoFinAterrizaje = anterior.tiempoFinAterrizaje;
                avionNuevo.tiempoEEVin    = nuevo.reloj;
            }

            // Calcular variables de despegue
            nuevo.tiempoFinDeDespegue = anterior.tiempoFinDeDespegue;

            // Inestabilidad
            nuevo.tiempoInestabilidad = anterior.tiempoInestabilidad;
            nuevo.tiempoFinPurga      = anterior.tiempoFinPurga;

            // Clientes
            this.clientes.Add(avionNuevo);

            // Se recalculan variables estadísticas
            nuevo.porcAvionesAyDInst = (Convert.ToDouble(nuevo.cantAvionesAyDInst) / Convert.ToDouble(this.clientes.Count)) * 100;
            nuevo.avgEETTime         = Convert.ToDouble(nuevo.acumEETTime) / Convert.ToDouble(this.clientes.Count);
            nuevo.avgEEVTime         = Convert.ToDouble(nuevo.acumEEVTime) / Convert.ToDouble(this.clientes.Count);

            return(nuevo);
        }
Exemple #9
0
        public KeyValuePair <string, double> DeterminarSiguienteEvento(Dictionary <string, double> tiempos, StateRow anterior)
        {
            if (anterior.tiempoProximaLlegada != 0)
            {
                tiempos.Add("tiempoProximaLlegada", anterior.tiempoProximaLlegada);
            }

            if (anterior.tiempoInestabilidad != 0)
            {
                tiempos.Add("tiempoInestabilidad", anterior.tiempoInestabilidad);
            }

            if (anterior.tiempoFinPurga != 0)
            {
                tiempos.Add("tiempoFinPurga", anterior.tiempoFinPurga);
            }

            // Checkear optimizacion (desde - hasta)
            for (int j = 0; j < this.clientes.Count; j++)
            {
                if (this.clientes[j].tiempoFinAterrizaje != 0)
                {
                    tiempos.Add("tiempoFinAterrizaje_" + (j + 1).ToString(), this.clientes[j].tiempoFinAterrizaje);
                }
                if (this.clientes[j].tiempoFinDeDespegue != 0)
                {
                    tiempos.Add("tiempoFinDeDespegue_" + (j + 1).ToString(), this.clientes[j].tiempoFinDeDespegue);
                }
                if (this.clientes[j].tiempoPermanencia != 0)
                {
                    tiempos.Add("tiempoPermanencia_" + (j + 1).ToString(), this.clientes[j].tiempoPermanencia);
                }
            }

            var tiemposOrdenados = tiempos.OrderBy(obj => obj.Value).ToDictionary(obj => obj.Key, obj => obj.Value);
            KeyValuePair <string, double> menorTiempo = tiemposOrdenados.First();

            return(menorTiempo);
        }