コード例 #1
0
        private void calcular()
        {
            getValores();

            progressBar1.Minimum = 0;
            progressBar1.Maximum = cantDiasSimular;

            grdSimulacion.DataSource = null;

            congruencialUltimaSemilla = null;

            List <VectorEstado> diasSimulados = new List <VectorEstado>();

            tabPrincipal.SelectedTab = tabResultado;

            // Configuro el dia 0
            actual                   = new VectorEstado();
            actual.NroDia            = 0;
            actual.CorrespondeCompra = false;
            actual.StockFinal        = (Double)cantFrascosCompra * gramosPorFrasco; // Suponemos comienza con stock de 2 latas de cafe

            diasSimulados.Add(actual);

            for (int nroDiaSimulado = 1; nroDiaSimulado <= cantDiasSimular; nroDiaSimulado++)
            {
                simularDia(nroDiaSimulado);

                if (!chkMostrarSolo10.Checked)
                {
                    if (nroDiaSimulado % 10000 == 0 || (chk50DiasAPartirDe.Checked && nroDiaSimulado >= int.Parse(txt50DiasAPartirDe.Text) && nroDiaSimulado < (int.Parse(txt50DiasAPartirDe.Text) + 50)))
                    {
                        diasSimulados.Add(actual);

                        lblSimulacionesGeneradas.Text = "Simulaciones Generadas: " + nroDiaSimulado.ToString() + "/" + cantDiasSimular;

                        progressBar1.Value = nroDiaSimulado;

                        Application.DoEvents();
                    }
                }
                else
                {
                    diasSimulados.Add(actual);

                    lblSimulacionesGeneradas.Text = "Simulaciones Generadas: " + nroDiaSimulado.ToString() + "/" + cantDiasSimular;

                    progressBar1.Value = nroDiaSimulado;

                    Application.DoEvents();
                }
            }


            cargarEnTabla(diasSimulados);

            cargarResumen(actual);

            grdSimulacion.FirstDisplayedScrollingRowIndex = grdSimulacion.RowCount - 1;
        }
コード例 #2
0
 private void btnSimular_Click(object sender, EventArgs e)
 {
     if (validarCampos())
     {
         dgvPeriodicos.Rows.Clear();
         VectorEstado anterior = new VectorEstado();
         VectorEstado actual   = new VectorEstado();
         VectorEstado aux;
         actual.Reloj            = 0;
         actual.Demanda          = 20;
         actual.Pedido           = 17;
         actual.VentasRealizadas = 17;
         actual.VentasPerdidas   = 3;
         actual.AcumuladorCostos = 0;
         for (int i = 0; i < Convert.ToInt64(txtDias.Text); i++)
         {
             aux                     = anterior;
             anterior                = actual;
             actual                  = aux;
             actual.Reloj            = anterior.Reloj + 1;
             actual.AleatorioDemanda = Math.Round(random.NextDouble(), 2);
             actual.Demanda          = calcularDemanda(actual.AleatorioDemanda);
             estrategia.calcularCantidadPedidos(anterior, actual);
             if (actual.Pedido < actual.Demanda)
             {
                 actual.Stock            = 0;
                 actual.VentasRealizadas = actual.Pedido;
                 actual.VentasPerdidas   = actual.Demanda - actual.Pedido;
                 actual.CostoFaltante    = actual.VentasPerdidas * 0.4;
             }
             else
             {
                 actual.Stock            = actual.Pedido - actual.Demanda;
                 actual.VentasRealizadas = actual.Demanda;
                 actual.VentasPerdidas   = 0;
                 actual.CostoFaltante    = 0;
             }
             actual.GananciaReventa  = actual.Stock * 0.2;
             actual.CostoPeriodicos  = 0.8 * actual.Pedido;
             actual.CostoTotal       = actual.CostoPeriodicos + actual.CostoFaltante - actual.GananciaReventa;
             actual.AcumuladorCostos = Math.Round(anterior.AcumuladorCostos + actual.CostoTotal, 2);
             actual.CostoPromedio    = Math.Round(actual.AcumuladorCostos / actual.Reloj, 2);
             if (i >= Convert.ToInt32(txtMostrarDesde.Text) - 1 && i + 1 < Convert.ToInt32(txtMostrarDesde.Text) + Convert.ToInt32(txtCantidadMostrar.Text))
             {
                 dgvPeriodicos.Rows.Add(actual.Reloj, actual.AleatorioDemanda, actual.Demanda, actual.Pedido, actual.Stock, actual.VentasRealizadas, actual.VentasPerdidas, actual.CostoPeriodicos, actual.CostoFaltante, actual.GananciaReventa, actual.CostoTotal, actual.AcumuladorCostos, actual.CostoPromedio);
             }
         }
         if (diasAMostrar + diasDesde <= diasASimular)
         {
             dgvPeriodicos.Rows.Add(actual.Reloj, actual.AleatorioDemanda, actual.Demanda, actual.Pedido, actual.Stock, actual.VentasRealizadas, actual.VentasPerdidas, actual.CostoPeriodicos, actual.CostoFaltante, actual.GananciaReventa, actual.CostoTotal, actual.AcumuladorCostos, actual.CostoPromedio);
         }
     }
 }
