ICM Equity Calculator

From PokerAI

(Redirected from ICM)
Jump to: navigation, search

The problem with using only chip stacks and chips to determine the correct play in SNG is that the chips do not correlate to their actual value on a one-to-one basis. An ICM Calcuator computes the tournament equity that a certain chip stack has in relation to the other stacks at the table in order to determine the true value of the stacks. You can then use the ICM equity values to calculate pot odds and get a closer answer to the correct decision in tournaments.

ICM Equity is defined as:

 Equity = P(1st)(Payout For First) + P(2nd)(Payout For Second) + … + P(nth)(Payout for nth)
 where P(i) denotes the probability of finishing on i-th place.

The problem usually is how to calculate P(i) efficiently and correctly. Usually, the following implementation assumptions and approach is taken:

  • The probability of finishing first is assumed to be the ratio of your stack size vs total number of chips in play
  • The probability of finishing second, etc is defined recursively, as the sum of probabilitites of player i = 1...n of finishing first, etc., and you finishing first (from the remaining players, and with adjusted stack sizes) afterwards.


Implementation

This is Java snippet returns ICM equity of selected player, by given payout structure and player stacks. The results from the following implementation are off slightly when the stack distributions are skewed.

 /** 
   * \param payouts Payout structure, e.g.: new double[]{0.5,0.3,0.2} 
   * \param stacks Player stacks 
   * \param player Index of selected player in the stack-array 
   * \returns ICM equity for selected player 
   */ 
  public static  double  getEquity ( double []  payouts,  double []  stacks,  int  player )  
  { 
    double  total =  0 ; 
    for  ( int  i =  0 ; i < stacks.length; i++ ) 
      total += stacks [ i ] ; 
    return  getEquity ( payouts, stacks.clone () , total, player,  0 ) ; 
  } 
  //Recursive method doing the actual calculation. 
  private static  double  getEquity ( double []  payouts,  double []  stacks,  double  total,  int  player,  int  depth )  
  { 
    double  eq = stacks [ player ]  / total * payouts [ depth ] ; 
    if ( depth +  1  < payouts.length ) 
      for  ( int  i =  0 ; i < stacks.length; i++ )  
        if  ( i != player && stacks [ i ]  >  0.0 ) { 
          double  c = stacks [ i ] ; 
          stacks [ i ]  =  0.0 ; 
          eq += getEquity ( payouts, stacks, total - c, player, depth +  1 )  * c / total; 
          stacks [ i ]  = c; 
        } 
    
    return  eq; 
  }

See also

Links

Personal tools