Улучшение производительности с помощью библиотеки pokerstove

Я недавно начал использовать библиотеку 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 (из-за эквивалентности мастей), но я не нашел способа реализовать это поведение.

Любая помощь приветствуется!

1

Решение

Краткий ответ: как быстро это идет.

Более длинный ответ: эта версия является оценщиком общего назначения, способным оценить любую игру. Он не делает ничего такого, как кеширование результатов, предварительный расчет больших таблиц, использование подходящих изоморфизмов или что-то еще.

0

Другие решения


По вопросам рекламы [email protected]