Saltar al foro
Avisos
Vaciar todo

[Cerrado] ¿Quieres ganar 50$?

59 Mensajes
14 Usuarios
0 Reacciones
3,263 Visualizaciones
Sargot
Registrado: 01.01.2009
PokerStrategist

original de DyLaK
La equity de cada mano la tengo en este formato:

AKo vs AKs
22 vs 33
JTo vs 53o

Es decir, es siempre suited, of, o pareja, pero no dispongo de la probabilidad de manos concretas.

Bueno, en ese caso, la función que calcula las nuevas probabilidades, lo que hace es coger las probabilidades que dices que conoces (en el primer post), una vez que se sepan las probabilidades lo demás es idéntico.


DyLaK Autor del tema
DyLaK
Registrado: 29.12.2007
Elite Grinder

Bueno siento comunicar que ya está resuelto por Galo, la cual ya se ha ganado los 50$, así que si quieren pueden cerrar el thread.

Un saludo y gracias a los que lo habeis intentado.


Galo7070
Registrado: 28.12.2007
PokerStrategist

Gracias DyLaK, un gusto haber trabajado contigo en esto.


marcianoskate
Registrado: 22.08.2007
Oldschool Grinder

Me gustaría conocer la solución ... se puede??


BEASTJQK
Registrado: 04.04.2008
PokerStrategist

Oie DyLaK...

Y que hay de mi propuesta de poner el 50%...

en serio lo decia...

pero tienes que enseñarme como funciona!! :D :D


Rango1[n];
Rango2[m];
sumaprob1 = 0;
sumaprob2 = 0;
equity = 0;
sumaequity = 0;

for(i = 0; i < n; i++)
sumaprob1 = probabs + probabilidad(rango1); //Sirve para calcular la probabilidad de cada mano relativa al rango, y no al total de manos

for(i = 0; i < m; i++)
sumaprob2 = probabs + probabilidad(rango1);

for(i = 0; i < n; i++) {
for(j = 0; j < m; j++)
equity = equity(rango1,rango2[j]) * probabilidad(rango2[j])/sumaprob2; //equity de la mano i con respecto a la j, medida con la probabilidad relativa al rango 2 de la mano j
sumaequity = probabilidad(rango1) / sumaprob1 * equity; //sumo al total el equity de la mano i con todas las manos del rango 2, relativo a la probabilidad relativa de la mano i en el rango 1
equity = 0;
}

Cualquier duda preguntame
Saludos!

Edito: esta mal! no concideré la probabilidad de una mano cuando ya salieron cartas... lo reviso y contesto

Edito número 2: aqui hay un problema con el tema de las probabilidades y los rangos... tenemos dos rangos... yo asumo que la probabilidad de que salga una mano es independiente del rango del rival, y viceversa. Si eso te parece correcto, el problema está resuelto.
Ahora, si decides que quieres cotejar un rango con otro, eligiendo como base uno de ellos, se pueden ajustar las probabilidades de cada mano del rival en función de la mano analizada en cada paso, por lo que no hay problema y se puede resolver.
El tercer caso sería medir a la vez los dos rangos. Las probabilidades de cada una de las manos se medirían en función del rango del rival, pero las del rival se medirían del mismo modo, por lo que tienes una referencia circular. Esto podrías tratarlo con un algoritmo incremental con x pasos, o hasta que se modifique tal porcentaje o lo que sea. De todas maneras, no me parece lógico, porque siempre vamos a asumir un punto de vista del que tenemos certeza(la mano o manos que lleva uno de los jugadores).
Contestame que te parece, y como sigo.
Saludos.


DyLaK Autor del tema
DyLaK
Registrado: 29.12.2007
Elite Grinder

original de hipoKi
Rango1[n];
Rango2[m];
sumaprob1 = 0;
sumaprob2 = 0;
equity = 0;
sumaequity = 0;

for(i = 0; i < n; i++)
sumaprob1 = probabs + probabilidad(rango1); //Sirve para calcular la probabilidad de cada mano relativa al rango, y no al total de manos

for(i = 0; i < m; i++)
sumaprob2 = probabs + probabilidad(rango1);

for(i = 0; i < n; i++) {
for(j = 0; j < m; j++)
equity = equity(rango1,rango2[j]) * probabilidad(rango2[j])/sumaprob2; //equity de la mano i con respecto a la j, medida con la probabilidad relativa al rango 2 de la mano j
sumaequity = probabilidad(rango1) / sumaprob1 * equity; //sumo al total el equity de la mano i con todas las manos del rango 2, relativo a la probabilidad relativa de la mano i en el rango 1
equity = 0;
}

Cualquier duda preguntame
Saludos!

Edito: esta mal! no concideré la probabilidad de una mano cuando ya salieron cartas... lo reviso y contesto

