示例#1
0
        /// <summary>
        /// genera un valor aleatorio aplicando la distribucion Poisson
        /// </summary>
        /// <param name="lambda"></param>
        /// <param name="tamanioMuestra"></param>
        /// <returns></returns>
        public static double[] generarPoisson(double lambda, int tamanioMuestra)
        {
            double[] v;
            v = new double[tamanioMuestra];

            double p = 1;
            double x = -1;
            double u = 0;

            double a = Math.Exp(-lambda);

            for (int j = 0; j < v.Length; j++)
            {
                p = 1;
                x = 0;
                do
                {
                    u = Aleatorio.getInstancia().NextDouble();
                    p = p * u;

                    x++;
                } while (p >= a);

                v[j] = x;
            }
            return(v);
        }
示例#2
0
        private TimeSpan generarTiempoEntreLlegada()
        {
            double lambda = pedidosPorHora / 60d;

            double tiempoEntreLlegada = (-1 / lambda) * Math.Log(1 - Aleatorio.getInstancia().NextDouble());

            return(TimeSpan.FromMinutes(tiempoEntreLlegada));
        }
示例#3
0
        /// <summary>
        /// genera un valor aleatorio aplicando la distribucion exponencial
        /// </summary>
        /// <param name="lambda"></param>
        /// <param name="tamanioMuestra"></param>
        /// <returns></returns>
        public static double[] generarExponencial(double lambda, int tamanioMuestra)
        {
            double[] v;
            v = new double[tamanioMuestra];

            double media = 1 / lambda;

            for (int i = 0; i < v.Length; i++)
            {
                v[i] = Math.Round(-media * Math.Log(1 - Aleatorio.getInstancia().NextDouble()), 4);
            }

            return(v);
        }
示例#4
0
        /// <summary>
        /// genera dos valores aleatorios aplicando la distribucion normal
        /// </summary>
        /// <param name="n"></param>
        /// <param name="media"></param>
        /// <param name="desviacion"></param>
        /// <returns></returns>
        public static double[] generarNormal(int n, double media, double desviacion)
        {
            pi = Math.PI;


            double[] v;
            v = new double[n];

            int i = 0;

            while (i < v.Length)
            {
                double aux1 = Aleatorio.getInstancia().NextDouble() * 1;
                double aux2 = Aleatorio.getInstancia().NextDouble() * 1;

                double z1 = Math.Sqrt(-2 * Math.Log(aux1)) * (Math.Sin(2 * pi * aux2));
                double z2 = Math.Sqrt(-2 * Math.Log(aux1)) * (Math.Cos(2 * pi * aux2));

                double variable1 = media + desviacion * (z1);
                double variable2 = media + desviacion * (z2);

                v[i]     = Math.Round(variable1, 4);
                v[i + 1] = Math.Round(variable2, 4);

                i = i + 2;
            }
            //for (int i = 0; i < v.Length; i + 2)
            //{
            //    double aux1 = r1.NextDouble() * 1;
            //    double aux2 = r2.NextDouble() * 1;

            //    double z1 = Math.Sqrt(-2 * Math.Log(aux1)) * (Math.Sin(2 * pi * aux2));
            //    double z2 = Math.Sqrt(-2 * Math.Log(aux1)) * (Math.Cos(2 * pi * aux2));

            //    double variable1 = media + desviacion * (z1);
            //    double variable2 = media + desviacion * (z2);

            //    v[i] = Math.Round(variable1, 4);
            //    v[i + 1] = Math.Round(variable2, 4);

            //}

            return(v);
        }
示例#5
0
        public static int generarRandomPoisson(double lambda, int valorInicialX)
        {
            double p = 1;
            int    x = valorInicialX;
            double u = 0;

            double a = Math.Exp(-lambda);

            p = 1;
            x = 0;
            do
            {
                u = Aleatorio.getInstancia().NextDouble();
                p = p * u;

                x++;
            } while (p >= a);

            return(x);
        }
示例#6
0
 /// <summary>
 /// genera un valor aleatorio aplicando la distribucion uniforme
 /// </summary>
 /// <param name="min"></param>
 /// <param name="max"></param>
 /// <returns></returns>
 public static double generarUniforme(double min, double max)
 {
     return(Math.Round(Aleatorio.getInstancia().NextDouble() * (max - min) + min, 4));
 }
