CALCULO RÁPIDO DE TODOS LOS PREMIOS

Algoritmos, fórmulas, estadísticas...
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

CALCULO RÁPIDO DE TODOS LOS PREMIOS

Mensaje por JoanD »

CALCULO RÁPIDO DE TODOS LOS PREMIOS
geriflu escribió: Sigo pensando que debe ser posible optimizar toda la parte del cálculo de premios es decir, la parte en la que cada columna se usa como cromosoma inicial y se analiza a la profundidad predeterminada por la categoría de premios que queremos estudiar. En concreto no parece descabellado poder calcular las probabilidades apostadas de una columna sin tener que analizar todas las ramificaciones. Por ejemplo para el cromosoma inicial calculamos la probabilidad apostada recorriendo los 14 signos:

Código: Seleccionar todo

pa13Inicial= 0;
for (n= 1; n< 14;n++){
   pa13Inicial+=  (1 - Apostadas[n,1])/Apostadas[n,1];
}

Ahora se iniciaria el algoritmo recursivo y al menos a profundidad 1 tenemos:

pa13= pa13Inicial + ((1-Apostadas[p,z])/Apostadas[p,z]) -    ((1-Apostadas[p,SigIni])/Apostadas[p,SigIni]);

siendo p el partido, z el actual signo en estudio y SigIni el signo que acabamos de modificar.
Ahora habría que buscar una fórmula matemática para a partir de la probabilidad complementaria a distancia 1 calcular la de otra columna a distancia 2. Yo hice estos días atrás y parecía posible, pero tenía las ideas generales tan confusas que no se si fallaba la fórmula ideada o el desarrollo general. Si tengo tiempo intentaré investigar, pero desde aquí animo a los amigos de las "cuentas" a mirar a ver si es posible lo que comento. De todas formas tengo todavía las ideas tan confusas y algunas cosas tan prendidas con alfileres que quizás esté diciendo una tontería.
Esta es la pregunta que habías dejado en el aire y que no te había contestado porque hasta ahora para calcular todos los premios lo que hacia era desarrollar todas las columnas a distancia 1,2,3 y 4 de la columna analizada y sumaba sus probabilidades apostadas para calcular los premios. Al fin y al cabo es el ordenador quien trabaja (aprox. 20.000 cálculos por columna).

Sin embargo he recordado que allá por el año 2003 hice una hoja excel que calculaba la estimación de premios de una columna sin necesidad de desarrollar y calcular las probabilidades apostadas de 20.000 columnas.

El fundamento de la estimación de premios seguía siendo el mismo pero conseguí simplificarlo al máximo haciendo uso del “factor común” para ahorrar operaciones. Al final con unas 160 celdas se podía obtener la estimación de premios de las 5 categorías de forma instantánea.

He estado implementando el mismo proceso en el programa de cálculo de la EM y efectivamente he reducido a 1/7 el tiempo de cálculo de los premios de los 14 triples: antes tardaba 3 minutos con 19 segundos; ahora 26 segundos.
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Cálculo del premio de 14

Mensaje por JoanD »

Cálculo del premio de 14

El premio de 14 no tiene ningun secreto y su cálculo es directo:

sean:

CV = Columnas validadas

Probabilidad apostada de la columna analizada:

PA= p[1]*p[2]*p[3]*p[4]*p[5]*p[6]*p[7]*p[8]*p[9]*p[10]*p[11]*p[12]*p[13]*p[14]

Acertantes14 = CV * PA

Código: Seleccionar todo

               CV * 0,12        CV * 0,12        0,12
Premio14 = ---------------  =  ------------- =  -------
            Acertantes14        CV * PA            PA
El valor de la PA va a ser clave para calcular el resto de los premios sin tener que volver a multiplicar los 14 operandos. PA representa el cromosoma de la probabilidad apostada de la columna.
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Cálculo del premio de 13

Mensaje por JoanD »

Cálculo del premio de 13

Primero calculamos un vector de valores a usar para calcular la probabilidad de las columnas que fallan algún signo sobre la columna analizada.

Si por ejemplo se falla el signo del partido n, la probabilidad (P’) de las 2 columnas que lo fallan és:

P’= PA/p[n] * (1-p[n])

Así la matriz está formada por los siguientes valores

Código: Seleccionar todo

           1-p[n]
