C++ 使Monte Carlo eval为Hexgame C++;

C++ 使Monte Carlo eval为Hexgame C++;,c++,multithreading,montecarlo,C++,Multithreading,Montecarlo,我正试图使我的蒙特卡罗评估函数多线程,这样我的游戏中的计算机播放器将更快。正常代码(无多线程)为: 使用名称空间std; int getMonteCarloEval(const State&board、Player、int trials) { 向量移动=board.getMoves(); int=0; 对于(int i=0;i

我正试图使我的蒙特卡罗评估函数多线程,这样我的游戏中的计算机播放器将更快。正常代码(无多线程)为:

使用名称空间std;
int getMonteCarloEval(const State&board、Player、int trials)
{
向量移动=board.getMoves();
int=0;
对于(int i=0;i
对于多线程,我有以下几点:

using namespace std;
vector<Move> moves;
atomic<int> wins = 0;

int getMonteCarloEval(const State &board, Player player, int trials)
{
    vector<Move> moves = board.getMoves();
    State mcBoard = board;
    size_t nr_threads = 8;
    vector<thread> workers;

    int delta = trials / nr_threads;
    int remainder = trials % nr_threads;
    int L = 0; int R = 0;

    for (int i = 0; i < nr_threads; i++) {
        R = L + delta;
        if (i == nr_threads - 1)
            R += remainder;
        workers.push_back(thread(mc, mcBoard, player, L, R));
        L = R;
    }
    for (auto &thread : workers) {
        thread.join();
    }

    return wins - trials / 2;
}

int getRandomEval(const State &board, Player)
{
    return rand() % 101 - 50;
}

int mc(const State &board, Player player, int L, int R)
{
    for (int i = L; i < R; i++)
    {
        State mcBoard = board;
        random_shuffle(moves.begin(), moves.end());
        for (Move m : moves)
            mcBoard.doMove(m);
        if (mcBoard.getWinner() == player)
            wins++;
    }
}
使用名称空间std;
矢量运动;
原子wins=0;
int getMonteCarloEval(const State&board、Player、int trials)
{
向量移动=board.getMoves();
状态mcBoard=板;
每根螺纹的尺寸=8;
媒介工作者;
int delta=试件/nr_螺纹;
int剩余=试验%n个螺纹;
int L=0;int R=0;
对于(inti=0;i
这里的问题是,现在的电脑播放器真的非常愚蠢。如果没有多线程,计算机播放器的播放速度很慢。 我还使用Alpha Berta修剪为计算机搜索最佳下一步


问题:有人知道我在使用多线程时做错了什么吗?

doMove
如何工作?有两个变量名为
moves
。一个全局(?)和一个本地
getMonteCarloEval
。这些不一样。另外,线程函数mc使用其中一个线程时,不会受到其他线程的保护,从而导致数据争用。@alexeykuzmin0
void State::doMove(const Move&Move){if(Move.first<0 | | Move.first>=size | | Move.second<0 | Move.second>=size)抛出“无效移动!”;if(六边形[Move.first*size+Move.second]!=玩家::无)抛出“六边形不是空的!”;六边形[move.first*size+move.second]=currentPlayer;currentPlayer=get对手();}
这对
nr_线程==1
有效吗?
using namespace std;
vector<Move> moves;
atomic<int> wins = 0;

int getMonteCarloEval(const State &board, Player player, int trials)
{
    vector<Move> moves = board.getMoves();
    State mcBoard = board;
    size_t nr_threads = 8;
    vector<thread> workers;

    int delta = trials / nr_threads;
    int remainder = trials % nr_threads;
    int L = 0; int R = 0;

    for (int i = 0; i < nr_threads; i++) {
        R = L + delta;
        if (i == nr_threads - 1)
            R += remainder;
        workers.push_back(thread(mc, mcBoard, player, L, R));
        L = R;
    }
    for (auto &thread : workers) {
        thread.join();
    }

    return wins - trials / 2;
}

int getRandomEval(const State &board, Player)
{
    return rand() % 101 - 50;
}

int mc(const State &board, Player player, int L, int R)
{
    for (int i = L; i < R; i++)
    {
        State mcBoard = board;
        random_shuffle(moves.begin(), moves.end());
        for (Move m : moves)
            mcBoard.doMove(m);
        if (mcBoard.getWinner() == player)
            wins++;
    }
}