Programación . Cálculo del ICM

ICM significa Independent Chip Model y, de forma muy resumida, es un modelo que sirve para calcular el valor de las fichas (chips) durante la disputa de un torneo (S&G o MTT). La idea detrás de ICM es que las decisiones en un torneo no se pueden basar, como en Cash, en el valor nominal de las fichas.

Intuitivamente esto ya lo sabíamos: en una mesa de Cash hay 300$ en el bote, la cantidad a subir o los pot odds para ver una apuesta de 10$ se pueden calcular directamente. Sin embargo, en un S&G, si sólo te quedan 10$ sólo los deberías jugar con un equity mayor de 0,5; otro ejemplo, si tienes 6.000$ y uno de los rivales tiene 290$ puedes hacerle shove con un rango bastante amplio porque 290$ de tu pila valen mucho menos que los últimos 290$ de su pila; un tercer ejemplo, sigues con 6.000$, tienes TT y un rival con más fichas hace shove, en este caso la intuición (del cash) te dice que es una buena oportunidad para ganar 6.000$ mientras que ICM te recuerda que perder 6.000$ significa perder el torneo y que deberías hacer fold. En ICM, 12.000$ nunca es el doble de 6.000$, es bastante menos

En el foro de Poker red Sergeon colgó una introducción a ICM a partir de varios artículos, a su vez, del foro 2+2.

Vamos a incorporar algunos cálculos basados en ICM a HHJReader (estupendo programa). De momento, hemos programado una calculadora de ICM en Excel. Aquí vemos el resultado y el código utilizado (traducido a VBA a partir de JAVA). Con este código cualquiera puede construirse su propia calculadora usando Excel o, directamente, en Visual Basic.



El código:

' Calculo de ICM en VBA para excel
' Autor (de la adaptación a VBA): Isabella70
' Fecha: 2009-06-10
' Fuente de las fórmulas en JAVA: http://pokerai.org/wiki/index.php/ICM_Equity_Calculator
'
' Uso:
' - la función recibe un número (1-n) que es id del jugador
' - "Payoffs" es un rango en el excel (una columna) que tiene los premios a repartir
' (pueden ser porcentajes o neto)
' - "Pilas" es otro rango del excel (otra columna) que contiene las pilas actuales
' de los jugadores

Function getEquity(i)
' la función recibe el jugador cuyo EV queremos calcular
currentPlayer = i
premios = Range("Payoffs")
pilas = Range("Pilas")

' calculamos el total de chips
Dim total As Double
total = 0
For Each chip In pilas
' hay tantos jugadores como pilas diferente de 0
If chip = 0 Then
Exit For
End If
total = total + chip
Next chip

' la función recursiva calcula el EV del jugador en cada nivel
' 1 si es el ganador, 2 si es el segundo, etc.
getEquity = getEquityRecursivo(premios, pilas, total, currentPlayer, 1)

End Function

Function getEquityRecursivo(payouts, stacks, total, player, depth)
Dim eq As Double

' los rangos son bidimensionales, en este caso siempre hay 1 columna
stack_player = stacks(player, 1)
payout_puesto = payouts(depth, 1)

' EV: probabilidad de ganar por premio
' la probabilidad es la relación entre las fichas del jugador y todas las fichas en juego
eq = payout_puesto * stack_player / total
' sólo calculamos el EV de los puestos con premio, el resto es 0
If depth <= UBound(payouts) Then
For ist = 1 To UBound(stacks)
st = stacks(ist, 1)
If ist <> player And st > 0 Then
Dim c As Double
c = stacks(ist, 1)
stacks(ist, 1) = 0
' Debug.Print "+ Player: " & player & " depth: " & depth & " eq: " & eq
eq = eq + getEquityRecursivo(payouts, stacks, total - st, player, depth + 1) * st / total
' Debug.Print "- Player: " & player & " depth: " & depth & " eq: " & eq
stacks(ist, 1) = c
End If
Next ist
End If

getEquityRecursivo = eq
End Function


Existen en Internet muchas calculadoras de ICM, por ejemplo en, como no, ICM Poker.

El código en Java lo hemos sacado de POKERAI. ICM Equity Calculator (Pokerai).

No hay comentarios:

Publicar un comentario

Tus comentarios son bienvenidos