Exemplo n.º 1
0
        private void agregarFilaResumen(VectorEstado simulacionFinal)
        {
            string formatoDecimal  = "0.0000";
            string formatoTimeSpan = @"hh\:mm\:ss";

            var fila = simulacionesResumenDataTable.NewRow();

            fila["Numero Simulacion"] = simulacionFinal.numeroEvento;

            fila["Tiempo Promedio Libre Coccion"]       = simulacionFinal.tiempoPromedioLibreCocineros.ToString(formatoTimeSpan);
            fila["Tiempo Promedio Libre Delivery"]      = simulacionFinal.tiempoPromedioLibreDelivery.ToString(formatoTimeSpan);
            fila["Ventas Perdidas Promedio Por Dia"]    = simulacionFinal.promedioPedidosPerdidos.ToString(formatoDecimal);
            fila["Ventas con Entrega Gratuita Por Dia"] = simulacionFinal.cantidadPedidosCeroIngresos;
            fila["Valor de los Ingresos"]            = simulacionFinal.ingresosGeneradosTotal.ToString(formatoDecimal);
            fila["Valor de las Ventas Perdidas"]     = simulacionFinal.montoPedidosPerdidos.ToString(formatoDecimal);
            fila["Ingreso Promedio Diario"]          = simulacionFinal.ingresoPromedioDiario.ToString(formatoDecimal);
            fila["Desvío Ingreso Diario"]            = Math.Sqrt(simulacionFinal.ingresoDesvioDiario).ToString(formatoDecimal);
            fila["Numero Maximo de Ventas Perdidas"] = simulacionFinal.maximoVentasPerdidas;
            fila["Tiempo Promedio en Cola"]          = simulacionFinal.promedioTiempoClientesEnCola.ToString(formatoTimeSpan);
            fila["Tiempo de Entrega de Pedidos Promedio Desde Creacion"] = simulacionFinal.promedioTiempoEntregaDesdePedido.ToString(formatoTimeSpan);

            fila["Probabilidad ingreso < 250"] = simulacionFinal.probabilidadIngresoMenosDe250.ToString(formatoDecimal);

            fila["Probabilidad pedidos caidos o gratis"] = simulacionFinal.probabilidadPedidosCaidosOGratis.ToString(formatoDecimal);


            simulacionesResumenDataTable.Rows.Add(fila);
        }
Exemplo n.º 2
0
        private void mostrarVectorResultado()
        {
            VectorEstado simulacionFinal = calcularPromedioSimulacionDiaria();

            agregarFilaResumen(simulacionFinal);

            grdResultados.DataSource = simulacionesResumenDataTable;
        }
Exemplo n.º 3
0
        private void agregarSimulacion(VectorEstado ultimaSimulacion)
        {
            ultimaSimulacion.numeroEvento            = resultados.Count;
            ultimaSimulacion.maximoVentasPerdidas    = ultimaSimulacion.cantidadPedidosPerdidos;
            ultimaSimulacion.promedioPedidosPerdidos = ultimaSimulacion.cantidadPedidosPerdidos;

            calcularPromedioSimulacionDiaria();

            grdResultados.DataSource = null;

            int cantidadPedidosCaidosOAbandonados = ultimaSimulacion.pedidosAbandonados + ultimaSimulacion.cantidadPedidosCeroIngresos;

            if (cantidadPedidosCaidosOAbandonados >= 5)
            {
                ultimaSimulacion.probabilidadPedidosCaidosOGratis = 1;
            }

            agregarFilaResumen(ultimaSimulacion);

            grdResultados.DataSource = simulacionesResumenDataTable;
        }
Exemplo n.º 4
0
        private void agregarDatosDGVFunciones(VectorEstado actual)
        {
            int    numeroSim               = actual.NumeroSimulacion;
            String reloj                   = Math.Round(actual.Reloj, 2).ToString();
            int    personasEnColaSala      = actual.PersonasEnColaSala;
            double porcPersonasNoEntraron  = Math.Round(((double)personasEnColaSala / ((double)actual.EntradasVendidas)) * 100, 2);
            double tiempoOcupacionBoletero = Math.Round(actual.TiempoOcupacionBoletero, 2);
            double entradasVendidas        = actual.EntradasVendidas;
            double entradasAnticipadas     = actual.EntradasAnticipadas;
            String porcentajeOcupacion     = Math.Round((((double)actual.TiempoOcupacionBoletero / actual.Reloj) * 100), 2).ToString();

            acumPersonasNoEntraron        += personasEnColaSala;
            acumuladorEntradasAnticipadas += actual.EntradasAnticipadas;
            acumuladorEntradasVendidas    += actual.EntradasVendidas;
            acumReloj          += Math.Round(actual.Reloj, 2);
            acumTiempoBoletero += Math.Round(actual.TiempoOcupacionBoletero, 2);
            double acumPorcPersonasNoEntraron = Math.Round((acumPersonasNoEntraron / acumuladorEntradasVendidas) * 100, 2);

            double acumdescuento15 = Math.Round((acumuladorEntradasAnticipadas * 0.15 / acumuladorEntradasVendidas) * 100, 2);

            double acPorcTiempoBoletero = Math.Round((acumTiempoBoletero / acumReloj) * 100, 2);

            double descuento15 = Math.Round((entradasAnticipadas * 0.15 / entradasVendidas) * 100, 2);

            string salaLlena;

            if (actual.ButacasOcupadas == tamSala)
            {
                salaLlena = "Si"; acumSalasLlenas += 1;
            }
            else
            {
                salaLlena = "No";
            }

            double porcSalasLlenas = Math.Round((acumSalasLlenas / actual.NumeroSimulacion) * 100, 2);

            double promEntradasVendidas = Math.Round((acumuladorEntradasVendidas / actual.NumeroSimulacion), 2);

            double porcEntradasAnticipadas      = Math.Round((entradasAnticipadas / entradasVendidas) * 100, 2);
            double porcTotalEntradasAnticipadas = Math.Round((acumuladorEntradasAnticipadas / acumuladorEntradasVendidas) * 100, 2);

            dgvFunciones.Rows.Add(numeroSim,
                                  reloj,
                                  tiempoOcupacionBoletero,
                                  acumTiempoBoletero,
                                  acumReloj,
                                  acPorcTiempoBoletero.ToString() + "%",
                                  salaLlena,
                                  acumSalasLlenas,
                                  porcSalasLlenas.ToString() + "%",
                                  entradasVendidas,
                                  acumuladorEntradasVendidas,
                                  promEntradasVendidas,
                                  entradasAnticipadas,
                                  porcEntradasAnticipadas.ToString() + "%",
                                  acumuladorEntradasAnticipadas,
                                  porcTotalEntradasAnticipadas.ToString() + "%",
                                  porcPersonasNoEntraron.ToString() + "%",
                                  acumPorcPersonasNoEntraron.ToString() + "%",
                                  descuento15.ToString() + "%",
                                  acumdescuento15.ToString() + "%");
        }
