public void Liberar() { Estado = EstadoArea.Libre; TiempoDeAtencion = TimeSpan.Zero; FechaProximoFinAtencion = DateTime.MinValue; AlfombraActual = null; }
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; }
private static string s(Alfombra a) { if (a != null) { return(a.nroAuto.ToString()); } else { return("-"); } }
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; } }
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); } } }
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); } }
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"); }