这是极大极小算法的代码片段。对于一个5乘5的矩阵来说,这似乎要花很多时间。我想引入一个变量来跟踪递归的深度并限制它。以下是完整代码的链接:http://ideone.com/e.js/pyFHRu
int MiniMax(char _board[25], player _player) {
int best_val = -INFINITY, index = 0;
std::list<int> move_list;
char best_moves[25] = {0};
generate_moves(_board, move_list);
while(!move_list.empty()) {
_board[move_list.front()] = _player.symbol;
cSymbol = _player.symbol;
int val = MinMove(_board, _player);
if(val > best_val) {
best_val = val;
index = 0;
best_moves[index] = move_list.front() + 1;
} else if(val == best_val) {
best_moves[++index] = move_list.front() + 1;
}
_board[move_list.front()] = 0;
move_list.pop_front();
}
if(index > 0) {
index = rand() % index;
}
return best_moves[index];
}
// finds best move for 'min player'
int MinMove(char _board[25], player _player) {
int pos_value = evaluate_position(_board, _player);
if(pos_value != -1) {
return pos_value;
}
int best_val = +INFINITY;
std::list<int> move_list;
generate_moves(_board, move_list);
while(!move_list.empty()) {
_player.symbol == 'X' ? cSymbol = 'O' : cSymbol = 'X';
_board[move_list.front()] = cSymbol;
int val = MaxMove(_board, _player);
if(val < best_val) {
best_val = val;
}
_board[move_list.front()] = 0;
move_list.pop_front();
}
return best_val;
}
// finds best move for 'max player'
int MaxMove(char _board[25], player _player) {
int pos_value = evaluate_position(_board, _player);
if(pos_value != -1) {
return pos_value;
}
int best_val = -INFINITY;
std::list<int> move_list;
generate_moves(_board, move_list);
while(!move_list.empty()) {
_player.symbol == 'X' ? cSymbol = 'X' : cSymbol = 'O';
_board[move_list.front()] = cSymbol;
int val = MinMove(_board, _player);
if(val > best_val) {
best_val = val;
}
_board[move_list.front()] = 0;
move_list.pop_front();
}
return best_val;
}
如果您已经在使用较小的深度,那么您必须计算启发式方法。启发式是介于 -1 和 1 之间的值,显示位置评估。如果你的深度为 10(你计算 10 层),那么当你到达评估的最终位置(深度为 0 或有人赢了)时,你需要计算启发式方法。
因此,我们可以达到具有有限最大深度的MiniMax算法,如果游戏未获胜,您可以使用启发式函数计算结果位置的评估。如果您想使用启发式算法消除评估树中看似无用的分支,以进一步优化评估时间,那么您可以使用Alpha Beta修剪,在这里和这里查看更多信息。
我正在努力创造这个游戏https://en.wikipedia.org/wiki/Conway然而,每当我尝试使用printBoard方法时,我都会遇到以下错误 线程“main”java中出现异常。lang.ArrayIndexOutOfBoundsException:索引5超出长度5的界限。 我怎样才能解决这个问题?谢谢
我对编码还是个新手,所以请耐心听我说,我只是在尝试一些方法来洗牌一个数组,以便最终在我用Java创建的纸牌游戏中洗牌。我知道索引5超出了长度5的界限,但令我困惑的是错误并不总是弹出。有时我试着运行我的代码,它工作得很好,而另一些时候,即使我在运行代码期间没有更改任何内容,我也会出现错误。 我不知道如何改变有缺陷的线条,任何建议都欢迎!***我尝试更改字符串中的字母数,但错误随之改变,即“索引6 o
我对编码很陌生,所以请耐心听我说,我只是在尝试洗牌数组的方法,以便最终在我Java创建的纸牌游戏中洗牌。我知道索引5超出了长度5的范围,但令我困惑的是错误并不总是会弹出。有时我试图运行我的代码,它工作得很好,有时我得到了错误,即使我在运行它的两次之间没有改变任何东西。 我不知道如何更改有缺陷的线条,欢迎提出任何建议!***我尝试过更改字符串中的字母数,但错误随之改变,即“索引6超出长度6的界限”
我如何从弹性搜索中获得所有的结果,因为结果只显示限制只有10个。我得到了一个查询,如下所示:
本文向大家介绍唯一索引比普通索引快吗, 为什么?相关面试题,主要包含被问及唯一索引比普通索引快吗, 为什么?时的应答技巧和注意事项,需要的朋友参考一下 唯一索引不一定比普通索引快, 还可能慢. 查询时, 在未使用limit 1的情况下, 在匹配到一条数据后, 唯一索引即返回, 普通索引会继续匹配下一条数据, 发现不匹配后返回. 如此看来唯一索引少了一次匹配, 但实际上这个消耗微乎其微. 更新时,
本文向大家介绍什么是深度优先搜索?相关面试题,主要包含被问及什么是深度优先搜索?时的应答技巧和注意事项,需要的朋友参考一下 如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。深度优先搜索