Я недавно начал использовать библиотеку pokerstove (https://github.com/andrewprock/pokerstove) и сумел выполнить некоторые базовые оценки рук / эквити. К сожалению, как только я попытался написать немного более вычислительно дорогие программы, я столкнулся с огромными проблемами производительности, которые не могли понять, как с этим справиться.
В качестве примера я привел следующую программу, которая вычисляет среднее эквити, которое имеет пиковая рука Ace-6 против абсолютно случайной руки:
#include <iostream>
#include <vector>
#include <pokerstove/penum/ShowdownEnumerator.h>
int main() {
using namespace pokerstove;
using namespace std;
CardSet completeDeck;
completeDeck.fill();
cout << "The whole deck has " << completeDeck.size() << " cards" << endl;
CardDistribution anyTwo;
anyTwo.fill(completeDeck, 2);
cout << "There are " << anyTwo.size() << " two card combinations" << endl;
CardDistribution holeCards;
holeCards.parse("As6s");
ShowdownEnumerator showdown;
vector<EquityResult> result = showdown.calculateEquity(
vector<CardDistribution>{anyTwo, holeCards},
CardSet(""),
PokerHandEvaluator::alloc("h")
);
double shareRandom = result.at(0).winShares + result.at(0).tieShares;
double shareHand = result.at(1).winShares + result.at(1).tieShares;
double total = shareRandom + shareHand;
cout << "A random hand has " << shareRandom / total * 100 << " % equity (" << result.at(0).str() << ")" << endl;
cout << "The hand As6s has " << shareHand / total * 100 << " % equity (" << result.at(1).str() << ")" << endl;
}
Когда он, наконец, останавливается, он выводит
The whole deck has 52 cards
There are 1326 two card combinations
A random hand has 40.0942 % equity (804780676 36223609 0 0)
The hand As6s has 59.9058 % equity (1220344506 36223609 0 0)
На моей машине (которая, как я признаю, не особо быстрая) это вычисление занимает примерно 4 минуты! Поскольку это кажется неоправданно долгим, я считаю, что с этой реализацией должно быть что-то не так (с точки зрения производительности).
Следовательно, я был бы очень признателен, если бы кто-нибудь мог указать мне, где я делаю что-то не так / неэффективно.
Я подозреваю, что можно уменьшить число случайных рук с 1326 до 169 (из-за эквивалентности мастей), но я не нашел способа реализовать это поведение.
Любая помощь приветствуется!
Краткий ответ: как быстро это идет.
Более длинный ответ: эта версия является оценщиком общего назначения, способным оценить любую игру. Он не делает ничего такого, как кеширование результатов, предварительный расчет больших таблиц, использование подходящих изоморфизмов или что-то еще.