I think to achieve this you would need to add a normalizing step after each iteration (or after each x number of iterations) and kind of shovel the regrets for hands around so that they end up to be the action sequences that you want to have.
This is just speculating now but you'll probably want to have some kind of order of hands by their regret values and then move the ones that are closer to the bucket that you need to redistribute to over.
For example:
You have three different hands that have the following action probabilities based on accumulated regret:
Code:
A: 0/0/100
B: 0/50/50
C: 50/50/0
==========
17/33/50
But you want to achieve:
Code:
50/0/50
Intuitively I would shift all of C's call actions and all of B's call actions to fold to achieve this. This example is probably too easy to solve but essentially we need more folds and less calls so at first we move percentage points from the action triplet that's closest to 100/0/0.
If I had to put this in an algorithm then it would look something like this:
Code:
1) Calculate action frequency for each action over all hands (in integer percentages for simplicity)
2) Decide which action we need to move from and which we need to move to (constraint, only neighboring moves are allowed, not fold->raise or raise-> fold)
3) Calculated which hand's frequency is closest to (but different from) the desired 100% action that we want to move to (or any other metric)
4) Move one percentage point over (or all or a fraction)
5) Recalculate overall action frequency
6) If we still need to adjust, repeat from step 2, otherwise stop.
There probably is a way to do this "online" while doing your regular CFRM iterations, possibly by filtering the regret into the action frequency that you want (aka dropping the regret for actions that are beyond the desired threshold) but I currently can't think of a way that wouldn't lead to uniform action frequencies across all hands that way.