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; }
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); } } }
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) + " %"; }
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; }