Cr[n] = ----------
            p[n] 
Variando n entre 0 y 13

Eso nos permite calcular la Probabilidad de cualquier columna que difiera en 1 signo respecto a la columna analizada y por lo tanto el premio de 13:

SumaCr = Cr[0]+Cr[1]+… Cr[13]

Acertantes13 = CV * PA * SumaCr

Código: Seleccionar todo

              CV * 0,08         CV * 0,08             0,08
Premio13 =  ------------- = ------------------ =  -------------
             Acertantes13     CV * PA * SumaCr    PA * SumaCr 
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Cálculo del premio de 12

Mensaje por JoanD »

Cálculo del premio de 12

Hay 364 columnas que se diferencian en 2 signos con la columna analizada. Sin embargo no hace falta hacer 364 veces el calculo de acertantes de cada una de ellas.

Primero calculamos la suma de los Cr[] considerando cada vez un elemento menos en la suma. Es decir:

SumaCr = Cr[0]+Cr[1]+… Cr[13]

NOTA: ese valor ya lo calculamos al calcular el Premio13

Suma[0] = SumaCr
Suma[1] = Suma[0] – Cr[0]
Suma[2] = Suma[1] – Cr[1]
Suma[3] = Suma[2] – Cr[2]
Suma[4] = Suma[3] – Cr[3]
Suma[5] = Suma[4] – Cr[4]
Suma[6] = Suma[5] – Cr[5]
Suma[7] = Suma[6] – Cr[6]
Suma[8] = Suma[7] – Cr[7]
Suma[9] = Suma[8] – Cr[8]
Suma[10] = Suma[9] – Cr[9]
Suma[11] = Suma[10] – Cr[10]
Suma[12] = Suma[11] – Cr[11]
Suma[13] = Suma[12] – Cr[12]

Calculamos los acertantes correspondientes a cada suma y los sumamos:

Suma12=(Cr[0] * Suma[1] + Cr[1]*Suma[2] + … + Cr[12]*Suma[13])

Acertantes12 = Acertantes14 * Suma12 = CV * PA * Suma12

Código: Seleccionar todo

              CV * 0,08         CV * 0,08               0,08
Premio12 =  ------------- = -------------------- =  -----------
             Acertantes12     CV * PA * Suma12     PA * Suma12 
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Avatar de Usuario
lee_bran
12
12
Mensajes: 1379
Registrado: Vie 09 Dic, 2005 5:18 pm
Contactar:

Mensaje por lee_bran »

¿Que hace exactamente for(int d=1;d<14>0;d--)?

En C# me da error.

Edito porque veo que has borrado el mensaje, por lo que algo debía haber mal.
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

Sucede algo muy extraño: hago copiar y pegar el código que tengo en c# y cuando le doy a enviar o la la vista previa hay lineas que han desaparecido. Lo he intentado muchas veces y no ha habido manera.

Ya pensaré alguna alternativa para poner el código de la rutina.
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Avatar de Usuario
lee_bran
12
12
Mensajes: 1379
Registrado: Vie 09 Dic, 2005 5:18 pm
Contactar:

Mensaje por lee_bran »

Igual hay algun caracter que en html simboliza retroceder. Prueba con tu programa de tabla foro para pegar el codigo.
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

Para las categorías de 11 y 10 se procede de forma análoga pero para no aburrir con las fórmulas expongo directamente la función en c#

Rutina de cálculo

// se ha calculado previante las prob. Apostadas de los 14 triples
// estas estan registadas en el vector Papostada[indiceColumna]

Imagen
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

lee_bran escribió:Igual hay algun caracter que en html simboliza retroceder. Prueba con tu programa de tabla foro para pegar el codigo.
Al final he hecho una imagen y así se ve mas claro.
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

Pienso que todavia se puede simplificar mas el código. Seguramente haciendo una rutina recursiva.

Cuando la tenga intentaré publicarla.
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Avatar de Usuario
geriflu
11
11
Mensajes: 881
Registrado: Mié 21 Nov, 2007 9:44 pm

Re: CALCULO RÁPIDO DE TODOS LOS PREMIOS

Mensaje por geriflu »

