Poker-AI.org http://poker-ai.org/phpbb/ |
|
Algorithm to count outs ? http://poker-ai.org/phpbb/viewtopic.php?f=24&t=2567 |
Page 1 of 1 |
Author: | shadehs [ Thu Aug 29, 2013 7:10 am ] |
Post subject: | Algorithm to count outs ? |
How can i count the outs on a given board, knowing my cards and my opponents' range ? |
Author: | AiWins [ Thu Aug 29, 2013 10:36 pm ] |
Post subject: | Re: Algorithm to count outs ? |
The outs counting system is a heuristic for humans who have no effective way of knowing their opponent's hand. If you want to calculate outs agaisnst a range of hands, you would then have an array of outs, one for each of opponent's hand. Also, outs to what? To beat him? In that case A2o vs 74o on a KQJ5r board, has 44 outs. All in all, outs are a naive system, and if you still want to use them, then you do not need opponent's range, for such complex calculations you can achieve much better results by calculating equity directly. Doesn't the following code seem silly? Code: float Flop_Draw(Outs) { switch (outs) { case 0: return 0; case 1: return 4,4; etc... } float ProbabilityDraw(Board,Hand) { Outs=HowManyOuts(Board,Hand); return Flop_Draw_Odds(Outs); } Why even include Outs? |
Author: | Sharkfacepoker [ Fri Aug 30, 2013 12:24 am ] |
Post subject: | Re: Algorithm to count outs ? |
shadehs wrote: How can i count the outs on a given board, knowing my cards and my opponents' range ? I have done this with single hands but the same would apply to a range except you might want "average" outs since each individual hand in the range gives different outs. An array of all the opponenthands including yours. int totalouts = 0; foreach(hand in opponenthand) foreach(car in remainingcard) evaluate your and vs opponenthand if your win+ties > than opponents win+ties outs++ //averaging the total outs totalOuts = totalouts / opponenthands I use your hand vs opponent range assuming you have only one opponent. But, it can be applied more generically by n opponents with n ranges. I use who has the highest win + tie because if you had say 5 people in the hand the highest win+tie could be under 50% but that person is still better off than the remaining players. |
Author: | AiWins [ Fri Aug 30, 2013 4:37 am ] |
Post subject: | Re: Algorithm to count outs ? |
Sharkfacepoker wrote: shadehs wrote: How can i count the outs on a given board, knowing my cards and my opponents' range ? I have done this with single hands but the same would apply to a range except you might want "average" outs since each individual hand in the range gives different outs. An array of all the opponenthands including yours. int totalouts = 0; foreach(hand in opponenthand) foreach(car in remainingcard) evaluate your and vs opponenthand if your win+ties > than opponents win+ties outs++ //averaging the total outs totalOuts = totalouts / opponenthands I use your hand vs opponent range assuming you have only one opponent. But, it can be applied more generically by n opponents with n ranges. I use who has the highest win + tie because if you had say 5 people in the hand the highest win+tie could be under 50% but that person is still better off than the remaining players. That's too naive. for 23s on a QKA board with a flush draw, you really don't need to do all that, there's thousands of similar cases where you just have the same amount of outs for a lot of hands in his range. Perhaps if you told us why you want to know the amount of outs. |
Author: | Sharkfacepoker [ Fri Aug 30, 2013 4:52 am ] |
Post subject: | Re: Algorithm to count outs ? |
AiWins wrote: Sharkfacepoker wrote: shadehs wrote: How can i count the outs on a given board, knowing my cards and my opponents' range ? I have done this with single hands but the same would apply to a range except you might want "average" outs since each individual hand in the range gives different outs. An array of all the opponenthands including yours. int totalouts = 0; foreach(hand in opponenthand) foreach(car in remainingcard) evaluate your and vs opponenthand if your win+ties > than opponents win+ties outs++ //averaging the total outs totalOuts = totalouts / opponenthands I use your hand vs opponent range assuming you have only one opponent. But, it can be applied more generically by n opponents with n ranges. I use who has the highest win + tie because if you had say 5 people in the hand the highest win+tie could be under 50% but that person is still better off than the remaining players. That's too naive. for 23s on a QKA board with a flush draw, you really don't need to do all that, there's thousands of similar cases where you just have the same amount of outs for a lot of hands in his range. Perhaps if you told us why you want to know the amount of outs. How it that too naïve ? It's enumeration not Monte Carlo so if he wanted to know an "average" over the possible specific hands that would give it an exact amount. Now weather he uses win/tie or equity depends on what he is evaluating. |
Author: | AiWins [ Fri Aug 30, 2013 4:59 am ] |
Post subject: | Re: Algorithm to count outs ? |
I just did , most of the time you are going to have the same amount of outs against every significant hand. And some random hands, you will have some random outs: Imagine a hand where you have 40 outs to beat 50% of his range and 2 outs to beat the other 50% of his range. Is there any situation where returning the average odds (21) useful? I reiterate, perhaps OP can tell us why. |
Author: | shadehs [ Fri Aug 30, 2013 7:45 am ] |
Post subject: | Re: Algorithm to count outs ? |
Of course it has no sense to calculate outs if i am winning the hand. I know that i'm winning from a MonteCarlo simulation of my hand against the range of villains. If i'm losing, i need the number of outs for this formula if i have the odds to call his bet: Code: var outOdds = OutOdds(); var potOdds = PotOdds(); if (BetRound == Rounds.Flop) return (outOdds * 2.0) > potOdds; if (BetRound == Rounds.Turn) return (outOdds * 1.2) > potOdds; But actually i can't get a formula to count the outs that it's working good. |
Author: | Sharkfacepoker [ Fri Aug 30, 2013 12:34 pm ] |
Post subject: | Re: Algorithm to count outs ? |
AiWins wrote: I just did , most of the time you are going to have the same amount of outs against every significant hand. And some random hands, you will have some random outs: Imagine a hand where you have 40 outs to beat 50% of his range and 2 outs to beat the other 50% of his range. Is there any situation where returning the average odds (21) useful? I reiterate, perhaps OP can tell us why. Here is an app I have which does what you are looking for minus the "range" part. Instead this one is vs all possible remaining hands. In this case I take all remaining turn cards possible and then all remaining hands minus the turn so foreach(var card in cards) foreach(var hand in hands) If the average for each card is >=50 of the 1035 possible opponents then I grant that card an out. In my case its against only one opponent that has the full range but the logic could be used against multiple opponents each with their own range. You can see the outs as well and the implied odds really are the "reverse" implied odds since its how much more you need to get if you do make then called when you do not have the proper odds. So I don't think the logic is really naïve in this case. I think this is what you are looking for. |
Author: | shadehs [ Fri Aug 30, 2013 7:50 pm ] |
Post subject: | Re: Algorithm to count outs ? |
Yes, thank you. I'm making some experiments with xpokerequity and your code actually works. Counting the correct outs will be a HUGE improvement to my bot |
Page 1 of 1 | All times are UTC |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |