miércoles, 22 de septiembre de 2010

Montecarlo

Esta es la ultima libreria aqui les dejo el codigo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Montecarlo
{
    public class montecarloSimulacion
    {
        public string prob1;
        public string prob2;
        public string prob3;
        public string prob4;
        public string prob5;
        public string probac1;
        public string probac2;
        public string probac3;
        public string probac4;
        public string probac5;
        public string intervalo1;
        public string intervalo2;
        public string intervalo3;
        public string intervalo4;
        public string intervalo5;
        public double[] Resultado;
        public string ProbaSimulada;
        public string ProbaEsperada;

        public void realizar(double digitos, double tamanio, double[] numerosaleatorios, double demanda1, double demanda2, double demanda3, double demanda4, double demanda5, double dias1, double dias2, double dias3, double dias4, double dias5)
        {



            string aumentadigitos = "1";
            string inicia = "0";

            for (int i = 2; i < int.Parse(digitos.ToString()); i++)
            {
                aumentadigitos = aumentadigitos + "0";
                inicia = inicia + "0";
            }

            aumentadigitos = aumentadigitos + ".00";
            inicia = inicia + "1";

            double demandado1 = demanda1;
            double demandado2 = demanda2;
            double demandado3 = demanda3;
            double demandado4 = demanda4;
            double demandado5 = demanda5;

            double frecdias1 = dias1;
            double frecdias2 = dias2;
            double frecdias3 = dias3;
            double frecdias4 = dias4;
            double frecdias5 = dias5;

            double totaldias = frecdias1 + frecdias2 + frecdias3 + frecdias4 + frecdias5;
            double acumulada1 = (frecdias1 / totaldias);
            double acumulada2 = (frecdias2 / totaldias);
            double acumulada3 = (frecdias3 / totaldias);
            double acumulada4 = (frecdias4 / totaldias);
            double acumulada5 = (frecdias5 / totaldias);

            double promedioReal = (demandado1 * acumulada1) + (demandado2 * acumulada2) + (demandado3 * acumulada3) + (demandado4 * acumulada4) + (demandado5 * acumulada5);

            prob1 = acumulada1.ToString(".##");
            prob2 = acumulada2.ToString(".##");
            prob3 = acumulada3.ToString(".##");
            prob4 = acumulada4.ToString(".##");
            prob5 = acumulada5.ToString(".##");

            probac1 = acumulada1.ToString(".##");
            probac2 = (acumulada1 + acumulada2).ToString(".##");
            probac3 = (acumulada1 + acumulada2 + acumulada3).ToString(".##");
            probac4 = (acumulada1 + acumulada2 + acumulada3 + acumulada4).ToString(".##");
            probac5 = (acumulada1 + acumulada2 + acumulada3 + acumulada4 + acumulada5).ToString(".##") + ".00";

            intervalo1 = inicia + " - " + ((double.Parse(probac1) * 100.00) * (double.Parse(aumentadigitos))).ToString();

            intervalo2 = ((((double.Parse(probac1) * 100.00)) * (double.Parse(aumentadigitos))) + 1).ToString() + " - " + ((double.Parse(probac2) * 100.00) * (double.Parse(aumentadigitos))).ToString();
            intervalo3 = ((((double.Parse(probac2) * 100.00)) * (double.Parse(aumentadigitos))) + 1).ToString() + " - " + ((double.Parse(probac3) * 100.00) * (double.Parse(aumentadigitos))).ToString();
            intervalo4 = ((((double.Parse(probac3) * 100.00)) * (double.Parse(aumentadigitos))) + 1).ToString() + " - " + ((double.Parse(probac4) * 100.00) * (double.Parse(aumentadigitos))).ToString();
            intervalo5 = ((((double.Parse(probac4) * 100.00)) * (double.Parse(aumentadigitos))) + 1).ToString() + " - " + (100.00 * (double.Parse(aumentadigitos))).ToString();

            double a1 = ((double.Parse(probac1) * 100.00) * (double.Parse(aumentadigitos)));
            double a2 = ((double.Parse(probac2) * 100.00) * (double.Parse(aumentadigitos)));
            double a3 = ((double.Parse(probac3) * 100.00) * (double.Parse(aumentadigitos)));
            double a4 = ((double.Parse(probac4) * 100.00) * (double.Parse(aumentadigitos)));
            double a5 = (100.00 * (double.Parse(aumentadigitos)));


            Resultado = new double[int.Parse(tamanio.ToString())];
            double promedio = 0.00;


            for (int i = 0; i < int.Parse(tamanio.ToString()); i++)
            {
                if (numerosaleatorios[i] > 1 && numerosaleatorios[i] <= a1)
                {
                    Resultado[i] = demandado1;
                }
                else
                    if (numerosaleatorios[i] > a1 && numerosaleatorios[i] <= a2)
                    {

                        Resultado[i] = demandado2;
                    }
                    else
                        if (numerosaleatorios[i] > a2 && numerosaleatorios[i] <= a3)
                        {
                            Resultado[i] = demandado3;
                        }
                        else
                            if (numerosaleatorios[i] > a3 && numerosaleatorios[i] <= a4)
                            {
                                Resultado[i] = demandado4;
                            }
                            else
                                if (numerosaleatorios[i] > a4 && numerosaleatorios[i] <= a5)
                                {
                                    Resultado[i] = demandado5;
                                }
                                else { }
                promedio = promedio + Resultado[i];
            }

            promedio = promedio / int.Parse(tamanio.ToString());
            ProbaSimulada = promedio.ToString(".####");
            ProbaEsperada = promedioReal.ToString(".####");



        }


    }
}



