这是我的gomoku AI的代码。所以现在我的AI目前运行超过5秒,但时限是5秒。我正在努力提高性能,所以我尝试移动排序,但似乎不起作用。我首先在getChildStates(int player)函数中计算得分,然后将向量按降序排序。但它不起作用。有人可以帮助我吗?
另外,我的深度是两个。运输表似乎没有帮助,所以我没有尝试过。
int minimax(int depth, GameState state, bool maximizingPlayer, int alpha, int beta)
{
if (depth == 2)
return state.score;
if (maximizingPlayer)
{
vector<GameState> children = state.getChildStates(1);
sort(children.begin(), children.end(), greaterA());
int best = MIN;
for (auto& value : children) {
int val = minimax(depth + 1, value,
false, alpha, beta);
int oldBest = best;
best = max(best, val);
alpha = max(alpha, best);
if (depth == 0 && oldBest != best){
bestMoveX = value.lastMove.x;
bestMoveY = value.lastMove.y;
}
// Alpha Beta Pruning
if (beta <= alpha)
break;
}
return best;
}
else
{
vector<GameState> children = state.getChildStates(2);
sort(children.begin(), children.end(),greaterA());
int best = MAX;
// Recur for left and right children
for (auto& value : children) {
int val = minimax(depth + 1, value,
true, alpha, beta);
best = min(best, val);
beta = min(beta, best);
// Alpha Beta Pruning
if (beta <= alpha)
break;
}
return best;
}
}
答案 0 :(得分:0)
我不建议对游戏状态进行排序以优先处理状态,从而根据设置的超时时间强制移动。即使使用alpha-beta修剪,minimax树也可能太大了。作为参考,您可以查看github上的GNU Chess。以下是一些减少最佳移动搜索时间的选项:
1)减少搜索深度。
2)从可能的行动中消除多余的动作。
3)在第一层使用多线程来获得速度
4)允许静止搜索模式,以便当人类对手仍在思考时,minimax树枝可以在后台继续生成。
5)您可以考虑重复使用minimax树,而不是为每次移动生成minimax树,您只需要修剪已经进行的移动,并且每次迭代仅继续生成一层(而不是整个树,see this article)