Calcular Equity rango vs rango

16 años 9 meses
1.460
Buenas, estoy haciendo un programa, y tengo que calcular la equity de un rango vs otro.
Dispongo de la probabilidad de cualquier mano contra otra mano, y supongo que teniendo eso, calcular rango vs rango es una gilipollez, pero no se me ocurre. ¿Alguien puede ayudarme?
(supongo que lo primero es calcular equity de mano vs rango)

16 años 9 meses
1.460
Añado que también dispongo de la equity de una mano contra un rango.

17 años
1.293
Básicamente es hacer la doble suma ponderada, creo que sería así:
Rango A={A1...An}
Rango B={B1...Bm}
EquityRangoAvsB = sum(i=1..n,Pi*sum(j=1..m,Pji*Equity(Ai,Bj))/sum(j=1..m,Pji))/sum(i=1..n,Pi)
con:
Pi = probabilidad de tener la mano Ai
Pji = probabiliad de tener la mano Bj supuesto que el otro tiene Ai
Equity(Ai,Bj) = equity de la mano Ai contra la Bj

16 años 9 meses
1.460
Básicamente es hacer la doble suma ponderada, creo que sería así:Rango A={A1...An}
Rango B={B1...Bm}EquityRangoAvsB = sum(i=1..n,Pi*sum(j=1..m,Pji*Equity(Ai,Bj))/sum(j=1..m,Pji))/sum(i=1..n,Pi)
con:
Pi = probabilidad de tener la mano Ai
Pji = probabiliad de tener la mano Bj supuesto que el otro tiene Ai
Equity(Ai,Bj) = equity de la mano Ai contra la Bj
Uf, así en modo plano me cuesta muchísimo sacarlo, voy a ver si lo intento, pero si pudieras escribirlo en pseudocódigo me harías mucho más fácil la tarea.

19 años 1 mes
351
Ese programa ya existe se llama Pokerstove

16 años 9 meses
1.460
Ese programa ya existe se llama Pokerstove
Si, tampoco soy tan nuevo, pero lo que hace mi programa no lo hace pokerstove, esto solo es una parte para que haga lo que yo quiero que haga.

17 años
1.293
En C:
float ** Equity; //Array doble con las equitys
float ** P; //Array doble con Pji
float * p; //Array simple con Pi
float total=0, parcial, sumaPesosI=0, sumaPesosJ;
for (int i=0;i
parcial=sumaPesosJ=0;
for (int j=0;j
parcial+=P[j][i]*Equity[i][j];
sumaPesosJ+=P[j][i];
}
total+=p[i]*parcial/sumaPesosJ;
sumaPesosI+=p[i];
}
total/=sumaPesosI;
Edito: lo identé pero el foro no guarda espacios al principio de línea 😒

16 años 9 meses
1.460
En C:float ** Equity; //Array doble con las equitys
float ** P; //Array doble con Pji
float * p; //Array simple con Pifloat total=0, parcial, sumaPesosI=0, sumaPesosJ;
for (int i=0;i
parcial=sumaPesosJ=0;
for (int j=0;j
parcial+=P[j][i]*Equity[i][j];
sumaPesosJ+=P[j][i];
}
total+=p[i]*parcial/sumaPesosJ;
sumaPesosI+=p[i];
}
total/=sumaPesosI;Edito: lo identé pero el foro no guarda espacios al principio de línea 😒
Muchas gracias! ahora mismo lo pruebo, y te digo si me funciona.

16 años 9 meses
1.460
Acabo de probarlo y creo que falla, salvo que haya puesto algo mal, aquí te pongo el código en c#:
public double equityVsRango(Rango rango)
{
double total = 0, parcial, sumaPesosI = 0, sumaPesosJ;
foreach (Mano mi in this.manos)
{
parcial = sumaPesosJ = 0;
foreach (Mano mj in rango.manos)
{
parcial += mj.PorcentajeDadaOtraMano(mi) * mi.EquityVsMano(mj);
sumaPesosJ += mj.PorcentajeDadaOtraMano(mi);
}
total += mi.Porcentaje * parcial / sumaPesosJ;
sumaPesosI += mi.Porcentaje;
}
total /= sumaPesosI;
return total;
}
Sin ir más lejos probando un rango contra él mismo, no da un 50%.

17 años
1.293
Hay un problema. Si por ejemplo enfrentas AA vs AA al primero le estamos dando un % mayor de tener AA ya que al segundo le estamos condicionando a que el primero tiene AA. Hay que calcular p[i] también como suma ponderada teniendo en cuenta el rango del rival. Ahora no puedo, inténtalo con esa idea en mente y si no mañana te lo saco.

16 años 9 meses
1.460
Hay un problema. Si por ejemplo enfrentas AA vs AA al primero le estamos dando un % mayor de tener AA ya que al segundo le estamos condicionando a que el primero tiene AA. Hay que calcular p[i] también como suma ponderada teniendo en cuenta el rango del rival. Ahora no puedo, inténtalo con esa idea en mente y si no mañana te lo saco.
Puf, precisamente vine al foro para encontrar ayuda, porque no se me ocurre la manera de hacerlo, si pudieras resolverlo con más tiempo te lo agradecería.

18 años
6.724
Quizas esto te sirva:
stoxpoker.com | Collection of poker blogs and poker strategy from online poker pros
Saludos!

16 años 9 meses
1.460
Quizas esto te sirva:stoxpoker.com | Collection of poker blogs and poker strategy from online poker pros
Saludos!
Gracias, pero creo que de ahí no me sirve nada para lo mío 😒

18 años
6.724
Gracias, pero creo que de ahí no me sirve nada para lo mío 😒
jaja, bueno a ver si ahora esto si te ayuda...fijate lo que comentaba en este otro hilo sobre el hand range tool del HM
http://www.poker-red.com/foros/software/26267-preguntonta-hm.html
Saludos!

17 años
1.293
Acabo de probarlo y creo que falla, salvo que haya puesto algo mal, aquí te pongo el código en c#:
public double equityVsRango(Rango rango)
{
double total = 0, parcial, sumaPesosI = 0, sumaPesosJ;
foreach (Mano mi in this.manos)
{
parcial = sumaPesosJ = 0;
foreach (Mano mj in rango.manos)
{
parcial += mj.PorcentajeDadaOtraMano(mi) * mi.EquityVsMano(mj);
sumaPesosJ += mj.PorcentajeDadaOtraMano(mi);
}
total += mi.Porcentaje * parcial / sumaPesosJ;
sumaPesosI += mi.Porcentaje;
}
total /= sumaPesosI;
return total;
}
Sin ir más lejos probando un rango contra él mismo, no da un 50%.
Lo he revisado y creo que el algoritmo está correcto. Lo que comentaba en el otro mail realmente introduce una cierta asimetría, pero no para rangos iguales, me explico:
Si enfrentas {AA,KK} vs {KK,QQ} con ese algoritmo estamos suponiendo que el rango 1 la mitad de las veces tiene AA y la otra mitad KK. En cambio el rango 2 va a tener menos veces KK que QQ porque lo condicionamos a la mano del primer rango. De todos modos esto no debe impedir que enfrentando dos rangos iguales te diera equity del 50%, así que algún fallo hay.
Yo iría probando empezando por casos simples a ver cuándo te empieza a fallar:
- AA vs AK
- AA vs {AA,AK}
- {AA,AK} vs AA
- {AA,AK} vs {AA,AK}
- etc.
Y comparando con el pokerstove; sabiendo cual es el primero que falla podemos intuir dónde está el problema.

16 años 9 meses
1.460
Ok, aquí está la conclusión de mis pruebas:
AA vs AA,KK = Correcto
AA vs AA,A2s = 78.42% Incorrecto -> 75.262%
AA vs AA,A2o = 87.041% ¿Correcto? -> 87.042%
AA vs AA,32s = Correcto
AA vs JTo, 54s = Correcto
AA vs A2o,A3o = Correcto
AA vs A2o, 53s = Correcto
Por lo que a priori se puede ver que falla cuando son suited, y coincide una carta al menos.
Y como curiosidad, cuando se pone:
AA,KK vs AA = 34.027 cuando debería ser 22.618

16 años 9 meses
1.460
Creo haber encontrado una posible forma de hacerlo:
Por ejemplo: AA,KK vs AA sería:
(
Eq(AAvsAA)*P(AA,AA) +
Eq(KKvsAA)*P(KK,AA)
)
/
P(AA,AA)+P(KK,AA)
Siendo Eq(A,B) la equity de la mano A vs la mano B
y P(A,B) la probabilidad de que repartiendo 4 cartas al azar se de la mano A y la mano B. Es decir, resolviendo quedaría:
(
0.5 * 4/52*3/51*2/50*1/49 +
0.18054 * 4/52*3/51*4/50*3/49
)
/
4/52*3/51*2/50*1/49 + 4/52*3/51*4/50*3/49
Al menos en ese caso da la solución correcta.

17 años
1.293
Respecto al anterior mensaje:
Bueno, entonces yo creo que el algoritmo está bien, es posible que haya algún error en las funciones equityVSMano() o PorcentajeDadaOtraMano();
Pon AA vs A2s, si falla ahí es culpa de equityVSMano(), si no tiene que ser de la otra.
Edito: respecto al último mensaje:
Sí esa forma es correcta, el problema es que no es extensible al doble bucle, es decir que te valdría para mano vs rango pero no para rango vs rango.

16 años 9 meses
1.460
La funcion Mano.equityVsMano(otraMano) funciona correctamente, probada con varias manos.
Y porcentajeDadaOtraMano también está probada.
Dios, que rallada de cabeza xD

17 años
1.293
¿Te sale bien poniendo AA vs A2s?

16 años 9 meses
1.460
¿Te sale bien poniendo AA vs A2s?
Si, mano vs mano funciona perfectamente, porque lo obtengo directamente de un fichero.

17 años
1.293
Reproduce los cálculos del AA vs {AA,A2s}, que son sencillos, parecidos al AA,KK vs AA que has puesto antes. Comparando con los que va usando el programa en el algoritmo deberías dar con el error.
Responder
¿Quieres participar?
Inicia sesión o crea tu cuenta gratis para formar parte de la comunidad de Poker-Red.