public Cola DeterminarColaDeProximoEventoArribo(Modelo modelo)
        {
            // Busca entre las colas posteriores aquella que tenga un servidor libre.

            foreach (var cola in this.ColasPosteriores)
            {
                var servidoresDeCola = modelo.DeterminarServidoresConLosQueTrabajaUnaCola(cola);

                var servidorLibre = servidoresDeCola.FirstOrDefault(s => !s.ServidorOcupado);
                if (servidorLibre != null)
                {
                    return(servidorLibre.ColaPrevia);
                }
            }

            // Si no hay ninguno libre, tomamos la cola de menor logitud.
            return(this.ColasPosteriores.OrderBy(c => c.CantidadEnCola).FirstOrDefault());
        }
Example #2
0
        public void RutinaEvento(Modelo modelo)
        {
            // Figura 1.8 pagina 32.

            this.Cola.AcumularAreaBajoQ(modelo);
            foreach (var servidor in modelo.Servidores)
            {
                servidor.AcumularAreaBajoB(modelo);
            }

            // Refactor
            if (this.Cola.NombreDelEventoDeArribo == Comunes.ArriboColaUno) // Si es "cola inicial".
            {
                modelo.EstablecerProximoEvento(this.Cola.NombreDelEventoDeArribo);
            }
            else
            {
                modelo.QuitarEventoDeConsideracion(this.Cola.NombreDelEventoDeArribo);
            }

            var sevidoresConLosQueTrabajaLaCola = modelo.DeterminarServidoresConLosQueTrabajaUnaCola(this.Cola);

            if (sevidoresConLosQueTrabajaLaCola.All(s => s.ServidorOcupado))
            {
                this.Cola.AgregarALaColaDeEspera(modelo);
            }
            else
            {
                this.Cola.EstablecerDemoraCompletada();

                Servidor servidorLibre = sevidoresConLosQueTrabajaLaCola.OrderBy(s => s.Prioridad).FirstOrDefault(s => !s.ServidorOcupado);
                servidorLibre.EstablecerServidorOcupado();

                modelo.EstablecerProximoEvento(servidorLibre.NombreDelEventoDePartida);
            }
        }
        public void AgregarALaColaDeEspera(Modelo modelo)
        {
            this.ColaDeTiemposDeArribo.Add(modelo.Reloj); // FI - Siempre el primero en llegar queda en la 1er posicion.

            //this.ColaDeTiemposDeArribo.Insert(0, modelo.Reloj); // LI - Siempre el ultimo en llegar queda en la 1er posicion.
        }
 public void ComputarDemoraTotal(Modelo modelo)
 {
     // Se acumula el tiempo que estuvo esperando el primero en cola hasta ser atendido.
     this.TotalDemora = this.TotalDemora + modelo.Reloj - this.ColaDeTiemposDeArribo.FirstOrDefault();
 }
        }                                                                // times of arrival.

        public void AcumularAreaBajoQ(Modelo modelo)
        {
            this.AreaBajoQ = this.AreaBajoQ + this.CantidadEnCola * (modelo.Reloj - this.TiempoDelUltimoEvento);

            this.TiempoDelUltimoEvento = modelo.Reloj;
        }