コード例 #3
0
        private void cargarResumen(VectorEstado actual)
        {
            string formatoDecimal = "0.0000";

            lblContribucionPromedio.Text         = "$ " + actual.ContribucionDiariaPromedio.ToString(formatoDecimal);
            lblDemandaNoAbastecidaPromedio.Text  = actual.DemandaNoAbastecidaPromedio.ToString(formatoDecimal) + " g";
            lblIngresioDiarioPromedio.Text       = "$ " + actual.IngresoDiarioPromedio.ToString(formatoDecimal);
            lblPorcentajeConFaltanteDeStock.Text = actual.PorcentajeDiasConFaltanteStock.ToString(formatoDecimal) + " días";
            lblPorcentajeSinFaltanteDeStock.Text = actual.PorcentajeDiasSinFaltanteStock.ToString(formatoDecimal) + " días";
            lblPromedioHorasPerdidas.Text        = actual.HorasPerdidasPromedio.ToString(formatoDecimal) + " Hs";
            lblPorcentaje2Frascos.Text           = (actual.PorcentajeDiasConHasta2Frascos * 100).ToString(formatoDecimal) + " %";
            lblPorcentaje2y5Frascos.Text         = (actual.PorcentajeDiasConMasDe2Hasta5Frascos * 100).ToString(formatoDecimal) + " %";
            lblPorcentaje5y8Frascos.Text         = (actual.PorcentajeDiasConMasDe5Hasta8Frascos * 100).ToString(formatoDecimal) + " %";
            lblPorcentajeMasDe8Frascos.Text      = (actual.PorcentajeDiasConMasDe8Frascos * 100).ToString(formatoDecimal) + " %";
        }