con esto acabamos por completo toda la simulacion de montecarlo
espero que les sea de utilidad para sus programas

saludos


Tabla Z

Para la libreria de tabla z hay muchas formas de hacerla esta es una forma simplepero muy larga asi que solo dejo un ejemplo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TablaZ
{

    public class ztabla
    {
        public double z;

        double alfa;
        public void PruebaZ(double alfaEntrante)
        {
            alfaEntrante = alafaEntrante / 100.00;
            alfaEntrante = alafaEntrante / 2.0;
            string dejar4digitos = alafaEntrante.ToString("#.####");
                alfaEntrante = double.Parse(dejar4digitos);
                alfaEntrante = 1.0 - alfaEntrante;

                 alfa = alfaEntrante;


                if (alfa >= 0.5000 && alfa < 0.5040)
                {
                    z = 0.00;
                }
                else
                    if (alfa >= 0.5040 && alfa < 0.5080)
                    {
                        z = 0.01;
                    }
                    else
                        if (alfa >= 0.5080 && alfa < 0.5120)
                        {
                            z = 0.02;
                        }
                        else
                            if (alfa >= 0.5120 && alfa < 0.5160)
                            {
                                z = 0.03;
                            }
                            else


el resto seria seguir con los demas if  comparando cada uno de los valores de la tabla z

Validacion de numeros Aleatorios por Corridas Arriba y Abajo del promedio

Bueno este es el codigo de la segunda libreria
tampoco es nada complicado solo se hacen las operaciones del metodo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Corridas
{
    public class corridasArribaAbajo
    {
        public string transformacion;
        public double ceros;
        public double unos;
        public double totalcorridas;
        public double esperado;
        public double varianza;
        public double estadistico;
        public double media;

        public void validar(double tamanio, double[] numeros)
        {
            double totalnum = tamanio;
            double sumatotal = 0;
            double[] corridas = new double[int.Parse(totalnum.ToString())];

            for (int i = 0; i < totalnum; i++)//suma los numeros aleatorios para sacar el promedio
            {
                total = total + numeros[i];
            }

            media = double.Parse(total.ToString()) / double.Parse(totalnum.ToString());
            string med = media.ToString();

            for (int i = 0; i < totalnum; i++)//aqui transformamos los numeros en 0 y 1
            {
                if (numeros[i] > media)
                {
                    corridas[i] = 0.00;
                }
                else
                {
                    corridas[i] = 1.00;
                }
            }
            string numcorridas = ""; //guardara los 0 y 1
            for (int i = 0; i < totalnum; i++)
            {
                numcorridas = numcorridas + corridas[i].ToString();
            }

            transformacion = numcorridas;
            numcorridas = numcorridas + "X";
           
            unos = 0.00;
            ceros = 0.00;
           
            totalcorridas = 0.00;

            for (int i = 0; i < numcorridas.Count(); i++)//este ciclo cuenta cuantos 0 y cuantos unos hay
            {
                if (numcorridas[i] == '0')
                {
                    ceros += 1.00;
                }
                else
                    if (numcorridas[i] == '1')
                    {
                        unos += 1.00;
                    }
                   
                if (numcorridas[i] == '0' || numcorridas[i] == '1')
                {
                    if (numcorridas[i] != numcorridas[i + 1])
                    {
                      totalcorridas += 1.00;
                    }
                   
                }
                else { }
                double totalnumcorrida = ceros + unos;
                esperado = ((2.00 * ceros * unos) /totalnumcorrida) + (1.00 / 2.00);
                varianza = (((2.00 * ceros * unos * ((2.00 * ceros * unos) - totalnumcorrida))) / ((totalnumcorrida * totalnumcorrida) * (totalnumcorrida - 1.00)));
                estadistico = (totalcorridas - esperado) / varianza;


            }

        }
    }
}

Generar Numeros Pseudoaleatorios por metodo de Cuadrado Medio

Bien Ahora veremos como funciona cada libreria
que como sabemos no es mas que un programa normal el cual podemos implementar en otros programas como veran el algoritmo para generar los numeos no es nada complicado

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CuadradoMedio //este es el nombre de la libreria o el nombre del proyecto
{
    public class cuadradoM //es la clase principal de el programa
    {
        public double[] numeros; // Este arreglo es el que enviaremos de regreso con los numeros
        public double[] cuadrado; //Este arreglo son los numeros generados al cuadrado
        public string[] completo;  //Arreglo con los numeros completos si les faltaba un 0
        public string[] central;   /los numeros del numcentro

        public void Generar(double digitosE, double total, double inicialE)//aqui esta el metodo al que le enviamos los datos del post pasado
        {

            double totalnum = total;
            double digitos = digitosE;
           double inicial = inicialE;
             numeros = new double[int.Parse(totalnum.ToString()) + 1];
            cuadrado = new double[int.Parse(totalnum.ToString())];
            completo = new string[int.Parse(totalnum.ToString())];
            central = new string[int.Parse(totalnum.ToString())];

            string numero;
            numeros[0] = inicial;


            for (int i = 1; i <= totalnum; i++)//aqui implementamos el metodo de cuadrado medio
            {
                inicial = Math.Pow(inicial,2);
                cuadrado[i - 1] = inicial;

                double equilibrado = (inicial.ToString().Count()) - digitos; //asi sabremos si no faltan 0
                double eliminarlugares;
                if (equilibrado % 2 == 0)
                {
                    numero = inicial.ToString();
                    eliminarlugares = equilibrado / 2;
                    completo[i - 1] = numero;

                }
                else
                {
                    numero = "0" + inicial.ToString();
                    eliminarlugares = (equilibrado + 1) / 2;
                    completo[i - 1] = numero;
                }

                string numcentro = "X"; //esta cadena ocupara los lugares que no necesitamos
                for (int h = 0; h < numero.Count(); h++)
                {

                    if (h < eliminarlugares)
                    {
                        numcentro = numcentro + "X";
                    }
                    else
                        if (h >= (eliminarlugares + digitos))
                        {
                            numcentro = numcentro + "X";
                        }
                        else
                            numcentro = numcentro + numero[h].ToString();

                }
               numcentro=numcentro.Replase("X",""); //aqui cambiamos las X por lugares vacios
                central[i - 1] = numcentro;
                numeros[i] = double.Parse(numcentro);//aqui se van guardando los numeros aleatorios
                inicial = double.Parse(numcentro);
            }
        }

    }

}

martes, 21 de septiembre de 2010

Librerias para realizar la simulacion montecarlo


Esta vez programaremos la simulacion del metodo de montecarlo
utilizando unas librerias para visual studio.
al final del post les paso el link para descargarlas

Solo les pondre como se implementan las librerias para que ustedes hagan el resto

para empezar primero hay que importar las librerias a nuestro proyecto
damos click derecho en Referencias y seleccionamos añadir nueva referencia
despues buscamos en la pestaña de examinar las 4 librerias y asi ya las tendremos agregadas al proyecto.

pero para poder usarlas hay que agregar la referencia a cada una de la siguiente forma
al inicio del codigo de la forma añadimos a las ya existentes

using CuadradoMedio;  //libreria
using Corridas; //libreria
using TablaZ;//libreria
using Montecarlo;//libreria

nota(estas librerias no son nativas de visual studio yo las programe por eso necesitan importarlas)

despues pasaremos a usar la primera libreria CuadradoMedio para generar los numeros aleatorios

cuadradoM metodo = new cuadradoM();          

esta linea  inicialisa la clase de la primer libreria

metodo.Generar(digitos, cantidad, semilla);     

y esta usa el metodo de la libreria1 para generar los numeros y hay que pasarle 3 variables que deben ser de tipo double  estas deben ser el tamaño de digitos de la semilla, cuantos numero quiere generar

y el valor de la semilla. Esto nos generara un arreglo en la libreria y para usarlo hay que poner esta linea
metodo.numeros[];  asi podemos meterlo en un ciclo y copiar sus valores a otro arreglo que este en el proyecto

ahora para usar la segunda libreria que es de validar que los numeros sean aleatorios usando la prueba de corridas arriba y abajo de la media hay que hacer lo siguiente:

 corridasArribaAbajo corridas = new corridasArribaAbajo(); 
 corridas.validar(cantidad, numerosAleatorios);

a esta hay que enviarle la cantidad de numeros que se generaron en double
y el arreglo double de numeros generados
y esta libreria hara la prueba y de ella podremos sacar los siguientes datos:
todos son de tipo double a excepcion de transformacion que es string

corridas.media                        //el promedio de los numeros generados
corridas.totalcorridas            //cuantas corridas hubo
corridas.ceros                       //total de ceros
corridas.unos                       //total de unos
corridas.esperado                //valor esperado
corridas.estadistico             //valor estadistico
corridas.varianza                //valor de la varianza
corridas.transformacion;       //los numeros aleatorios convertidos a ceros o unos

La siguiente libreria es para  obtener los datos de la tabla z

                ztabla tabla = new ztabla();

                tabla.PruebaZ(enviaralfa);
  a esta libreria debemos enviarle el porcentaje de alfa  en tipo double
y podremos sacar de esta el valor de z de la siguiente forma;

tabla.z;

Para finalizar utilizamos la ultima libreria montecarlo

 montecarloSimulacion montecarlo = new montecarloSimulacion();                montecarlo.realizar(digitos, cantidad, numerosAleatorios, d1, d2, d3, d4, d5, f1, f2, f3, f4, f5);

todos los datos que se envian a esta libreria son de tipo double
la cantidad de digitos de la semilla, el arreglo de numeros aleatorios, la demanda1, 2,3,4y 5 asi como los dias de observacion 1,2,3,4y 5

             y esta nos dara los siguientes valores que podemos utilizarlos como queramos de la sig forma recordando que todos son doubles:

montecarlo.prob1;        //probabilidad de ocurrencia 1
montecarlo.prob2;
montecarlo.prob3;
montecarlo.prob4;
montecarlo.prob5;
                                        //probabilidad de ocurrencia acumulada
montecarlo.probac1;
 montecarlo.probac2;
montecarlo.probac3;
montecarlo.probac4;
montecarlo.probac5;
                                     //intervalos
montecarlo.intervalo1;
 montecarlo.intervalo2;
 montecarlo.intervalo3;
 montecarlo.intervalo4;
montecarlo.intervalo5;



 //arreglo double con la demanda de cada numero que se genero(estan en la misma posicion)
Resultado[];
               //probabilidad Simulada con los numeros aleatorios
montecarlo.ProbaSimulada;
//probabilidad de los datos que ingreso (la real)
montecarlo.ProbaEsperada;



y eso seria todo

aqui les dejo las librerias
http://www.mediafire.com/?ue49sayb4d765vv

la contraseña es APTX4869