Exemplo n.º 5
0
        private void btnSimular_Click(object sender, EventArgs e)
        {
            if (validarCampos())
            {
                btnMostrarLlenado.Enabled = btnMostrarVaciado.Enabled = true;
                dgvFuncion.Rows.Clear();
                limpiarClientes();
                dgvFunciones.Rows.Clear();
                if (frmRKVaciado != null)
                {
                    frmRKVaciado.Close();
                }

                resetearAcumuladores();

                frmRKLlenado   = new frmRungeKutta(h, alfa, desb1, desb2, desb3);
                tiemposLlenado = frmRKLlenado.rungeKuttaGraficoLlenado();

                frmRKVaciado = new frmRungeKutta(h, alfa, desb1, desb2, desb3);
                for (int i = 0; i < numSim; i++)
                {
                    anterior         = new VectorEstado();
                    actual           = new VectorEstado();
                    actual.Reloj     = 0;
                    actual.Evento    = "inicio_simulacion";
                    actual.Boletero  = new Boletero();
                    actual.Boleteria = new Queue <Cliente>();
                    actual.Entrada   = new Queue <Cliente>();


                    Cliente clienteAtendido = new Cliente(0, false);
                    Cliente entrante        = new Cliente(0, false);
                    empezoPelicula        = false;
                    empezoSimulacion      = false;
                    ingresoLlegadaEntrada = false;
                    ingresoASala          = false;

                    List <Cliente> clientes = new List <Cliente>();

                    while (actual.ButacasOcupadas < tamSala && !(actual.PersonasEnColaSala == 0 && empezoPelicula) || actual.Boletero.Estado == "ocupado")
                    {
                        anterior = actual;
                        actual   = new VectorEstado();
                        copiarAnterior();

                        buscarEvento();

                        switch (actual.Evento)
                        {
                        case "inicio_simulacion":
                            resetearCampos();
                            actual.ButacasOcupadas         = 0;
                            actual.NumeroSimulacion        = i + 1;
                            actual.PersonasEnColaSala      = 0;
                            actual.TiempoOcupacionBoletero = 0;
                            actual.RndLlegadaCompra        = random.NextDouble();
                            actual.LlegadaCompra           = aleatorioU(desdeTiempoLlegadaCompra, hastaTiempoLlegadaCompra, actual.RndLlegadaCompra);
                            actual.ProximaLlegadaCompra    = actual.Reloj + actual.LlegadaCompra;
                            empezoSimulacion     = true;
                            actual.EstadoPortero = "libre";
                            break;

                        case "llegada_compra":
                            resetearCampos();
                            if (empezoPelicula)
                            {
                                break;
                            }
                            actual.RndLlegadaCompra     = random.NextDouble();
                            actual.LlegadaCompra        = aleatorioU(desdeTiempoLlegadaCompra, hastaTiempoLlegadaCompra, actual.RndLlegadaCompra);
                            actual.ProximaLlegadaCompra = actual.Reloj + actual.LlegadaCompra;

                            actual.RndNumeroCompra = random.NextDouble();
                            actual.NumeroCompra    = aleatorioInt(desdeEntradasComprar, hastaEntradasComprar, actual.RndNumeroCompra);
                            Cliente nuevo = new Cliente(actual.NumeroCompra, false);
                            nuevo.Nombre = "Cliente" + (clientes.Count + 1);
                            clientes.Add(nuevo);

                            for (int m = 0; m < actual.NumeroCompra - 1; m++)
                            {
                                Cliente nuevoAcompañante = new Cliente(actual.NumeroCompra, false);
                                nuevoAcompañante.Nombre = "Cliente" + (clientes.Count + 1);
                                clientes.Add(nuevoAcompañante);
                                nuevo.Acompañantes.Add(nuevoAcompañante);
                            }

                            if (actual.Boletero.Estado == "ocupado")
                            {
                                actual.Boleteria.Enqueue(nuevo);
                            }
                            else
                            {
                                clienteAtendido        = nuevo;
                                clienteAtendido.Estado = "comprando";
                                foreach (Cliente acompañante in clienteAtendido.Acompañantes)
                                {
                                    acompañante.Estado = "acomp_" + clienteAtendido.Nombre;
                                }
                                actual.Boletero.Estado          = "ocupado";
                                actual.Boletero.InicioOcupacion = actual.Reloj;
                                actual.RndFinCompra             = random.NextDouble();
                                actual.FinCompra        = aleatorioU(desdeTiempoCompra, hastaTiempoCompra, actual.RndFinCompra);
                                actual.ProximoFinCompra = actual.Reloj + actual.FinCompra;
                            }

                            break;

                        case "llegada_entrada_anticipada":
                            resetearCampos();
                            if (empezoPelicula)
                            {
                                break;
                            }

                            actual.RndLlegadaEntrada     = random.NextDouble();
                            actual.LlegadaEntrada        = aleatorioU(desdeTiempoLlegadaAnticipada, hastaTiempoLlegadaAnticipada, actual.RndLlegadaEntrada);
                            actual.ProximaLlegadaEntrada = actual.Reloj + actual.LlegadaEntrada;

                            actual.RndNumeroEntrada = random.NextDouble();
                            actual.NumeroEntrada    = aleatorioInt(desdeEntradasAnticipadas, hastaEntradasAnticipadas, actual.RndNumeroEntrada);

                            if (actual.PersonasEnColaSala == 0 && ingresoASala && actual.EstadoPortero != "interrumpido")
                            {
                                actual.RndFinEntrada     = random.NextDouble();
                                actual.FinEntrada        = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada);
                                actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada;
                            }

                            actual.PersonasEnColaSala += actual.NumeroEntrada;

                            actual.EntradasVendidas += actual.NumeroEntrada;

                            actual.EntradasAnticipadas += actual.NumeroEntrada;

                            for (int j = 0; j < actual.NumeroEntrada; j++)
                            {
                                Cliente nuevoAnticipada = new Cliente(actual.NumeroCompra, true);
                                nuevoAnticipada.Nombre = "Cliente" + (clientes.Count + 1);
                                actual.Entrada.Enqueue(nuevoAnticipada);
                                clientes.Add(nuevoAnticipada);
                            }



                            break;

                        case "fin_compra":
                            resetearCampos();

                            if (actual.PersonasEnColaSala == 0 && ingresoASala && actual.EstadoPortero != "interrumpido")
                            {
                                actual.RndFinEntrada     = random.NextDouble();
                                actual.FinEntrada        = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada);
                                actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada;
                            }
                            actual.PersonasEnColaSala += clienteAtendido.NumeroEntradas;
                            actual.EntradasVendidas   += clienteAtendido.NumeroEntradas;
                            clienteAtendido.Estado     = "esperando_entrar";
                            actual.Entrada.Enqueue(clienteAtendido);
                            foreach (Cliente acompañante in clienteAtendido.Acompañantes)
                            {
                                acompañante.Estado = "esperando_entrar";
                                actual.Entrada.Enqueue(acompañante);
                            }

                            actual.TiempoOcupacionBoletero += actual.Reloj - actual.Boletero.InicioOcupacion;

                            //si hay gente en la cola de la boleteria, y no empezó la pelicula, se toma a un cliente y se hace un nuevo fin compra
                            if (actual.Boleteria.Count != 0 && !empezoPelicula)
                            {
                                clienteAtendido        = actual.Boleteria.Dequeue();
                                clienteAtendido.Estado = "comprando";
                                foreach (Cliente acompañante in clienteAtendido.Acompañantes)
                                {
                                    acompañante.Estado = "acomp_" + clienteAtendido.Nombre;
                                }
                                actual.RndFinCompra             = random.NextDouble();
                                actual.FinCompra                = aleatorioU(desdeTiempoCompra, hastaTiempoCompra, actual.RndFinCompra);
                                actual.ProximoFinCompra         = actual.Reloj + actual.FinCompra;
                                actual.Boletero.InicioOcupacion = actual.Reloj;
                            }
                            else     // si no, el boletero queda libre
                            {
                                actual.Boletero.Estado  = "libre";
                                actual.ProximoFinCompra = -1;
                            }
                            break;

                        case "fin_entrada":
                            resetearCampos();
                            if (actual.ButacasOcupadas < tamSala && actual.PersonasEnColaSala > 0)
                            {
                                entrante.Estado         = "";
                                actual.ButacasOcupadas += 1;
                                entrante                  = actual.Entrada.Dequeue();
                                entrante.Estado           = "entrando";
                                actual.PersonasEnColaSala = actual.Entrada.Count;
                                actual.RndFinEntrada      = random.NextDouble();
                                actual.FinEntrada         = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada);
                                actual.ProximoFinEntrada  = actual.Reloj + actual.FinEntrada;
                                actual.EstadoPortero      = "ocupado";
                                actual.LlegadasPortero++;
                            }
                            else
                            {
                                actual.EstadoPortero     = "libre";
                                actual.ProximoFinEntrada = -1;
                            }
                            break;

                        case "inicio_llegada_con_entrada":
                            resetearCampos();
                            actual.RndLlegadaEntrada     = random.NextDouble();
                            actual.LlegadaEntrada        = aleatorioU(desdeTiempoLlegadaAnticipada, hastaTiempoLlegadaAnticipada, actual.RndLlegadaEntrada);
                            actual.ProximaLlegadaEntrada = actual.Reloj + actual.LlegadaEntrada;
                            ingresoLlegadaEntrada        = true;
                            break;

                        case "inicio_ingreso_sala":
                            resetearCampos();
                            actual.RndInterrupcion     = random.NextDouble();
                            actual.PuntoDesborde       = desborde(actual.RndInterrupcion);
                            actual.TiempoInterrupcion  = getTiempoInterrupcion(actual.PuntoDesborde);
                            actual.ProximaInterrupcion = actual.Reloj + actual.TiempoInterrupcion;
                            if (actual.PersonasEnColaSala > 0)
                            {
                                actual.RndFinEntrada     = random.NextDouble();
                                actual.FinEntrada        = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada);
                                actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada;
                                entrante             = actual.Entrada.Dequeue();
                                entrante.Estado      = "entrando";
                                actual.EstadoPortero = "ocupado";
                                actual.LlegadasPortero++;
                            }
                            ingresoASala = true;
                            break;

                        case "inicio_pelicula":
                            resetearCampos();
                            actual.ProximaLlegadaCompra  = -1;
                            actual.ProximaLlegadaEntrada = -1;
                            empezoPelicula = true;
                            foreach (Cliente cliente in actual.Boleteria)
                            {
                                cliente.Estado = "";
                                foreach (Cliente acompañante in cliente.Acompañantes)
                                {
                                    acompañante.Estado = "";
                                }
                            }
                            break;

                        case "inicio_interrupcion":
                            resetearCampos();
                            if (actual.NumeroSimulacion == simMostrar)
                            {
                                actual.TiempoFinInterrupcion = frmRKVaciado.rungeKuttaGraficoVaciado(actual.LlegadasPortero);
                            }
                            else
                            {
                                actual.TiempoFinInterrupcion = frmRKVaciado.rungeKuttaVaciado(actual.LlegadasPortero);
                            }
                            actual.ProximoFinInterrupcion = actual.Reloj + actual.TiempoFinInterrupcion;
                            if (actual.EstadoPortero == "ocupado")
                            {
                                actual.TiempoRestanteEntrada = actual.ProximoFinEntrada - actual.Reloj;
                            }
                            actual.ProximoFinEntrada   = -1;
                            actual.ProximaInterrupcion = -1;
                            actual.PuntoDesborde       = -1;
                            actual.EstadoPortero       = "interrumpido";
                            actual.LlegadasPortero     = 0;
                            break;

                        case "fin_interrupcion":
                            resetearCampos();
                            actual.RndInterrupcion     = random.NextDouble();
                            actual.PuntoDesborde       = desborde(actual.RndInterrupcion);
                            actual.TiempoInterrupcion  = getTiempoInterrupcion(actual.PuntoDesborde);
                            actual.ProximaInterrupcion = actual.Reloj + actual.TiempoInterrupcion;

                            actual.ProximoFinEntrada      = actual.Reloj + actual.TiempoRestanteEntrada;
                            actual.TiempoRestanteEntrada  = 0;
                            actual.ProximoFinInterrupcion = -1;
                            actual.EstadoPortero          = "ocupado";
                            break;
                        }

                        if (actual.NumeroSimulacion == simMostrar)
                        {
                            agregarDatosDGV(actual);

                            agregarClientesDGV(clientes);
                        }
                    }
                    agregarDatosDGVFunciones(actual);
                }
            }
        }
Exemplo n.º 6
0
        private void agregarDatosDGV(VectorEstado actual)
        {
            String numeroSim = actual.NumeroSimulacion.ToString();
            double reloj     = Math.Round(actual.Reloj, 2);
            String evento    = actual.Evento;

            String personasEnColaBoletaria = actual.Boleteria.Count.ToString();
            String personasEnColaSala      = actual.PersonasEnColaSala.ToString();
            String butacasOcupadas         = actual.ButacasOcupadas.ToString();
            String tiempoOcupacionBoletero = Math.Round(actual.TiempoOcupacionBoletero, 2).ToString();
            String estadoBoletero          = actual.Boletero.Estado;
            String entradasVendidas        = actual.EntradasVendidas.ToString();
            String entradasAnticipadas     = actual.EntradasAnticipadas.ToString();
            String porcentajeOcupacion     = Math.Round((((double)actual.TiempoOcupacionBoletero / actual.Reloj) * 100), 2).ToString();



            String rndLlegadaCompra, llegadaCompra, rndNumeroCompra, numeroCompra, rndLlegadaEntrada, llegadaEntrada, rndNumeroEntrada,
                   numeroEntrada, rndFinCompra, finCompra, rndFinEntrada, finEntrada, salaLlena, proximaLlegadaEntrada, proximoFinCompra, proximoFinEntrada,
                   proximaLlegadaCompra, tiempoRestanteEntrada, rndProximaInterrupcion, puntoDesborde, tiempoInterrupcion, tiempoFinInterrupcion
            , proximoFinInterrupcion, proximaInterrupcion, llegadasPortero;

            rndLlegadaCompra          = llegadaCompra = rndNumeroCompra = numeroCompra = rndLlegadaEntrada = llegadaEntrada = rndNumeroEntrada =
                numeroEntrada         = rndFinCompra = finCompra = rndFinEntrada = finEntrada = proximaLlegadaEntrada = proximoFinCompra = proximaLlegadaCompra =
                    proximoFinEntrada = tiempoRestanteEntrada = rndProximaInterrupcion = puntoDesborde = tiempoInterrupcion = tiempoFinInterrupcion
                                                                                                                                  = proximoFinInterrupcion = proximaInterrupcion = llegadasPortero = "";

            if (actual.RndLlegadaCompra != -1)
            {
                rndLlegadaCompra = Math.Round(actual.RndLlegadaCompra, 2).ToString();
            }
            if (actual.LlegadaCompra != -1)
            {
                llegadaCompra = Math.Round(actual.RndLlegadaCompra, 2).ToString();
            }
            if (actual.RndNumeroCompra != -1)
            {
                rndNumeroCompra = Math.Round(actual.RndNumeroCompra, 2).ToString();
            }
            if (actual.NumeroCompra != -1)
            {
                numeroCompra = actual.NumeroCompra.ToString();
            }
            if (actual.RndLlegadaEntrada != -1)
            {
                rndLlegadaEntrada = Math.Round(actual.RndLlegadaEntrada, 2).ToString();
            }
            if (actual.LlegadaEntrada != -1)
            {
                llegadaEntrada = Math.Round(actual.LlegadaEntrada, 2).ToString();
            }
            if (actual.RndNumeroEntrada != -1)
            {
                rndNumeroEntrada = Math.Round(actual.RndNumeroEntrada, 2).ToString();
            }
            if (actual.NumeroEntrada != -1)
            {
                numeroEntrada = actual.NumeroEntrada.ToString();
            }
            if (actual.RndFinCompra != -1)
            {
                rndFinCompra = Math.Round(actual.RndFinCompra, 2).ToString();
            }
            if (actual.FinCompra != -1)
            {
                finCompra = Math.Round(actual.FinCompra, 2).ToString();
            }
            if (actual.RndFinEntrada != -1)
            {
                rndFinEntrada = Math.Round(actual.RndFinEntrada, 2).ToString();
            }
            if (actual.FinEntrada != -1)
            {
                finEntrada = Math.Round(actual.FinEntrada, 2).ToString();
            }
            if (actual.ProximaLlegadaCompra != -1)
            {
                proximaLlegadaCompra = Math.Round(actual.ProximaLlegadaCompra, 2).ToString();
            }
            if (actual.ProximaLlegadaEntrada > 0)
            {
                proximaLlegadaEntrada = Math.Round(actual.ProximaLlegadaEntrada, 2).ToString();
            }
            if (actual.ProximoFinCompra > 0)
            {
                proximoFinCompra = Math.Round(actual.ProximoFinCompra, 2).ToString();
            }
            if (actual.ProximoFinEntrada > 0)
            {
                proximoFinEntrada = Math.Round(actual.ProximoFinEntrada, 2).ToString();
            }
            if (actual.TiempoRestanteEntrada > 0)
            {
                tiempoRestanteEntrada = Math.Round(actual.TiempoRestanteEntrada, 2).ToString();
            }
            if (actual.RndInterrupcion != -1)
            {
                rndProximaInterrupcion = Math.Round(actual.RndInterrupcion, 2).ToString();
            }
            if (actual.PuntoDesborde > 0)
            {
                puntoDesborde = actual.PuntoDesborde.ToString();
            }
            if (actual.TiempoInterrupcion != -1)
            {
                tiempoInterrupcion = Math.Round(actual.TiempoInterrupcion, 2).ToString();
            }
            if (actual.TiempoFinInterrupcion != -1)
            {
                tiempoFinInterrupcion = Math.Round(actual.TiempoFinInterrupcion, 2).ToString();
            }
            if (actual.ProximoFinInterrupcion > 0)
            {
                proximoFinInterrupcion = Math.Round(actual.ProximoFinInterrupcion, 2).ToString();
            }
            if (actual.ProximaInterrupcion > 0)
            {
                proximaInterrupcion = Math.Round(actual.ProximaInterrupcion, 2).ToString();
            }
            if (actual.LlegadasPortero > 0)
            {
                llegadasPortero = actual.LlegadasPortero.ToString();
            }

            if (actual.ButacasOcupadas == tamSala)
            {
                salaLlena = "Si";
            }
            else
            {
                salaLlena = "No";
            }

            dgvFuncion.Rows.Add(numeroSim, evento, reloj, rndLlegadaCompra, llegadaCompra, proximaLlegadaCompra, rndNumeroCompra,
                                numeroCompra, rndLlegadaEntrada, llegadaEntrada, proximaLlegadaEntrada, rndNumeroEntrada, numeroEntrada, estadoBoletero,
                                rndFinCompra, finCompra, proximoFinCompra, rndFinEntrada, finEntrada, tiempoRestanteEntrada, proximoFinEntrada, rndProximaInterrupcion, puntoDesborde
                                , tiempoInterrupcion, proximaInterrupcion, llegadasPortero, tiempoFinInterrupcion, proximoFinInterrupcion, personasEnColaBoletaria, actual.EstadoPortero, personasEnColaSala,
                                entradasVendidas, actual.ButacasOcupadas, salaLlena, tiempoOcupacionBoletero, porcentajeOcupacion, entradasAnticipadas);
        }
Exemplo n.º 7
0
        private VectorEstado calcularPromedioSimulacionDiaria()
        {
            double tiempoLibreCocineros     = 0d;
            double tiempoLibreDelivery      = 0d;
            int    pedidosPerdidos          = 0;
            int    pedidosConCeroIngresos   = 0;
            double montoPedidosPerdidos     = 0;
            int    maxVentasPerdidas        = 0;
            double tiempoEnColas            = 0d;
            double tiempoEntregaDesdePedido = 0d;
            double ingresoConMenosDe250     = 0;
            double valorIngresos            = 0;
            double ingresoDiarioPromedio    = 0;
            double ingresoDiarioDesvio      = 0;

            int cantidadSimulacionesCon5PedidosCaidosOAbandonados = 0;

            foreach (var simulacionIndividual in resultados)
            {
                tiempoLibreCocineros   += simulacionIndividual.cocineros.Sum(x => x.tiempoLibre.TotalMinutes) / (double)simulacionIndividual.cocineros.Count;
                tiempoLibreDelivery    += simulacionIndividual.delivery.tiempoLibre.TotalMinutes;
                pedidosPerdidos        += simulacionIndividual.cantidadPedidosPerdidos;
                pedidosConCeroIngresos += simulacionIndividual.cantidadPedidosCeroIngresos;

                montoPedidosPerdidos += simulacionIndividual.montoPedidosPerdidos;

                if (simulacionIndividual.cantidadPedidosPerdidos > maxVentasPerdidas)
                {
                    maxVentasPerdidas = simulacionIndividual.cantidadPedidosPerdidos;
                }

                tiempoEnColas            += simulacionIndividual.promedioTiempoClientesEnCola.TotalMinutes;
                tiempoEntregaDesdePedido += simulacionIndividual.promedioTiempoEntregaDesdePedido.TotalMinutes;
                ingresoConMenosDe250     += simulacionIndividual.probabilidadIngresoMenosDe250;

                int cantidadPedidosCaidosOAbandonados = simulacionIndividual.pedidosAbandonados + simulacionIndividual.cantidadPedidosCeroIngresos;

                if (cantidadPedidosCaidosOAbandonados >= 5)
                {
                    cantidadSimulacionesCon5PedidosCaidosOAbandonados++;
                }

                valorIngresos += simulacionIndividual.ingresosGeneradosTotal;

                ingresoDiarioPromedio += simulacionIndividual.ingresoPromedioDiario;
                ingresoDiarioDesvio   += simulacionIndividual.ingresoDesvioDiario;
            }

            VectorEstado resultadoSimulacionTotal = new VectorEstado();

            resultadoSimulacionTotal.tiempoPromedioLibreCocineros = TimeSpan.FromMinutes(tiempoLibreCocineros / (double)resultados.Count);
            resultadoSimulacionTotal.tiempoPromedioLibreDelivery  = TimeSpan.FromMinutes(tiempoLibreDelivery / (double)resultados.Count);
            resultadoSimulacionTotal.promedioPedidosPerdidos      = pedidosPerdidos / (double)resultados.Count;
            resultadoSimulacionTotal.cantidadPedidosCeroIngresos  = pedidosConCeroIngresos;

            resultadoSimulacionTotal.montoPedidosPerdidos             = montoPedidosPerdidos;
            resultadoSimulacionTotal.maximoVentasPerdidas             = maxVentasPerdidas;
            resultadoSimulacionTotal.promedioTiempoClientesEnCola     = TimeSpan.FromMinutes(tiempoEnColas / (double)resultados.Count);
            resultadoSimulacionTotal.promedioTiempoEntregaDesdePedido = TimeSpan.FromMinutes(tiempoEntregaDesdePedido / (double)resultados.Count);


            resultadoSimulacionTotal.probabilidadIngresoMenosDe250 = ingresoConMenosDe250 / (double)resultados.Count;

            resultadoSimulacionTotal.probabilidadPedidosCaidosOGratis = cantidadSimulacionesCon5PedidosCaidosOAbandonados / (double)resultados.Count;

            resultadoSimulacionTotal.ingresosGeneradosTotal = valorIngresos;

            resultadoSimulacionTotal.ingresoPromedioDiario = ingresoDiarioPromedio / (double)resultados.Count;
            resultadoSimulacionTotal.ingresoDesvioDiario   = ingresoDiarioDesvio / (double)resultados.Count;


            return(resultadoSimulacionTotal);
        }
