Exemplo n.º 1
0
 public void Liberar()
 {
     Estado                  = EstadoArea.Libre;
     TiempoDeAtencion        = TimeSpan.Zero;
     FechaProximoFinAtencion = DateTime.MinValue;
     AlfombraActual          = null;
 }
Exemplo n.º 2
0
 public void SalirDeEspera(Alfombra alfombra, DateTime reloj)
 {
     Estado = EstadoArea.Ocupado;
     FechaProximoFinAtencion = reloj.AddHours(MySettings.TiempoPonerAlfombras / 60).AddMilliseconds(37);
     TiempoDeAtencion        = MySettings.RoundTimeSpan(0, FechaProximoFinAtencion - reloj);
     AutoActual._Alfombra    = alfombra;
 }
Exemplo n.º 3
0
 private static string s(Alfombra a)
 {
     if (a != null)
     {
         return(a.nroAuto.ToString());
     }
     else
     {
         return("-");
     }
 }
Exemplo n.º 4
0
        public void TomarCliente(Alfombra a, DateTime reloj)
        {
            if (a == null) //no hay alfombra en cola
            {
                Estado           = EstadoArea.Libre;
                TiempoDeAtencion = TimeSpan.Zero;
            }
            else
            {
                Estado = EstadoArea.Ocupado;

                FechaProximoFinAtencion    = reloj.AddHours(MySettings.Distribuciones.UniformeAspirado.Calcular() / 60).AddMilliseconds(37);
                a.FechaFinAspirarAlfombras = FechaProximoFinAtencion;
                TiempoDeAtencion           = MySettings.RoundTimeSpan(0, FechaProximoFinAtencion - reloj);

                AlfombraActual = a;
            }
        }
Exemplo n.º 5
0
        public void FinQuitarAlfombras_Event()
        {
            _Auto = EventoAnterior.EmpleadoQA.AutoActual;

            if (ColaQuitarAlfombra.Count > 0)
            {
                EmpleadoQA.TomarCliente(ColaQuitarAlfombra[0], Reloj);
                ColaQuitarAlfombra.RemoveAt(0);
            }
            else
            {
                EmpleadoQA.Liberar();
            }

            // Se quita la alfombra
            Alfombra alfombra = EventoAnterior.EmpleadoQA.AutoActual._Alfombra;

            _Auto._Alfombra = null;
            if (EmpleadoAA.Estado == EstadoArea.Ocupado)
            {
                ColaAspirarAlfombra.Add(alfombra);
            }
            else
            {
                EmpleadoAA.TomarCliente(alfombra, Reloj);
            }

            //Se decide el lavado
            if (EmpleadoLavado1.Estado == EstadoArea.Ocupado && EmpleadoLavado2.Estado == EstadoArea.Ocupado)
            {
                ColaLavado.Add(_Auto);
            }
            else
            {
                if (EmpleadoLavado1.Estado == EstadoArea.Libre)
                {
                    EmpleadoLavado1.TomarCliente(_Auto, Reloj);
                }
                else
                {
                    EmpleadoLavado2.TomarCliente(_Auto, Reloj);
                }
            }
        }
Exemplo n.º 6
0
        public void FinAspirarAlfombras_Event()
        {
            _Auto = new Auto(Reloj, EventoAnterior.EmpleadoAA.AlfombraActual.nroAuto);
            Alfombra alfombra = EventoAnterior.EmpleadoAA.AlfombraActual;

            if (ColaAspirarAlfombra.Count > 0)
            {
                EmpleadoAA.TomarCliente(ColaAspirarAlfombra[0], Reloj);
                ColaAspirarAlfombra.RemoveAt(0);
            }
            else
            {
                EmpleadoAA.Liberar();
            }

            if (EmpleadoPA.Estado == EstadoArea.EnEspera && EmpleadoPA.AutoActual.NroAuto == alfombra.nroAuto)
            {
                EmpleadoPA.SalirDeEspera(alfombra, Reloj);
            }
            else
            {
                ColaAlfombrasListas.Add(alfombra.nroAuto, alfombra);
            }
        }
Exemplo n.º 7
0
        private void Simular()
        {
            var inicioFinInstance  = new InicioFinDelegate(InicioFin);
            var columnasInstance   = new ColumnasDelegate(AgregarColumnas);
            var filaInstance       = new FilaDelegate(AgregarFila);
            var statusInstance     = new StatusDelegate(ActualizarStatus);
            var resultadosInstance = new ResultadosDelegate(MostrarResultados);

            Invoke(inicioFinInstance, false);

            //manejo de llegadas
            var horaInicio = DateTime.Today.AddHours(8);
            var horaFin    = DateTime.Today.AddHours(18);
            var media      = double.Parse(txt_llegadas_media.Text);
            //media = media / 24;
            //media = media / 60;
            var           lambda = 1 / media;
            IDistribucion distribucionLlegadas = new DistribucionExponencialNegativa(lambda);
            Llegada       llegadas             = new Llegada(distribucionLlegadas, horaInicio, horaFin);

            //manejo de Quitado de Alfombras
            DateTime tiempoQA         = DateTime.Parse(txt_tiempoQA.Text);
            var      colaQA           = new ColaFifo("Quitado de Alfombra");
            var      quitadoAlfombras = new Servidor(tiempoQA, colaQA, "Quitado de Alfombra", false, true);

            //manejo de Aspirado
            var generadorCongMixto   = new CongruencialMixto(1000, 12, 17, 5000);
            var aspirado_a           = double.Parse(txt_aspirado_a.Text);
            var aspirado_b           = double.Parse(txt_aspirado_b.Text);
            var distribucionAspirado = new DistribucionUniforme(aspirado_a, aspirado_b, generadorCongMixto);
            var colaAspirado         = new ColaFifo("Aspirado");
            var aspirado             = new Servidor(distribucionAspirado, colaAspirado, "Aspirado", false, false);

            //manejo de Lavado

            var lavado_a           = double.Parse(txt_lavado_a.Text);
            var lavado_b           = double.Parse(txt_lavado_b.Text);
            var distribucionLavado = new DistribucionUniforme(lavado_a, lavado_b, generadorCongMixto);
            //var distribucionLavado = new DistribucionUniforme(lavado_a, lavado_b);
            var colaLS    = new ColaFifo("Lavadero");
            var lavadero1 = new Servidor(distribucionLavado, colaLS, "Lavadero 1", false, false);
            var lavadero2 = new Servidor(distribucionLavado, colaLS, "Lavadero 2", false, false);

            //manejo de secado

            var secadora = new Servidor("Secadora", true, false);

            //manejo de puesta de alfombra
            DateTime tiempoPA      = DateTime.Parse(txt_puesta_alfombras.Text);
            var      colaPA        = new ColaFifo("Puesta de Alfombra");
            var      ponerAlfombra = new Servidor(tiempoPA, colaPA, "Puesta de Alfombra", false, true);


            var dias  = int.Parse(txt_dias.Text);
            var desde = int.Parse(txt_desde.Text);
            var hasta = int.Parse(txt_hasta.Text);

            decimal promedioAtendidos   = 0;
            decimal promedioPermanencia = 0;

            var simulacion = 0;
            var numAutos   = 0;
            var clientes   = new List <Cliente>();
            int colaMax    = 0;
            var atendidos  = 0;

            _cancelar = false;
            for (var dia = 1; dia <= dias; dia++)
            {
                if (_cancelar == true)
                {
                    break;
                }


                decimal permanenciaDiaria = 0;
                llegadas.Abrir();

                while (llegadas.EstaAbierto() ||
                       !quitadoAlfombras.EstaLibre() ||
                       !aspirado.EstaLibre() ||
                       !aspirado.EstaLibre() ||
                       !secadora.EstaLibre() ||
                       !lavadero1.EstaLibre() ||
                       !lavadero2.EstaLibre() ||
                       !ponerAlfombra.EstaLibre())
                {
                    if (_cancelar)
                    {
                        break;
                    }

                    simulacion++;


                    var eventos = new List <Evento>
                    {
                        new Evento("Llegada", llegadas.ProximaLlegada),
                        new Evento("Cierre", llegadas.Cierre),
                        new Evento("Fin de Quitado de Alfombras", quitadoAlfombras.ProximoFinAtencion),
                        new Evento("Fin de Aspirado", aspirado.ProximoFinAtencion),
                        new Evento("Fin de Secado", secadora.ProximoFinAtencion),
                        new Evento("Fin de Lavadero 1", lavadero1.ProximoFinAtencion),
                        new Evento("Fin de Lavadero 2", lavadero2.ProximoFinAtencion),
                        new Evento("Fin Puesta de alfombras", ponerAlfombra.ProximoFinAtencion),
                    };

                    var relojActual  = eventos.Where(ev => ev.Hora.HasValue).Min(ev => ev.Hora).Value;
                    var eventoActual = eventos.First(ev => ev.Hora.Equals(relojActual)).Nombre;

                    switch (eventoActual)
                    {
                    case "Llegada":
                        numAutos++;
                        String tipoAuto         = ObtenerTipo();
                        var    alfombraLlegando = new Alfombra($"Alfombra de Auto {numAutos}");
                        var    clienteLlegando  = new Cliente($"Auto {numAutos}", tipoAuto, alfombraLlegando);
                        clienteLlegando.Llegar(relojActual);
                        quitadoAlfombras.LlegadaCliente(relojActual, clienteLlegando);
                        llegadas.ActualizarLlegada(1);
                        if (simulacion <= hasta)
                        {
                            clientes.Add(clienteLlegando);

                            Invoke(columnasInstance, numAutos);
                        }
                        break;

                    case "Fin de Quitado de Alfombras":
                        var clienteSinAlfombra = quitadoAlfombras.FinAtencion();
                        aspirado.LlegadaCliente(relojActual, clienteSinAlfombra);
                        if (lavadero1.EstaLibre())
                        {
                            lavadero1.LlegadaCliente(relojActual, clienteSinAlfombra);
                        }
                        else
                        {
                            lavadero2.LlegadaCliente(relojActual, clienteSinAlfombra);
                        }

                        break;

                    case "Fin de Aspirado":
                        var clienteAspirado = aspirado.FinAtencion();
                        if (clienteAspirado.Humedad <= 1)
                        {
                            ponerAlfombra.LlegadaCliente(relojActual, clienteAspirado);
                        }
                        break;

                    case "Fin de Lavadero 1":
                        if (lavadero1.ClienteActual.Humedad < 1)
                        {
                            var clienteSeco = lavadero1.FinAtencion();
                            ponerAlfombra.LlegadaCliente(relojActual, clienteSeco);
                        }
                        else
                        {
                            if (secadora.EstaLibre())
                            {
                                var clienteLavado1 = lavadero1.FinAtencion();
                                secadora.LlegadaCliente(relojActual, clienteLavado1);
                            }
                            else
                            {
                                lavadero1.cambiarEstado("Bloqueado");
                                lavadero1.ComenzarSecado(relojActual);
                            }
                        }


                        break;

                    case "Fin de Lavadero 2":
                        if (lavadero2.ClienteActual.Humedad < 1)
                        {
                            var clienteSeco = lavadero2.FinAtencion();
                            ponerAlfombra.LlegadaCliente(relojActual, clienteSeco);
                        }
                        else
                        {
                            if (secadora.EstaLibre())
                            {
                                var clienteLavado2 = lavadero2.FinAtencion();
                                secadora.LlegadaCliente(relojActual, clienteLavado2);
                            }
                            else
                            {
                                lavadero2.cambiarEstado("Bloqueado");
                                lavadero2.ComenzarSecado(relojActual);
                            }
                        }
                        break;

                    case "Fin de Secado":
                        Cliente clienteASecado = null;
                        Cliente clienteSecado  = secadora.FinAtencion();
                        if (lavadero1.EstaBloqueado() & lavadero2.EstaBloqueado())
                        {
                            clienteASecado = lavadero1.ClienteActual;
                            clienteASecado.CalcularSecado(relojActual);
                            lavadero1.cambiarEstado("Libre");
                            lavadero1.FinAtencion();
                            secadora.LlegadaCliente(relojActual, clienteASecado);
                        }
                        else
                        {
                            if (lavadero1.EstaBloqueado())
                            {
                                clienteASecado = lavadero1.ClienteActual;
                                clienteASecado.CalcularSecado(relojActual);
                                lavadero1.cambiarEstado("Libre");
                                lavadero1.FinAtencion();
                                secadora.LlegadaCliente(relojActual, clienteASecado);
                            }
                            else
                            {
                                if (lavadero2.EstaBloqueado())
                                {
                                    clienteASecado = lavadero2.ClienteActual;
                                    clienteASecado.CalcularSecado(relojActual);
                                    lavadero2.cambiarEstado("Libre");
                                    lavadero2.FinAtencion();
                                    secadora.LlegadaCliente(relojActual, clienteASecado);
                                }
                            }
                        }

                        ponerAlfombra.LlegadaCliente(relojActual, clienteSecado);

                        break;

                    case "Fin Puesta de alfombras":

                        var clienteSaliendo = ponerAlfombra.FinAtencion();
                        if (clienteSaliendo != null)
                        {
                            clienteSaliendo.Salir(relojActual);
                            permanenciaDiaria = (permanenciaDiaria * atendidos + clienteSaliendo.TiempoEnSistema) / (atendidos + 1);
                            atendidos++;
                        }
                        break;

                    case "Cierre":
                        llegadas.Cerrar();
                        colaQA.Vaciar();
                        break;
                    }

                    colaMax = quitadoAlfombras.MaxCola;
                    if (simulacion % 10 == 0)
                    {
                        Invoke(statusInstance, dia, relojActual, simulacion);
                    }
                    //termina la simulacion
                    if (simulacion >= desde && simulacion <= hasta)
                    { //esto invoca el metodo de llenado de la fila
                        Invoke(filaInstance, relojActual, eventoActual, llegadas, colaQA, quitadoAlfombras, colaAspirado,
                               aspirado, colaLS, lavadero1, lavadero2, secadora, colaPA, ponerAlfombra, atendidos, permanenciaDiaria, clientes);
                    }
                }

                var permanenciaAnterior = promedioPermanencia * promedioAtendidos * (dia - 1);
                promedioAtendidos = (promedioAtendidos * (dia - 1) + atendidos) / dia;


                if (promedioAtendidos != 0)
                {
                    promedioPermanencia = (permanenciaAnterior + permanenciaDiaria * atendidos) / (promedioAtendidos * dia);
                }
            }

            Invoke(resultadosInstance, promedioAtendidos, promedioPermanencia, colaMax, atendidos);
            Invoke(inicioFinInstance, true);
            var resultado = _cancelar ? "interrumpida" : "completa";

            MessageBox.Show($@"Simulación {resultado}", @"Resultado");
        }