示例#7
0
        private Pedido generarPedido(out bool pedidoYaCreado)
        {
            pedidoYaCreado = false;
            //generamos el random para saber a que pedido pertenece
            Double random = Aleatorio.getInstancia().NextDouble();
            Pedido pedido;

            if (random < 0.2d)
            {
                pedido = buscarPedidoDisponible(typeof(PedidoSandwich), 1);


                if (pedido == null)
                {
                    //Genero una docena de sanguches
                    pedido = new PedidoSandwich(mediaSandwich, desviacionSandwich);
                    actual.sandwichPreparados++;
                }
                else
                {
                    pedidoYaCreado = true;
                }
            }
            else if (0.2d < random && random < 0.6d)
            {
                pedido = buscarPedidoDisponible(typeof(PedidoPizza), 1);

                if (pedido == null)
                {
                    //Genero un pedido pizza
                    pedido = new PedidoPizza(a_pizza, b_pizza);
                    actual.pizzasPreparadas++;
                }
                else
                {
                    pedidoYaCreado = true;
                }
            }
            else if (0.6 < random && random < 0.9d)
            {
                pedido = new PedidoEmpanadas(mediaEmpanadas);

                Pedido pedidoAux = buscarPedidoDisponible(typeof(PedidoEmpanadas), pedido.getCantidad());

                //genero un pedido de empanadas


                if (pedidoAux == null)
                {
                    actual.empanadasPreparadas += pedido.getCantidad();
                }
                else
                {
                    pedido         = pedidoAux;
                    pedidoYaCreado = true;
                }
            }
            else if (0.9d < random && random < 0.95d)
            {
                pedido = buscarPedidoDisponible(typeof(PedidoHamburguesa), 1);

                if (pedido == null)
                {
                    //Genero un pedido de hamburguesas
                    pedido = new PedidoHamburguesa();
                    actual.hamburguesasPreparados++;
                }
                else
                {
                    pedidoYaCreado = true;
                }
            }
            else
            {
                pedido = buscarPedidoDisponible(typeof(PedidoLomito), 1);

                if (pedido == null)
                {
                    //Genero un pedido de lomito
                    pedido = new PedidoLomito();
                    actual.lomitosPreparados++;
                }
                else
                {
                    pedidoYaCreado = true;
                }
            }

            //asigno nro de pedido y agrego el pedido a la lista de pedidos
            pedido.numeroPedido = numeroPedido++;

            pedido.momentoInicio = actual.reloj;

            actual.pedidos.Add(pedido);

            return(pedido);
        }
示例#8
0
        private Servidor obtenerCocineroMayorTiempoLibre()
        {
            Servidor cocineroConMasTiempoLibre = null;

            List <Servidor> cocinerosLibres = anterior.cocineros.Where(x => x.estadoServidor == EstadoServidor.libre).ToList();

            TimeSpan        mayorTiempoLibre;
            List <Servidor> servidoresConTiempoLibre;
            double          aleatorio;

            switch (cocinerosLibres.Count)
            {
            case 1:
                cocineroConMasTiempoLibre = cocinerosLibres.First();
                break;

            case 2:

                mayorTiempoLibre = cocinerosLibres.Max(x => x.tiempoLibre);

                servidoresConTiempoLibre = cocinerosLibres.Where(x => x.tiempoLibre == mayorTiempoLibre).ToList();

                if (servidoresConTiempoLibre.Count == 1)
                {
                    cocineroConMasTiempoLibre = servidoresConTiempoLibre[0];
                }
                else
                {
                    aleatorio = Aleatorio.getInstancia().NextDouble();

                    if (aleatorio < 0.5)
                    {
                        cocineroConMasTiempoLibre = cocinerosLibres[0];
                    }
                    else
                    {
                        cocineroConMasTiempoLibre = cocinerosLibres[1];
                    }
                }


                break;

            case 3:

                mayorTiempoLibre = cocinerosLibres.Max(x => x.tiempoLibre);

                servidoresConTiempoLibre = cocinerosLibres.Where(x => x.tiempoLibre == mayorTiempoLibre).ToList();

                if (servidoresConTiempoLibre.Count == 1)
                {
                    cocineroConMasTiempoLibre = servidoresConTiempoLibre[0];
                }
                else
                {
                    aleatorio = Aleatorio.getInstancia().NextDouble();

                    if (servidoresConTiempoLibre.Count == 2)
                    {
                        if (aleatorio < 0.5)
                        {
                            cocineroConMasTiempoLibre = cocinerosLibres[0];
                        }
                        else
                        {
                            cocineroConMasTiempoLibre = cocinerosLibres[1];
                        }
                    }
                    else
                    {
                        if (aleatorio < 0.3333)
                        {
                            cocineroConMasTiempoLibre = cocinerosLibres[0];
                        }
                        else if (aleatorio < 0.6666)
                        {
                            cocineroConMasTiempoLibre = cocinerosLibres[1];
                        }
                        else
                        {
                            cocineroConMasTiempoLibre = cocinerosLibres[2];
                        }
                    }
                }

                break;

            default:
                break;
            }

            return(cocineroConMasTiempoLibre);
        }
示例#9
0
 private TimeSpan obtenerTiempoEntregaDelivery()
 {
     return(TimeSpan.FromMinutes(-mediaDemoraPedido * Math.Log(1 - Aleatorio.getInstancia().NextDouble())));
 }