Edito número 2: aqui hay un problema con el tema de las probabilidades y los rangos... tenemos dos rangos... yo asumo que la probabilidad de que salga una mano es independiente del rango del rival, y viceversa. Si eso te parece correcto, el problema está resuelto.
Ahora, si decides que quieres cotejar un rango con otro, eligiendo como base uno de ellos, se pueden ajustar las probabilidades de cada mano del rival en función de la mano analizada en cada paso, por lo que no hay problema y se puede resolver.
El tercer caso sería medir a la vez los dos rangos. Las probabilidades de cada una de las manos se medirían en función del rango del rival, pero las del rival se medirían del mismo modo, por lo que tienes una referencia circular. Esto podrías tratarlo con un algoritmo incremental con x pasos, o hasta que se modifique tal porcentaje o lo que sea. De todas maneras, no me parece lógico, porque siempre vamos a asumir un punto de vista del que tenemos certeza(la mano o manos que lleva uno de los jugadores).
Contestame que te parece, y como sigo.
Saludos.

Parece que sabes lo que haces :)

Dame un tiempo que hable con galo, y luego te comento ok? de todas formas lo que busco es que el resultado sea el mismo que el equilator


probabilidadAjustada(mano1, mano2) { //Define la probabilidad de que salga una mano en función de otra

prob = 0;
if(suited(mano2)) {
if(comparten(mano1,mano2) == 2) { //Dos de las cartas son iguales ej: AK vs. AK
prob = 6/50 * 1/50;
} else if (comparten(mano1,mano2) == 1) {
prob = 4/50 * 1/50 + 3/50 * 1/50; //Separo por claridad
} else {
prob = 8/50 * 1/50;
}
} else {
if(comparten(mano1,mano2) == 2) { //Dos de las cartas son iguales ej: AK vs. AK
prob = 6/50 * 3/50;
} else if (comparten(mano1,mano2) == 1) {
prob = 4/50 * 3/50 + 3/50 * 4/50;
} else {
prob = 8/50 * 3/50;
}
}

}

Rango1[n];
Rango2[m];
sumaprob1 = 0;
probAjustada = 0;
sumaprob2 = 0;
equity = 0;
sumaequity = 0;

for(i = 0; i < n; i++)
sumaprob1 = probabs + probabilidad(rango1);

for(i = 0; i < n; i++) {
for(j = 0; j < m; j++) {
sumaprob2 = sumaprob2 + probabilidadAjustada(rango1, rango2[j]); //Llevamos la suma para luego convertir el equity dividiendo cada termino de la suma
//y por ende la suma total, por el total dando probabilidad relativa al rango
equity = equity(rango1,rango2[j]) * probabilidadAjustada(rango1, rango2[j]);
}
sumaequity = probabilidad(rango1) / sumaprob1 * equity / sumaprob2;
equity = 0;
}

resultado = sumaequity;

Aquí lo que hago es lo siguiente: calculo la probabilidad total de las manos del rango 1, para calcular la probabilidad relativa en el primer rango.
Luego para cada mano del rango 1, calculo el equity contra cada mano del rango 2, y lo multiplico por la probabilidad ajustada de la mano del rango dos(la probabilidad de que salga la mano 2, dada que ya salió la mano 1).
Al final, el equity total lo divido por la probabilidad total sumada de las manos del rango dos, para lograr probabilidad relativa en todas las manos.
A la suma de equity total le agrego el resultado de ese cociente multiplicado por la probabilidad de la mano1 relativa al rango1.

Me parece la mejor solución posible.

Cualquier cosa, avisame.

