示例#1
0
        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);
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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;
        }
示例#4
0
        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);
        }
示例#5
0
        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();
        }
示例#6
0
 public void AsignarNuevoRelojParaReparar(Iteracion iteracion)
 {
     if (Estado == Estados.Libre)
     {
         Estado = Estados.Ocupado;
         ComenzarReparacion(iteracion);
     }
     else
     {
         RelojesPorReparar++;
     }
 }
示例#7
0
        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++;
            }
        }
示例#8
0
        public void NuevoClienteEnCola(Iteracion iteracion)
        {
            if (Estado == Estados.Libre)
            {
                //comenzar a atender cliente
                Estado = Estados.Ocupado;
                comenzarAtencion(iteracion);
            }

            else
            {
                clientesEnCola++;
            }
        }
示例#9
0
        public void FinalizarReparacion(Iteracion iteracion)
        {
            RelojesListos++;

            if (RelojesPorReparar == 0)
            {
                Estado = Estados.Libre;
            }
            else
            {
                RelojesPorReparar--;
                ComenzarReparacion(iteracion);
            }
        }
示例#10
0
        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;
                }
            }
        }
示例#11
0
        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);
        }
示例#12
0
        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;
        }