最近,我一直在研究Texas Holdem Limit,该比赛利用Monte Carlo来确定估计的获胜赔率,并返回执行最多的+ EV动作。
我正在遵循类似于CodeProject中的CatchExAs's Pokerbot Article的结构,该结构将获胜几率与阈值(例如CallableThresh,RaisableThresh)进行比较,以确定理想的动作。但是,我使用阈值按比例放大底池赔率,并将缩放后的底池赔率与当前获胜赔率进行比较,而CatchExAs计算了分层阈值以直接比较获胜赔率。
我已经通过让机器人与自己进行对抗来测试它们的功能。当机器人获得他们认为值得加注的牌手时,就会导致问题的产生,从而导致彼此重新举牌直到筹码耗尽。我认为问题是机器人没有考虑任何有效几率或暗示几率。
计算阈值:
void DummyStrategy::CalculateMinWinRates()
{
Snapshot CurrentShot = Orchastrator->GetAI()->GetSnapshot();
if (CurrentShot.Pot == 0 || CurrentShot.RequiredAnte == 0)
{
MinWinRate_Calling = Thresh_Calling * (100.0 / CurrentShot.PlayerAmt);
MinWinRate_RaisingBetting = Thresh_RaisingBetting * (100.0 / CurrentShot.PlayerAmt);
MinWinRate_Calling = MinWinRate_Calling > 100.0 ? 100.0 : MinWinRate_Calling;
MinWinRate_RaisingBetting = MinWinRate_RaisingBetting > 100.0 ? 100.0 : MinWinRate_RaisingBetting;
return;
}
double CallValue = (double)CurrentShot.RequiredAnte - (double)CurrentShot.CurrentAnte;
double PotOdds = CallValue / (CallValue + (double) CurrentShot.Pot);
MinWinRate_Calling = Thresh_Calling * PotOdds * 100.0;
MinWinRate_RaisingBetting = Thresh_RaisingBetting * PotOdds * 100.0;
MinWinRate_Calling = MinWinRate_Calling > 100.0 ? 100.0 : MinWinRate_Calling;
MinWinRate_RaisingBetting = MinWinRate_RaisingBetting > 100.0 ? 100.0 : MinWinRate_RaisingBetting;
}
阈值上升:
BettingAction DummyStrategy::DetermineIdealAction()
{
CalculateMinWinRates();
double CurrentWinRate = Orchastrator->GetAI()->DetermineWinRate();
if (CurrentWinRate >= MinWinRate_RaisingBetting)
return IsActionAvaliable(BettingAction::Bet) ? BettingAction::Bet : BettingAction::Raise;
else if (CurrentWinRate >= MinWinRate_Calling)
return BettingAction::Call;
else
return IsActionAvaliable(BettingAction::Check) ? BettingAction::Check : BettingAction::Fold;
return BettingAction::NONE;
}
所以我可以问两个问题:
由于没有完美的信息就无法精确确定有效或隐式赔率,是否有办法估算它们?
否则,机器人在执行移动之前如何考虑未来的加注/下注?