コード例 #4
0
        private void simularDia(int nroDiaSimulado)
        {
            String tipoDemandaTurnoManana;

            //
            anterior = actual;
            actual   = new VectorEstado();

            actual.NroDia = nroDiaSimulado;
            //
            actual.StockInicial = anterior.StockFinal;
            //
            actual.CantDiasConHasta2Frascos       = anterior.CantDiasConHasta2Frascos;
            actual.CantDiasConMasDe2Hasta5Frascos = anterior.CantDiasConMasDe2Hasta5Frascos;
            actual.CantDiasConMasDe5Hasta8Frascos = anterior.CantDiasConMasDe5Hasta8Frascos;
            actual.CantDiasConMasDe8Frascos       = anterior.CantDiasConMasDe8Frascos;
            //
            actual.CantDiasConFaltanteStock = anterior.CantDiasConFaltanteStock;

            // Controlo si hoy llega una compra
            if (nroDiaSimulado == anterior.NroDiaLlegadaCompra)
            {
                actual.StockInicial += (Double)cantFrascosCompra * gramosPorFrasco;
            }
            actual.NroDiaLlegadaCompra = anterior.NroDiaLlegadaCompra;

            if (hoyCorrespondeComprar(nroDiaSimulado))
            {
                actual.CorrespondeCompra      = true;
                actual.NroRandomLlegadaCompra = getNroRandom();
                actual.NroDiaLlegadaCompra    = actual.NroDia + getCantDiasParaLlegadaCompra(actual.NroRandomLlegadaCompra);
                // Puede pasar que hoy llegue una compra anterior y ademas se hace otra compra que llega  inmediatamente
                if (nroDiaSimulado == actual.NroDiaLlegadaCompra)
                {
                    actual.StockInicial += (Double)cantFrascosCompra * gramosPorFrasco;
                }
                //actual.NroDiaLlegadaCompra = anterior.NroDiaLlegadaCompra;
            }

            // Calculo de la demanda del dia
            // Turno Mañana
            actual.NroRandomDemandaTurnoManana1 = getNroRandom();
            tipoDemandaTurnoManana = getTipoDemandaTurnoManana(actual.NroRandomDemandaTurnoManana1);
            if (tipoDemandaTurnoManana.Equals("FIJA"))
            {
                actual.DemandaTurnoManana = getDemandaTurnoMananaFija();
            }
            else if (tipoDemandaTurnoManana.Equals("DISTRIBUCION_NORMAL"))
            {
                actual.NroRandomDemandaTurnoManana2 = getNroRandom();
                actual.NroRandomDemandaTurnoManana3 = getNroRandom();
                actual.DemandaTurnoManana           = getDemandaTurnoMananaDistriNormal(actual.NroRandomDemandaTurnoManana2, actual.NroRandomDemandaTurnoManana3);
            }
            // Turno Tarde
            actual.NroRandomDemandaTurnoTarde = getNroRandom();
            actual.DemandaTurnoTarde          = getDemandaTurnoTarde(actual.NroRandomDemandaTurnoTarde);
            // Demanda Diaria
            actual.DemandaDiaria = actual.DemandaTurnoManana + actual.DemandaTurnoTarde;

            // Venta diaria
            // Caso se demanda mas de lo que hay en stock => demanda total insatisfecha
            if (actual.DemandaDiaria > actual.StockInicial)
            {
                actual.VentaDiaria         = actual.StockInicial;
                actual.StockFinal          = 0d;
                actual.DemandaNoAbastecida = actual.DemandaDiaria - actual.StockInicial;
                actual.CantDiasConFaltanteStock++;
            }
            // Caso se demanda menos de lo que hay en stock => demanda total satisfecha
            else
            {
                actual.VentaDiaria         = actual.DemandaDiaria;
                actual.StockFinal          = actual.StockInicial - actual.DemandaDiaria;
                actual.DemandaNoAbastecida = 0d;
            }

            // Hay una capacidad máxima de almacenamiento de 10 frascos al final del día. Los
            // demás se tiran o regalan a los clientes.
            if (actual.StockFinal > (Double)cantMaximaFrascosEnStock * gramosPorFrasco)
            {
                actual.StockFinal = (Double)cantMaximaFrascosEnStock * gramosPorFrasco;
            }

            // Punto 4
            // Ingreso diario
            actual.IngresoDiario      = actual.VentaDiaria * importeVentaGramo;
            actual.ContribucionDiaria = actual.IngresoDiario - (actual.VentaDiaria * importeCostoGramo);

            // Punto 7
            // Cantidad de dias con x cantidad de frascos en stock. Como el enunciador no aclaraba
            // consideramos el stock al final del dia. Luego los porcentajes se calcularian diviendo
            // la cantidad de las variables acumuladoras sobre la cantidad de dias simulados.
            if (actual.StockFinal / gramosPorFrasco <= 2d)
            {
                actual.CantDiasConHasta2Frascos++;
            }
            else if (2d < actual.StockFinal / gramosPorFrasco && actual.StockFinal / gramosPorFrasco <= 5d)
            {
                actual.CantDiasConMasDe2Hasta5Frascos++;
            }
            else if (5d < actual.StockFinal / gramosPorFrasco && actual.StockFinal / gramosPorFrasco <= 8d)
            {
                actual.CantDiasConMasDe5Hasta8Frascos++;
            }
            else if (8d < actual.StockFinal / gramosPorFrasco)
            {
                actual.CantDiasConMasDe8Frascos++;
            }
            actual.PorcentajeDiasConHasta2Frascos       = (Double)actual.CantDiasConHasta2Frascos / (Double)actual.NroDia;
            actual.PorcentajeDiasConMasDe2Hasta5Frascos = (Double)actual.CantDiasConMasDe2Hasta5Frascos / (Double)actual.NroDia;
            actual.PorcentajeDiasConMasDe5Hasta8Frascos = (Double)actual.CantDiasConMasDe5Hasta8Frascos / (Double)actual.NroDia;
            actual.PorcentajeDiasConMasDe8Frascos       = (Double)actual.CantDiasConMasDe8Frascos / (Double)actual.NroDia;
            // Punto 6
            actual.PorcentajeDiasConFaltanteStock = (Double)actual.CantDiasConFaltanteStock / (Double)actual.NroDia;
            // Punto 9. Porcentaje de dias que terminal con stock final != 0
            actual.PorcentajeDiasSinFaltanteStock = (Double)(actual.NroDia - actual.CantDiasConFaltanteStock) / (Double)actual.NroDia;

            // Punto 2. Stock final promedio diario
            actual.StockFinalPromedio = ((anterior.StockFinalPromedio * anterior.NroDia) + actual.StockFinal) / actual.NroDia;
            // Punto 3. Demanda faltante promedio diaria
            actual.DemandaNoAbastecidaPromedio = ((anterior.DemandaNoAbastecidaPromedio * anterior.NroDia) + actual.DemandaNoAbastecida) / actual.NroDia;
            // Punto 4. Ingreso promedio diario
            actual.IngresoDiarioPromedio = ((anterior.IngresoDiarioPromedio * anterior.NroDia) + actual.IngresoDiario) / actual.NroDia;
            // Punto 5. contribución promedio diaria.
            actual.ContribucionDiariaPromedio = ((anterior.ContribucionDiariaPromedio * anterior.NroDia) + actual.ContribucionDiaria) / actual.NroDia;
            // Punto 8. Promedio de cuantas horas se perdieron si se considera que cada turno es de 8 horas y el porcentaje
            // de café faltante es la proporción al a las horas perdidas del cibercafé.
            actual.HorasPerdidasPromedio =
                (
                    (anterior.HorasPerdidasPromedio * (Double)anterior.NroDia) +
                    ((actual.DemandaDiaria != 0d ? actual.DemandaNoAbastecida / actual.DemandaDiaria : 0d) * (cantHorasTurnoManana + cantHorasTurnoTarde))) / actual.NroDia;
        }