private void Simular() { try { if (!ValidarFormulario()) { return; } long simulaciones = Simulaciones(); LimpiarGrilla(); IniciarProceso(); var acumuladorExitos = new TotalAcumulado(); int mostrarDesde = FilaDesde(); int cantidadAMostrar = CantidadFilas(); Cronometro cronometro = new Cronometro(); cronometro.Iniciar(); int exp; for (exp = 1; exp <= simulaciones; exp++) { var semanas = new List <int>(); var randomA = _tiempoActividadA.ObtenerValorConRandomAsociado(); semanas.Add((int)randomA.Valor); var randomB = _tiempoActividadB.ObtenerValorConRandomAsociado(); semanas.Add((int)randomB.Valor); var randomC = _tiempoActividadC.ObtenerValorConRandomAsociado(); semanas.Add((int)randomC.Valor); var randomD = _tiempoActividadD.ObtenerValorConRandomAsociado(); semanas.Add((int)randomD.Valor); int totalSemanas = semanas.Sum(); if (CumpleTiempoBuscado(totalSemanas)) { acumuladorExitos.CalcularSiguiente(1); } //Tabla if (mostrarDesde <= exp && exp < mostrarDesde + cantidadAMostrar) { dgDatos.Rows.Add(exp, Math.Round(randomA.Random, _decimales), randomA.Valor, Math.Round(randomB.Random, _decimales), randomB.Valor, Math.Round(randomC.Random, _decimales), randomC.Valor, Math.Round(randomD.Random, _decimales), randomD.Valor, totalSemanas, acumuladorExitos.Total); } Application.DoEvents(); if (!EnProceso()) { break; } } CortarProceso(); cronometro.Finalizar(); if (_mostrarTiempo) { Mensaje(cronometro.TiempoTranscurrido().ToString("h'h 'm'm 's's'"), "Tiempo transcurrido"); } var probabilidad = exp / acumuladorExitos.Total; txtProbabilidad.Text = Math.Round(probabilidad, _decimales).ToString(); } catch (Exception e) { MensajeError(e.Message); } }
private void SimularC() { const string estrategia = "Estrategia C"; Limpiar(estrategia); // Pedir la demanda promedio de los últimos 10 días cada 10 días var acumuladorCantidadAPedir = new PromedioCantidadFija(10); const int diasEntrePedidos = 10; var stock = int.Parse(txt_stock_inicial.Text); var precioAlmacenamiento = Math.Round(double.Parse(txt_costo_alm.Text), Decimales) * 10; var precioFaltante = Math.Round(double.Parse(txt_costo_falt.Text), Decimales) * 10; var simulaciones = int.Parse(txt_cant_iteraciones.Text); var mostrarDesde = int.Parse(txt_mostrar_desde.Text); var cantidadAMostrar = int.Parse(txt_mostrar_cant.Text); var acumuladorTotalCosto = new TotalAcumulado(); var acumuladorPromedioCosto = new PromedioAcumulado(); var diasProximoPedido = diasEntrePedidos; var demora = 0; var cantidadAPedir = 0; double costoPromedio = 0; for (var dia = 1; dia <= simulaciones; dia++) { //Pedido diasProximoPedido = diasProximoPedido > 0 ? diasProximoPedido - 1 : diasEntrePedidos - 1; demora = demora > 0 ? demora - 1 : diasProximoPedido == 0 ? (int)_demora.ObtenerValor() : -1; var demanda = (int)_demanda.ObtenerValor(); var cantidad = (int)acumuladorCantidadAPedir.CalcularSiguiente(demanda); if (diasProximoPedido == 0) { cantidadAPedir = cantidad; } var pedido = demora == 0 ? cantidadAPedir : 0; stock += pedido; //Ventas var ventas = Math.Min(demanda, stock); stock -= ventas; //Costos var costoPedido = diasProximoPedido == 0 ? Math.Round(CostoPedido.ObtenerCosto(cantidadAPedir), Decimales) : 0; var costoFaltante = Math.Round((demanda - ventas) * precioFaltante, Decimales); var costoAlmacenamiento = Math.Round(stock * precioAlmacenamiento, Decimales); var costoTotal = Math.Round(costoFaltante + costoAlmacenamiento + costoPedido, Decimales); var costoAcumulado = Math.Round(acumuladorTotalCosto.CalcularSiguiente(costoTotal), Decimales); costoPromedio = Math.Round(acumuladorPromedioCosto.CalcularSiguiente(costoTotal), Decimales); //Tabla if (mostrarDesde <= dia && dia < mostrarDesde + cantidadAMostrar) { tb_simulaciones.Rows.Add(dia, demanda, ventas, stock, costoAlmacenamiento, costoFaltante, costoPedido, costoTotal, costoAcumulado, costoPromedio, diasProximoPedido, demora, pedido); } //Gráfico graph.Series[estrategia].Points.Add(new DataPoint(dia, costoPromedio)); } //Resultado txt_res_C.Text = costoPromedio.ToString(); HabilitarComparacion(); }