Exemplo n.º 8
0
        private void btnIniciarSimulacion_Click(object sender, EventArgs e)
        {
            tomarDatos();

            reiniciarTabla(ref simulacionDiariaDataTable);
            actual   = new VectorEstado();
            anterior = new VectorEstado();

            generarEventoInicial();

            TimeSpan tiempoProximoEvento;
            string   evento = anterior.evento;
            Pedido   pedidoAux;


            while (evento != EVENTO_FIN_DE_SIMULACION)
            {
                actual.productoPedido = "";
                evento = getProximoEvento(out tiempoProximoEvento, out pedidoAux);

                actual.numeroEvento = anterior.numeroEvento + 1;
                actual.reloj        = tiempoProximoEvento;

                if (evento != EVENTO_FIN_DE_SIMULACION)
                {
                    actualizarTiempoLibreServidores();
                }

                verificarPedidosExcedidos();

                switch (evento)
                {
                case EVENTO_LLEGADA_DE_PEDIDO:
                    simularLlegadaDePedido();
                    break;

                case EVENTO_PEDIDO_FINALIZADO:
                    simularPedidoFinalizado(pedidoAux);
                    break;

                case EVENTO_ENTREGA_DE_PEDIDO:
                    simularEntregaDePedido();
                    break;

                case EVENTO_FIN_DE_SIMULACION:
                    actual.evento = evento;
                    actual.reloj  = anterior.reloj;
                    break;

                default:
                    break;
                }

                getPromediosPuntoB();

                // **NOTA: copio los datos de esta manera para trabajar con solo los 2 vectores en memoria y operar con el actual
                anterior.clonar(actual);

                agregarFila(actual, ref simulacionDiariaDataTable);
            }



            mostrarEstadisticas();

            resultados.Add(actual);

            agregarSimulacion(actual);
        }
Exemplo n.º 9
0
        private void agregarFila(VectorEstado actual, ref DataTable tabla)
        {
            string formatoDecimal  = "0.0000";
            string formatoTimeSpan = @"hh\:mm\:ss";

            var fila = tabla.NewRow();

            fila["Numero Evento"]         = actual.numeroEvento;
            fila["Evento"]                = actual.evento;
            fila["Reloj"]                 = actual.reloj.ToString(formatoTimeSpan);
            fila["Tiempo entre llegadas"] = actual.tiempoEntreLlegada.ToString(formatoTimeSpan);
            fila["Proxima Llegada"]       = actual.momentoProximaLlegada.ToString(formatoTimeSpan);
            fila["Cola Pedidos"]          = actual.longitudColaPedido;

            fila["Producto Pedido"] = actual.productoPedido;

            fila["Tiempo de proceso servidor 1"]   = actual.cocineros[2].tiempoProceso.ToString(formatoTimeSpan);
            fila["Momento Fin Proceso servidor 1"] = actual.cocineros[2].finProceso().ToString(formatoTimeSpan);
            fila["Estado Servidor 1"]              = actual.cocineros[2].estadoServidor.ToString();
            fila["Tiempo de proceso servidor 2"]   = actual.cocineros[1].tiempoProceso.ToString(formatoTimeSpan);
            fila["Momento Fin Proceso servidor 2"] = actual.cocineros[1].finProceso().ToString(formatoTimeSpan);
            fila["Estado Servidor 2"]              = actual.cocineros[1].estadoServidor.ToString();
            fila["Tiempo de proceso servidor 3"]   = actual.cocineros[0].tiempoProceso.ToString(formatoTimeSpan);
            fila["Momento Fin Proceso servidor 3"] = actual.cocineros[0].finProceso().ToString(formatoTimeSpan);
            fila["Estado Servidor 3"]              = actual.cocineros[0].estadoServidor.ToString();
            fila["Cola Delivery"]         = actual.longitudColaDelivery;
            fila["Tiempo Entrega"]        = actual.delivery.tiempoProceso.ToString(formatoTimeSpan);
            fila["Momento Entrega"]       = actual.delivery.finProceso().ToString(formatoTimeSpan);
            fila["Estado Delivery"]       = actual.delivery.estadoServidor.ToString();
            fila["Cantidad Sandwiches"]   = actual.sandwichPreparados;
            fila["Cantidad Pizzas"]       = actual.pizzasPreparadas;
            fila["Cantidad Empanadas"]    = actual.empanadasPreparadas;
            fila["Cantidad Lomitos"]      = actual.lomitosPreparados;
            fila["Cantidad Hamburguesas"] = actual.hamburguesasPreparados;

            fila["Tiempo Libre Cocinero 1"] = actual.cocineros[2].tiempoLibre.ToString(formatoTimeSpan);
            fila["Tiempo Libre Cocinero 2"] = actual.cocineros[1].tiempoLibre.ToString(formatoTimeSpan);
            fila["Tiempo Libre Cocinero 3"] = actual.cocineros[0].tiempoLibre.ToString(formatoTimeSpan);

            fila["Tiempo Entre Llegadas Promedio"]   = actual.tiempoEntreLlegadasPromedio.ToString(formatoTimeSpan);
            fila["Tiempo Entre Llegadas Desviacion"] = TimeSpan.FromMinutes(Math.Sqrt(actual.tiempoEntreLlegadasDesviacion.TotalMinutes)).ToString(formatoTimeSpan);

            fila["Tiempo Preparación Sandwich Promedio"]   = actual.tiempoPreparacionDeSandwichPromedio.ToString(formatoTimeSpan);
            fila["Tiempo Preparación Sandwich Desviacion"] = TimeSpan.FromMinutes(Math.Sqrt(actual.tiempoSandwichPreparadosDesviacion)).ToString(formatoTimeSpan);

            fila["Tiempo Preparación Pizza Promedio"]   = actual.tiempoPreparacionDePizzaPromedio.ToString(formatoTimeSpan);
            fila["Tiempo Preparación Pizza Desviacion"] = TimeSpan.FromMinutes(Math.Sqrt(actual.tiempoCoccionPizzaDesviacion)).ToString(formatoTimeSpan);

            fila["Tiempo Cocción Empanadas Promedio"]   = actual.tiempoCoccionEmpanadasPromedio.ToString(formatoTimeSpan);
            fila["Tiempo Cocción Empanadas Desviacion"] = TimeSpan.FromMinutes(Math.Sqrt(actual.tiempoCoccionEmpanadasDesviacion)).ToString(formatoTimeSpan);

            fila["Tiempo de Entrega de Pedidos Promedio"]   = actual.tiempoEntregaPromedio.ToString(formatoTimeSpan);
            fila["Tiempo de Entrega de Pedidos Desviacion"] = TimeSpan.FromMinutes(Math.Sqrt(actual.tiempoEntregaDesviacion.TotalMinutes)).ToString(formatoTimeSpan);

            fila["Probabilidad ingreso < 250"] = actual.probabilidadIngresoMenosDe250.ToString(formatoDecimal);

            fila["Probabilidad pedidos caidos o gratis"] = actual.probabilidadPedidosCaidosOGratis.ToString(formatoDecimal);


            tabla.Rows.Add(fila);
        }