PD: lamentablemente no sale el identado :(


Otra cosa!
Asumí que las manos eran del tipo ATo, KK, AJs.
Si son del tipo AhTs, KhKs, la cosa va distinta.
Pero creo que si estás analizando rangos es mejor no hacer distinciones.


DyLaK Autor del tema
DyLaK
Registrado: 29.12.2007
Elite Grinder

He convertido tu código a lo siguiente:

public double equityVsRango(Rango rango)
{
Mano[] rango1 = this.manos.ToArray(); //n
Mano[] rango2 = rango.manos.ToArray(); //m
double sumaprob1 = 0;
double probAjustada = 0;
double sumaprob2 = 0;
double equity = 0;
double sumaequity = 0;

for (int i = 0; i < rango1.Length; i++)
sumaprob1 += rango1.Porcentaje;

for (int i = 0; i < rango1.Length; i++)
{
for (int j = 0; j < rango2.Length; j++)
{
sumaprob2 = sumaprob2 + rango1.PorcentajeDadaOtraMano(rango2[j]); //Llevamos la suma para luego convertir el equity dividiendo cada termino de la suma
//y por ende la suma total, por el total dando probabilidad relativa al rango
equity = rango1.EquityVsMano(rango2[j]) * rango1.PorcentajeDadaOtraMano(rango2[j]);
}
sumaequity = rango1.Porcentaje / sumaprob1 * equity / sumaprob2;
equity = 0;
}

return sumaequity;

}

siendo mano1.porcentajeDadaOtraMano(mano2) la probabilidad de que salga la mano1, habiendo ya repartido la mano2 (creo que es lo hace tu función, pero la tuya está mal).

El resultado de AA,KK vs AA,KK es de 1,786% vs 98,214%, asi que algo falla


En un principio veo que no 'limpié' la variable sumaprob2.
luego de la línea equity = 0 debería ir sumaprob2 = 0
Sigo revisando, me avisas por acá que pasó? Saludos

Edito: me parece que el razonamiento está bien... revisé las cuentas y eso... tal vez era lo de esa variable nada más, tal vez no. Me avisás? saludos


DyLaK Autor del tema
DyLaK
Registrado: 29.12.2007
Elite Grinder

Ahora AA,KK vs AA,KK = 3,571% vs ...

Codigo:

public double equityVsRango(Rango rango)
{
Mano[] rango1 = this.manos.ToArray(); //n
Mano[] rango2 = rango.manos.ToArray(); //m
double sumaprob1 = 0;
double probAjustada = 0;
double sumaprob2 = 0;
double equity = 0;
double sumaequity = 0;

for (int i = 0; i < rango1.Length; i++)
sumaprob1 += rango1.Porcentaje;

for (int i = 0; i < rango1.Length; i++)
{
for (int j = 0; j < rango2.Length; j++)
{
sumaprob2 += rango1.PorcentajeDadaOtraMano(rango2[j]); //Llevamos la suma para luego convertir el equity dividiendo cada termino de la suma
//y por ende la suma total, por el total dando probabilidad relativa al rango
equity = rango1.EquityVsMano(rango2[j]) * rango1.PorcentajeDadaOtraMano(rango2[j]);
}
sumaequity = rango1.Porcentaje / sumaprob1 * equity / sumaprob2;
equity = 0;
sumaprob2 = 0;
}

return sumaequity;
}


No tengo ni idea de programción pero:

Nomenclatura: Ai= manos del rango A.

RangoA vs RangoB = Σ ((Equity de Ai vs RangoB)*probabilidad de Ai) =

Σ (Σ[j=1->j=n]( Equity de Ai vs Bj) probBi)*probabilidad de Ai) =


Sol oeh programado, hace tiempo en mi calculadora y seria algo como (no se ni siquiera si está bien escrito peor la idea es hacer dos pequños bucles y a está):

f=0

For A=1 -> A=n                                     #A1 es la primera mano del rango, A2 la segunda mano del rango etc.
e=o
For B=1->B=n
e=e + (Equity A vs B) · probabilidad de B
End
f=f + e·probA
End

Echo "equity $rangoA vs $rangoB es" f

He oviado la parte donde comapras equitys q supongo q sabes hacer.


Otra osa las probabilidad de que aprezca un par de cartas varia dependiendo del otro par de cartas y es algo que hay que tener en cuenta y no se si lo tienes en cuenta.. Esto es si tienes AK es más dific que el otro tenga AA, por eso te decá de usar las librerias para comparar.

Y para clauclar estas probabilidades "modificadas" o las ahces previamente o las calculas en el momento.


HE hecho un par de pruebas ycreo q el unico eror es precisamente cuando las probabilidades de un rango se alteran por las del otro y como eso en la realidad pasa siempre hay que introducirlo en lso calculos. ASi que no es "probabilidad de B" sino de B teniendo A.

un saludo y espeor haberme ganado un % del os 50$ :D y si no siempre es bueno despertar las neuronas que la medicina me está atrofiando el pensamiento numerico.


Otro error
sumaequity = rango1.Porcentaje / sumaprob1 * equity / sumaprob2;

cambiala por

sumaequity = sumaequity + rango1.Porcentaje / sumaprob1 * equity / sumaprob2;

Porque te está dando la suma sólo de la última mano, o sea, no suma...

Perdón je!


DyLaK Autor del tema
DyLaK
Registrado: 29.12.2007
Elite Grinder

original de hipoKi
Otro error
sumaequity = rango1.Porcentaje / sumaprob1 * equity / sumaprob2;

cambiala por

sumaequity = sumaequity + rango1.Porcentaje / sumaprob1 * equity / sumaprob2;

Porque te está dando la suma sólo de la última mano, o sea, no suma...

Perdón je!

Ahora AA,KK vs AA,KK = 38,691% vs ...

Voy a probar lo de naharro


DyLaK Autor del tema
DyLaK
Registrado: 29.12.2007
Elite Grinder

original de Naharro
Sol oeh programado, hace tiempo en mi calculadora y seria algo como (no se ni siquiera si está bien escrito peor la idea es hacer dos pequños bucles y a está):

f=0

For A=1 -> A=n                                     #A1 es la primera mano del rango, A2 la segunda mano del rango etc.
e=o
For B=1->B=n
e=e + (Equity A vs B) · probabilidad de B
End
f=f + e·probA
End

Echo "equity $rangoA vs $rangoB es" f

Este es el código traducido, espero que lo entiendas:

public double equityVsRango2(Rango rango)
{
double f=0;

foreach (Mano mano1 in this.Manos)
{
double e=0;
foreach (Mano mano2 in rango.Manos){
e += mano1.EquityVsMano(mano2) * mano2.PorcentajeDadaOtraMano(mano1);
}

f += e * mano1.Porcentaje;
}

return f;
}

El resultado de AA,KK vs AA,KK = 0.003% vs ...