当前位置: 首页 > 知识库问答 >
问题:

我想通过引入深度来限制搜索级别,将无与伦比的tic-tac修改为5乘5块。有什么建议吗?

颜志业
2023-03-14

这是极大极小算法的代码片段。对于一个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个答案

宁飞宇
2023-03-14

如果您已经在使用较小的深度,那么您必须计算启发式方法。启发式是介于 -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的情况下, 在匹配到一条数据后, 唯一索引即返回, 普通索引会继续匹配下一条数据, 发现不匹配后返回. 如此看来唯一索引少了一次匹配, 但实际上这个消耗微乎其微. 更新时,

  • 本文向大家介绍什么是深度优先搜索?相关面试题,主要包含被问及什么是深度优先搜索?时的应答技巧和注意事项,需要的朋友参考一下 如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。深度优先搜索