Exemplo n.º 10
0
        private void btnSimular_Click(object sender, EventArgs e)
        {
            dgvFuncion.Rows.Clear();
            limpiarClientes();
            dgvFunciones.Rows.Clear();
            resetearAcumuladores();
            if (validarCampos())
            {
                for (int i = 0; i < numSim; i++)
                {
                    anterior         = new VectorEstado();
                    actual           = new VectorEstado();
                    actual.Reloj     = 0;
                    actual.Evento    = "inicio_simulacion";
                    actual.Boletero  = new Boletero();
                    actual.Boleteria = new Queue <Cliente>();
                    actual.Entrada   = new Queue <Cliente>();


                    Cliente clienteAtendido = new Cliente(0, false);
                    Cliente entrante        = new Cliente(0, false);
                    empezoPelicula        = false;
                    empezoSimulacion      = false;
                    ingresoLlegadaEntrada = false;
                    ingresoASala          = false;

                    List <Cliente> clientes = new List <Cliente>();

                    while (actual.ButacasOcupadas < tamSala && !(actual.PersonasEnColaSala == 0 && empezoPelicula) || actual.Boletero.Estado == "ocupado")
                    {
                        anterior = actual;
                        actual   = new VectorEstado();
                        copiarAnterior();

                        buscarEvento();

                        switch (actual.Evento)
                        {
                        case "inicio_simulacion":
                            resetearCampos();
                            actual.ButacasOcupadas         = 0;
                            actual.NumeroSimulacion        = i + 1;
                            actual.PersonasEnColaSala      = 0;
                            actual.TiempoOcupacionBoletero = 0;
                            actual.RndLlegadaCompra        = random.NextDouble();
                            actual.LlegadaCompra           = aleatorioU(desdeTiempoLlegadaCompra, hastaTiempoLlegadaCompra, actual.RndLlegadaCompra);
                            actual.ProximaLlegadaCompra    = actual.Reloj + actual.LlegadaCompra;
                            empezoSimulacion = true;
                            break;

                        case "llegada_compra":
                            resetearCampos();
                            if (empezoPelicula)
                            {
                                break;
                            }
                            actual.RndLlegadaCompra     = random.NextDouble();
                            actual.LlegadaCompra        = aleatorioU(desdeTiempoLlegadaCompra, hastaTiempoLlegadaCompra, actual.RndLlegadaCompra);
                            actual.ProximaLlegadaCompra = actual.Reloj + actual.LlegadaCompra;

                            actual.RndNumeroCompra = random.NextDouble();
                            actual.NumeroCompra    = aleatorioInt(desdeEntradasComprar, hastaEntradasComprar, actual.RndNumeroCompra);
                            Cliente nuevo = new Cliente(actual.NumeroCompra, false);
                            nuevo.Nombre = "Cliente" + (clientes.Count + 1);
                            clientes.Add(nuevo);

                            for (int m = 0; m < actual.NumeroCompra - 1; m++)
                            {
                                Cliente nuevoAcompañante = new Cliente(actual.NumeroCompra, false);
                                nuevoAcompañante.Nombre = "Cliente" + (clientes.Count + 1);
                                clientes.Add(nuevoAcompañante);
                                nuevo.Acompañantes.Add(nuevoAcompañante);
                            }

                            if (actual.Boletero.Estado == "ocupado")
                            {
                                actual.Boleteria.Enqueue(nuevo);
                            }
                            else
                            {
                                clienteAtendido        = nuevo;
                                clienteAtendido.Estado = "comprando";
                                foreach (Cliente acompañante in clienteAtendido.Acompañantes)
                                {
                                    acompañante.Estado = "acomp_" + clienteAtendido.Nombre;
                                }
                                actual.Boletero.Estado          = "ocupado";
                                actual.Boletero.InicioOcupacion = actual.Reloj;
                                actual.RndFinCompra             = random.NextDouble();
                                actual.FinCompra        = aleatorioU(desdeTiempoCompra, hastaTiempoCompra, actual.RndFinCompra);
                                actual.ProximoFinCompra = actual.Reloj + actual.FinCompra;
                            }

                            break;

                        case "llegada_entrada_anticipada":
                            resetearCampos();
                            if (empezoPelicula)
                            {
                                break;
                            }

                            actual.RndLlegadaEntrada     = random.NextDouble();
                            actual.LlegadaEntrada        = aleatorioU(desdeTiempoLlegadaAnticipada, hastaTiempoLlegadaAnticipada, actual.RndLlegadaEntrada);
                            actual.ProximaLlegadaEntrada = actual.Reloj + actual.LlegadaEntrada;

                            actual.RndNumeroEntrada = random.NextDouble();
                            actual.NumeroEntrada    = aleatorioInt(desdeEntradasAnticipadas, hastaEntradasAnticipadas, actual.RndNumeroEntrada);

                            if (actual.PersonasEnColaSala == 0 && ingresoASala)
                            {
                                actual.RndFinEntrada     = random.NextDouble();
                                actual.FinEntrada        = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada);
                                actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada;
                            }

                            actual.PersonasEnColaSala += actual.NumeroEntrada;

                            actual.EntradasVendidas += actual.NumeroEntrada;

                            actual.EntradasAnticipadas += actual.NumeroEntrada;

                            for (int j = 0; j < actual.NumeroEntrada; j++)
                            {
                                Cliente nuevoAnticipada = new Cliente(actual.NumeroCompra, true);
                                nuevoAnticipada.Nombre = "Cliente" + (clientes.Count + 1);
                                actual.Entrada.Enqueue(nuevoAnticipada);
                                clientes.Add(nuevoAnticipada);
                            }



                            break;

                        case "fin_compra":
                            resetearCampos();
                            if (actual.PersonasEnColaSala == 0 && ingresoASala)
                            {
                                actual.RndFinEntrada     = random.NextDouble();
                                actual.FinEntrada        = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada);
                                actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada;
                            }
                            actual.PersonasEnColaSala += clienteAtendido.NumeroEntradas;
                            actual.EntradasVendidas   += clienteAtendido.NumeroEntradas;
                            clienteAtendido.Estado     = "esperando_entrar";
                            actual.Entrada.Enqueue(clienteAtendido);
                            foreach (Cliente acompañante in clienteAtendido.Acompañantes)
                            {
                                acompañante.Estado = "esperando_entrar";
                                actual.Entrada.Enqueue(acompañante);
                            }

                            actual.TiempoOcupacionBoletero += actual.Reloj - actual.Boletero.InicioOcupacion;

                            if (actual.Boleteria.Count != 0 && !empezoPelicula)
                            {
                                clienteAtendido        = actual.Boleteria.Dequeue();
                                clienteAtendido.Estado = "comprando";
                                foreach (Cliente acompañante in clienteAtendido.Acompañantes)
                                {
                                    acompañante.Estado = "acomp_" + clienteAtendido.Nombre;
                                }
                                actual.RndFinCompra             = random.NextDouble();
                                actual.FinCompra                = aleatorioU(desdeTiempoCompra, hastaTiempoCompra, actual.RndFinCompra);
                                actual.ProximoFinCompra         = actual.Reloj + actual.FinCompra;
                                actual.Boletero.InicioOcupacion = actual.Reloj;
                            }
                            else
                            {
                                actual.Boletero.Estado  = "libre";
                                actual.ProximoFinCompra = -1;
                            }
                            break;

                        case "fin_entrada":
                            resetearCampos();
                            if (actual.ButacasOcupadas < tamSala && actual.PersonasEnColaSala > 0)
                            {
                                entrante.Estado         = "";
                                actual.ButacasOcupadas += 1;
                                entrante                  = actual.Entrada.Dequeue();
                                entrante.Estado           = "entrando";
                                actual.PersonasEnColaSala = actual.Entrada.Count;
                                actual.RndFinEntrada      = random.NextDouble();
                                actual.FinEntrada         = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada);
                                actual.ProximoFinEntrada  = actual.Reloj + actual.FinEntrada;
                            }
                            else
                            {
                                actual.ProximoFinEntrada = -1;
                            }
                            break;

                        case "inicio_llegada_con_entrada":
                            resetearCampos();
                            actual.RndLlegadaEntrada     = random.NextDouble();
                            actual.LlegadaEntrada        = aleatorioU(desdeTiempoLlegadaAnticipada, hastaTiempoLlegadaAnticipada, actual.RndLlegadaEntrada);
                            actual.ProximaLlegadaEntrada = actual.Reloj + actual.LlegadaEntrada;
                            ingresoLlegadaEntrada        = true;
                            break;

                        case "inicio_ingreso_sala":
                            resetearCampos();
                            if (actual.PersonasEnColaSala > 0)
                            {
                                actual.RndFinEntrada     = random.NextDouble();
                                actual.FinEntrada        = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada);
                                actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada;
                                entrante        = actual.Entrada.Dequeue();
                                entrante.Estado = "entrando";
                            }
                            ingresoASala = true;
                            break;

                        case "inicio_pelicula":
                            resetearCampos();
                            actual.ProximaLlegadaCompra  = -1;
                            actual.ProximaLlegadaEntrada = -1;
                            empezoPelicula = true;
                            foreach (Cliente cliente in actual.Boleteria)
                            {
                                cliente.Estado = "";
                                foreach (Cliente acompañante in cliente.Acompañantes)
                                {
                                    acompañante.Estado = "";
                                }
                            }
                            break;
                        }

                        if (actual.NumeroSimulacion == simMostrar)
                        {
                            agregarDatosDGV(actual);

                            agregarClientesDGV(clientes);
                        }
                    }
                    agregarDatosDGVFunciones(actual);
                }
            }
        }