There are, IIRC, 22100 unique flops. (We can reduce this number using suit isomorphisms, but that may or may not be convenient, and the big idea here will follow through even if we use them -- it just makes things more complicated to describe.) There are a couple reasons we might want to choose a relatively small subset of flops that somehow accurately represents the full set:
- we want to reduce the size of a decision tree describing some model poker game
- we want to study in depth how players' ranges interact, etc. on a representative subset boards
To ensure that our subset accurately represents the real game, we might want it to reproduce certain properties of the full set of flops, such as the frequencies that:
- any particular single card comes.
- a flush draw of a particular suit comes.
- a monotone flop of a particular suit comes.
- a paired board with the pair being a particular rank comes.
- a 3-straight board of any rank comes.
- a board with any particular one-gap in the ranks comes.
- a board with any particular two-gap in the ranks comes.
How can we choose such a subset of flops?
Suppose there are P properties we want to be correct, e.g. the frequency of A
being dealt, the frequency of K
being dealt, the frequency that a flop is monotone in spades, and so on. Make a vector, B, having the correct frequencies, in some fixed order. For example, the correct frequency with which a flop will contain the A
is
nchoosek(51,2) / nchoosek(52,3) = 1275 / 22100 = 0.057692
Next, number the flops from 1 to 21000, and make a Px22100 matrix A such that A_{i,j} = 1 if flop j has property i, and 0 otherwise. So, A is just a matrix of zeros and ones indicating which flops have which properties.
Then, let x be a vector of length 22100 specifying how often to deal each flop. For example, to represent dealing every flop with equal probability, each entry in this vector will be 1/22100. If we wanted to deal a single flop 100% of the time, then the entry corresponding to that board would be 1 and all the other entries would be 0.
We'd like to find an x (which indicates a set of flops and frequencies to deal each of them) such that it has the properties of the full game as described above and also such that most entries are 0, so that we don't have to deal with too many boards.
x will correctly reproduce the frequencies of the full game if Ax=B. Any particular row of A, times x, gives the frequency that a random draw from our subset of flops has a particular property, and the corresponding row of B has the correct value from the full game. Take a moment to convince yourself of this. Certainly, if x has all entries 1/22100, it satisfies the equation by definition of B, but we can also imagine solving it with a vector with many fewer non-zero entries.
So we need to solve Ax=B. This is kind of like the classic least squares problem, except that we want all entries in our solution vector x to be nonnegative, since it doesn't make sense to deal a flop with a negative frequency. Some code that solves nonnegative least squares problems is available here:
https://software.sandia.gov/appspack...8c-source.html
A (non-unique) set of flops and dealing frequencies satisfying the constraints in the list above is here:
http://pastebin.com/XKLYhsSt
More constraints might lead to a set which is larger but more faithful to the full game.