コード例 #1
0
ファイル: Principal.cs プロジェクト: chinocrespin/SIM2018
        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);
            }
        }
コード例 #2
0
        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();
        }