public void FinalizarAtencionCliente(Iteracion iteracion) { switch (PropositoDelCLiente) { case Propositos.Encargar: relojero.AsignarNuevoRelojParaReparar(iteracion); break; case Propositos.Retirar: relojero.RetirarReloj(iteracion); break; case Propositos.Comprar: //no hacer nada break; } if (clientesEnCola == 0) { Estado = Estados.Libre; } else { clientesEnCola--; comenzarAtencion(iteracion); } }
private void comenzarAtencion(Iteracion iteracion) { DeterminarPropositoDelCliente(iteracion); iteracion.propositoCliente = PropositoDelCLiente.ToString(); double rnd; int tiempoMin = 0; int tiempoMax = 0; switch (PropositoDelCLiente) { case Propositos.Comprar: tiempoMin = controlador.MinTiempoCompra; tiempoMax = controlador.MaxTiempoCompra; break; case Propositos.Encargar: tiempoMin = controlador.MinTiempoEncargos; tiempoMax = controlador.MaxTiempoEncargos; break; case Propositos.Retirar: tiempoMin = controlador.MinTiempoRetiros; tiempoMax = controlador.MaxTiempoRetiros; break; } int tiempoAtencion = GeneradorDistribuciones.UniformeAB(tiempoMin, tiempoMax, out rnd); iteracion.rndTiempoAtencion = rnd.ToString(); iteracion.tiempoAtencion = tiempoAtencion.ToString(); Evento FinAtencion = new Evento(Evento.Tipos.FinAtencionCliente, tiempoAtencion + controlador.HoraActual); controlador.AgregarEvento(FinAtencion); }
private void DeterminarPropositoDelCliente(Iteracion iteracion) { int probCompra = controlador.porcentajeLlegadaComprador * 10; int probEncargo = controlador.porcentajeLlegadaEncargo * 10; int probRetiro = controlador.porcentajeLlegadaRetiro * 10; if (!relojero.HayRelojesEnElNegocio()) { probRetiro = 0; } if (PropositoDelCLiente == Propositos.Encargar && relojero.RelojesListos == 0) { probRetiro = 0; } double rnd; int probTotal = probRetiro + probCompra + probEncargo; int random = GeneradorDistribuciones.UniformeAB(0, probTotal, out rnd); iteracion.rndPropositoCliente = rnd + ""; if (random < probRetiro) { PropositoDelCLiente = Propositos.Retirar; return; } if (random < probCompra + probRetiro) { PropositoDelCLiente = Propositos.Comprar; return; } PropositoDelCLiente = Propositos.Encargar; }
private void ComenzarReparacion(Iteracion iteracion) { double rnd; int tiempoReparacion = GeneradorDistribuciones.UniformeAB(controlador.MinTiempoReparacion, controlador.MaxTiempoReparacion, out rnd); iteracion.rndTiempoReparacion = rnd.ToString(); iteracion.tiempoReparacion = tiempoReparacion.ToString(); Evento FinReparacion = new Evento(Evento.Tipos.FinReparacion, tiempoReparacion + controlador.HoraActual); controlador.AgregarEvento(FinReparacion); }
private void GenerarProximaLlegada(Iteracion iteracion) { double rnd; int tiempoLlegada = GeneradorDistribuciones.UniformeAB(MinTiempoLlegadaCliente, MaxTiempoLlegadaCliente, out rnd); Evento Llegada = new Evento(Evento.Tipos.LlegadaCliente, tiempoLlegada + HoraActual); AgregarEvento(Llegada); iteracion.randomLlegada = rnd.ToString(); iteracion.tiempoLlegada = tiempoLlegada.ToString(); }
public void AsignarNuevoRelojParaReparar(Iteracion iteracion) { if (Estado == Estados.Libre) { Estado = Estados.Ocupado; ComenzarReparacion(iteracion); } else { RelojesPorReparar++; } }
public void RetirarReloj(Iteracion iteracion) { if (RelojesListos > 0) { if (controlador.clienteRetiraCualquierReloj) { iteracion.relojEstaDisponible = "SI"; RelojesListos--; } else { List <bool> relojes = new List <bool>(); for (int i = 0; i < RelojesListos; i++) { relojes.Add(true); } if (Estado == Estados.Ocupado) { //solo si esta ocupado hay relojes esperando //si esta libre, no hay relojes esperando, sino estaria ocupado for (int i = 0; i < RelojesPorReparar; i++) { relojes.Add(false); } } Random random = new Random(); int index = random.Next(relojes.Count); bool relojTerminado = (relojes[index]); if (relojTerminado) { iteracion.relojEstaDisponible = "SI"; RelojesListos--; } else { iteracion.relojEstaDisponible = "NO"; controlador.relojesNoTerminadosATiempo++; } } } else { iteracion.relojEstaDisponible = "NO"; controlador.relojesNoTerminadosATiempo++; } }
public void NuevoClienteEnCola(Iteracion iteracion) { if (Estado == Estados.Libre) { //comenzar a atender cliente Estado = Estados.Ocupado; comenzarAtencion(iteracion); } else { clientesEnCola++; } }
public void FinalizarReparacion(Iteracion iteracion) { RelojesListos++; if (RelojesPorReparar == 0) { Estado = Estados.Libre; } else { RelojesPorReparar--; ComenzarReparacion(iteracion); } }
private void CargarHorasDeProximosEventosEnIteracion(Iteracion iteracion) { //esta funcion asume que en la lista de proximos eventos hay solo uno de cada tipo //si ese no es el caso funciona igual, pero es menos eficiente for (int i = ProximosEventos.Count - 1; i >= 0; i--) { switch (ProximosEventos[i].Tipo) { case Evento.Tipos.LlegadaCliente: iteracion.proximaLlegada = ProximosEventos[i].HoraDelEvento.ToString(); break; case Evento.Tipos.FinReparacion: iteracion.proximoFinReparacion = ProximosEventos[i].HoraDelEvento.ToString(); break; case Evento.Tipos.FinAtencionCliente: iteracion.proximoFinAtencion = ProximosEventos[i].HoraDelEvento.ToString(); break; } } }
public List <Iteracion> EjercutarSimulacion() { AgregarEvento(new Evento(Evento.Tipos.Inicio, 0)); AgregarEvento(new Evento(Evento.Tipos.FinSimulacion, minutosDeSimulacion)); relojero = new Relojero(this); ayudante = new Ayudante(this, relojero); while (HoraActual < minutosDeSimulacion) { Evento evento = ObtenerProximoEvento(); HoraActual = evento.HoraDelEvento; Iteracion iteracion = new Iteracion() { evento = evento.Tipo.ToString(), hora = HoraActual }; switch (evento.Tipo) { case Evento.Tipos.LlegadaCliente: GenerarProximaLlegada(iteracion); ayudante.NuevoClienteEnCola(iteracion); break; case Evento.Tipos.FinReparacion: relojero.FinalizarReparacion(iteracion); break; case Evento.Tipos.FinAtencionCliente: ayudante.FinalizarAtencionCliente(iteracion); break; case Evento.Tipos.Inicio: GenerarProximaLlegada(iteracion); break; case Evento.Tipos.FinSimulacion: break; } CargarHorasDeProximosEventosEnIteracion(iteracion); iteracion.estadoAyudante = ayudante.Estado.ToString(); iteracion.colaDeClientes = ayudante.clientesEnCola + ""; if (colaMaximaDeClientes < ayudante.clientesEnCola) { colaMaximaDeClientes = ayudante.clientesEnCola; } iteracion.colaMaximaClientes = colaMaximaDeClientes + ""; iteracion.relojesNoTerminadosATiempo = relojesNoTerminadosATiempo + ""; iteracion.estadoRelojero = relojero.Estado.ToString(); iteracion.colaRelojesPorReparar = relojero.RelojesPorReparar + ""; iteracion.colaRelojesListos = relojero.RelojesListos + ""; iteraciones.Add(iteracion); } return(iteraciones); }
private void CargarGrid(List <Iteracion> iteraciones) { VaciarGrid(); int ultimoIntevalo = Convert.ToInt32(minutos.Text) - Convert.ToInt32(ultimosMinutos.Text); bool cargarIteracion = true; for (int x = 0; x < iteraciones.Count; x++) { Iteracion i = iteraciones[x]; if (intervalo1a <= i.hora && i.hora <= intervalo1b) { cargarIteracion = true; } if (intervalo2a <= i.hora && i.hora <= intervalo2b) { cargarIteracion = true; } if (intervalo3a <= i.hora && i.hora <= intervalo3b) { cargarIteracion = true; } if (ultimoIntevalo < i.hora) { cargarIteracion = true; } if (cargarIteracion) { gridPrincipal.Rows.Add( i.evento, i.hora, i.randomLlegada, i.tiempoLlegada, i.proximaLlegada, i.estadoAyudante, i.rndPropositoCliente, i.propositoCliente, i.rndTiempoAtencion, i.tiempoAtencion, i.proximoFinAtencion, i.colaDeClientes, i.relojEstaDisponible, i.estadoRelojero, i.rndTiempoReparacion, i.tiempoReparacion, i.proximoFinReparacion, i.colaRelojesPorReparar, i.colaRelojesListos, i.colaMaximaClientes, i.relojesNoTerminadosATiempo ); cargarIteracion = false; } } Iteracion f = iteraciones.Last(); Estadisticos.Text = "Maxima cola de clientes: " + f.colaMaximaClientes + ", relojes no reparados a tiempo: " + f.relojesNoTerminadosATiempo; }