JoanD escribió:CALCULO RÁPIDO DE TODOS LOS PREMIOS
He estado implementando el mismo proceso en el programa de cálculo de la EM y efectivamente he reducido a 1/7 el tiempo de cálculo de los premios de los 14 triples: antes tardaba 3 minutos con 19 segundos; ahora 26 segundos.
Excelente JoanD, pues aunque a mi me tarda 44 segundos en calcular todos los premios, sólo por calcularlos de una forma tan elegante y eficiente merece la pena cambiar la rutina.

De hecho, después de desarrollar el cálculo de premios de 10 y 11 a partir de los de 14, 13 y 12 modifiqué el algoritmo de cálculo de premios y tras ver el buen resultado, sustituí el cálculo de premios por el cáculo de EM. Ahora lo que hago es calcular todos los premios. Luego calculo la EM para 100.000 o 200.000 columnas.Luego Busco los coeficientes para las EM de 10 y 11 a partir de las de 14, 13 y 12. Pero como todo es muy rápido generalmente sólo calculo la EM10 a partir de la EM11, EM12 y EM13.
Y cuando no calculo los 14 triples sino un fichero lo hago todo a "pelo"

Pero insisto, siempre hay que intentar mejorar los resultados. Gracias por publicar el resto. Saludos

P.D: Edito para añadir que me encanta esta forma de programa a partir de un cromosoma inicial. Ahora releyendo lo que has escrito, me doy cuenta de que ya antes había utilizado esta técnica aunque no sabía que se llamaban algoritmos de mutación genética. Lo hacía en mis programa de ajedrez a la hora de generar los movimientos legales de una posición. Se tomaba como cromosoma los 20 movimientos legales de la posición inicial y luego tras cada movimiento se actualizaba la lista sin tener que generar todos los movimientos, sino solo los que afectaban a la casilla origen y destino del movimiento. Es un placer ver como programas, JoanD.

Geri
Sólo hay 10 clases de personas en el mundo: Los que comprenden la numeración binaria y los que no.
Avatar de Usuario
geriflu
11
11
Mensajes: 881
Registrado: Mié 21 Nov, 2007 9:44 pm

Mensaje por geriflu »

¡Impresionante JoanD! He cambiado la rutina del cálculo de premios y he pasado de 44 segundos a 5 segundos. Como no podía ser de otra forma, con tu permiso le he puesto tu nombre al procedimiento:

Código: Seleccionar todo

procedure  TForm1.CalcularPremios;
var n: integer;
begin
for n:= 0 to MAXCOL-1 do
   begin
   Calcular_Premios_Una_Columna_JoanD(n, Nivel);
   CorreccionDePremios(n);
   end;
end;
¡Bravo JoanD! La perfección existe .... :wink:
Sólo hay 10 clases de personas en el mundo: Los que comprenden la numeración binaria y los que no.
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

Carai !! 5 segundos !!! qué ràpido !!

Me alegro doblemente porque te ha rebajado el tiempo y porque lo has podido adaptar a Delphy sin necesidad de preguntarme sobre el significado de las variables. Ya veo que lo has interpretado correctamente.

Por curiosidad ¿Que te tarda tu ordenador en calcular la EM exacta de los 14 triples considerando todos los premios?
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Indeciso
14
14
Mensajes: 5584
Registrado: Dom 10 Oct, 2004 8:26 pm

Mensaje por Indeciso »

Que "Machine" esta hecho JoanD ;)
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

He simplificado la rutina. Esta es la última versión del código:

Código: Seleccionar todo

private void CalcularPremios14TriplesNew()
{
    int Partido, i, j, signo;
    for (i = 0; i < 4782969; i++)
    {   
        Array.Clear(SumaProbabilidades, 0, 5);
        SumaProbabilidades[0] = 1;
        for (Partido = 0; Partido < 14; Partido++)
        {
            signo = (i / pot[Partido]) % 3;
            //--- cálculo de valores complementarios ---
            Cr[Partido] = (1 - pa[Partido, signo]) / pa[Partido, signo];
            SumaProbabilidades[1] += Cr[Partido];
        }
        float[] S11 = ObtenerSumaProbabilidades(Cr, 2);
        float[] S10 = ObtenerSumaProbabilidades(S11, 3);
        float[] S09 = ObtenerSumaProbabilidades(S10, 4);
        for (j = 0; j < 5; j++)
        {
            Premios[i, j] = _PremioMaximo[j] / (int)(Papostada[i] * _ApuestasValidadas * SumaProbabilidades[j] + 1.5);
        }
        CorregirPremios(i);
}
Última edición por JoanD el Sab 07 Feb, 2009 11:38 pm, editado 1 vez en total.
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

La funcion ObtenerSumaProbabilidades es esta:

Código: Seleccionar todo

private float[] ObtenerSumaProbabilidades(float[] SumAnt, int NivelPremio)
{
    float[] Acum = new float[16 - NivelPremio];
    float[] Sum = new float[15 - NivelPremio];
    Acum[15 - NivelPremio] = SumAnt[15 - NivelPremio];
    for (int d = 14 - NivelPremio; d > 0; d--) Acum[d] = Acum[d + 1] + SumAnt[d];
    for (int d = 1; d < 16 - NivelPremio; d++)
    {
        Sum[d - 1] = Cr[d - 1] * Acum[d];
        SumaProbabilidades[NivelPremio] += Sum[d - 1];
    }
    return Sum;
}
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Avatar de Usuario
geriflu
11
11
Mensajes: 881
Registrado: Mié 21 Nov, 2007 9:44 pm

Mensaje por geriflu »

JoanD escribió:Carai !! 5 segundos !!! qué ràpido !!

Me alegro doblemente porque te ha rebajado el tiempo y porque lo has podido adaptar a Delphy sin necesidad de preguntarme sobre el significado de las variables. Ya veo que lo has interpretado correctamente.

Por curiosidad ¿Que te tarda tu ordenador en calcular la EM exacta de los 14 triples considerando todos los premios?
Hola JoanD, he estado toda la tarde fuera y no había visto el mensaje. La verdad es que no lo sé cuanto tarda, pero lo voy a poner ahora y mañana te lo digo. Mi ordenador no es especialmente rápido:

Nombre de la CPU: Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz

Lo que si me permite es hacer cuatro cosas al mismo tiempo a 2.40 GHz cada una.

Antes de arreglar mi rutina de cálculo de premios pensaba que el "lento" era DELPHI y pensaba proponerte una prueba de velocidad con algún bucle complejo para ver si el lento era el ordenador, Delphi o las manos del programador. Tras el arreglo me quedé sorprendido de lo rápido que iba. Mañana te daré los tiempos. Buenas noches
Sólo hay 10 clases de personas en el mundo: Los que comprenden la numeración binaria y los que no.
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Re: CALCULO RÁPIDO DE TODOS LOS PREMIOS

Mensaje por JoanD »

geriflu escribió:P.D: Edito para añadir que me encanta esta forma de programa a partir de un cromosoma inicial. Ahora releyendo lo que has escrito, me doy cuenta de que ya antes había utilizado esta técnica aunque no sabía que se llamaban algoritmos de mutación genética. Lo hacía en mis programa de ajedrez a la hora de generar los movimientos legales de una posición. Se tomaba como cromosoma los 20 movimientos legales de la posición inicial y luego tras cada movimiento se actualizaba la lista sin tener que generar todos los movimientos, sino solo los que afectaban a la casilla origen y destino del movimiento.
De hecho yo también usaba el mismo método antes de leer sobre algoritmos genéticos. Fue entonces cuando vi que la definición de cromosoma, gen y mutación encajaban perfectamente con lo que hacía. Por eso le puse "algoritmo de mutación secuencial o genética". Aunque los algoritmos genéticos tienen mas caracteristicas como la reproducción, cruce, eliminación, etc. que no uso.
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Avatar de Usuario
geriflu
11
11
Mensajes: 881
Registrado: Mié 21 Nov, 2007 9:44 pm

Mensaje por geriflu »

Tiempo total de cálculo de la EM de los 14 triples: 4 horas 20 minutos 43 segundos.

Total: 4:20:43

Suerte esta tarde en la quiniela :wink:
Sólo hay 10 clases de personas en el mundo: Los que comprenden la numeración binaria y los que no.
Avatar de Usuario
JoanD
12
12
Mensajes: 2657
Registrado: Vie 19 Dic, 2003 6:35 pm
Ubicación: Barcelona
Contactar:

Mensaje por JoanD »

Tienes un buén ordenador.

4 horas 20 minutos está bastante bién.
Saludos

https://www.quinielista.es/dnp1x2/joand/
Peña agrupada en la "Piedra_Filosofal"
Responder