标签: minimax

修剪算法

我很难理解为什么由于alpha-beta修剪而打印课程示例中的某些节点,因此我在Java中实现了Peter Norvig的alpha beta修剪版本.

With a tree like this:

                     max
                  /    |     \
    min               min            min
  / / |              / | \          / | \
 3 12 8             2  3  9        14 1  8
Run Code Online (Sandbox Code Playgroud)

教科书说,应该扩展的唯一终端节点是

3, 12, 8, 2, 14, 1
Run Code Online (Sandbox Code Playgroud)

以该顺序.

我的算法打印:

visited leaf with value 3
visited leaf with value 12
visited leaf with value 2
visited leaf with value 3
visited leaf with value 14
visited leaf with value 1
visited leaf with value 8
Root value 3 …
Run Code Online (Sandbox Code Playgroud)

java algorithm minimax

2
推荐指数
1
解决办法
2789
查看次数

适用于Android Reversi游戏的Minimax/Alpha Beta

我必须为Android实施一个Reversi游戏.我已经设法实现了所有游戏,功能齐全,但问题是我没有AI.实际上,在每次移动时,计算机都会移动到能够获得最多件数的位置.

我决定实现alpha-beta修剪算法.我在互联网上做了很多关于它的研究,但我无法得出最终结论如何去做.我试图实现一些功能,但我无法实现所需的行为.

我的电路板存储在类Board中(在这个类中,每个播放器占用的部分存储在一个二维int数组中).我附上了一张小图(抱歉看起来很像).

图:https://docs.google.com/file/d/0Bzv8B0L32Z8lSUhKNjdXaWsza0E/edit

我需要帮助来弄清楚如何在我的实现中使用minimax算法.

到目前为止我所理解的是,我必须对董事会的价值进行评估.

为了计算董事会的价值,我必须考虑以下因素: - 免费角落(我的问题是我必须只关注自由角落,或者我现在可以采取的角落?!这里的困境) . - 董事会的动力:检查当前移动后可移动的件数. - 板的稳定性......我知道这意味着无法在板上翻转的件数. - 此举将为我提供的件数

我计划实现一个新的类BoardAI,它将把我的Board对象和部门作为参数.

你能否告诉我一个合理的思路如何实现这个AI?我在dept中计算时需要一些关于递归的帮助,我不明白它是如何计算最佳选择的.

谢谢!

java android artificial-intelligence minimax alpha-beta-pruning

2
推荐指数
1
解决办法
3422
查看次数

Haskell递归Minimax树

我正在尝试使用minimax算法在Haskell中编写一个Tic Tac Toe程序.我构建了自己的"Rose a"数据类型,如下所示:

data Rose a = a :> [Rose a]
Run Code Online (Sandbox Code Playgroud)

这是我想要"存储"我的minimax树的数据类型.我理解minimax算法是如何工作的,但似乎无法在递归函数中实现它.

minimax :: Player -> Rose Board -> Rose Int
minimax p (r :> [])   | hasWinner r == Just p              = 1  :> []
                      | hasWinner r == Just (nextPlayer p) = (-1) :> []
                      | otherwise                          = 0  :> []
minimax p (r :> rs)   = maximum(map root xs) :> xs
    where xs = map (minimax' (nextPlayer p)) rs

minimax' :: Player -> Rose Board -> …
Run Code Online (Sandbox Code Playgroud)

algorithm recursion haskell minimax

2
推荐指数
1
解决办法
2546
查看次数

Java中用于TicTacToe AI的最简单的MiniMax算法

我试图了解MiniMax算法,并且已经阅读了它。我最初的方法是实现一个简单的MiniMax算法,然后添加alpha-beta修剪。但这是我当前的代码:

public int miniMax(char[] node, int playerNum)
{
    int victor = checkWin(node); // returns 0 if game is ongoing, 1 for p1, 2 for p2, 3 for tie.
    if(victor != 0) //game over .
        return score(victor);   

    if(playerNum == 2) //AI
    {
        int bestVal = Integer.MIN_VALUE;
        int bestSpot = 0;
        for(int i = 0; i < node.length; i++)
        {
            if(node[i] != '-')
                continue;
            node[i] = getSymbol(playerNum);
            int value = miniMax(node, 1); 
            if(value > bestVal)
            {
                bestVal = value;
                bestSpot = i; …
Run Code Online (Sandbox Code Playgroud)

java algorithm artificial-intelligence minimax

2
推荐指数
1
解决办法
4502
查看次数

“浮动”的最大值是多少?

当我检查“float.MaxValue”的值时,我得到:

3.402823E+38

即:

340,282,300,000,000,000,000,000,000,000,000,000,000

那么为什么当我试图将一个小得多的值设置为一个浮点变量时:

浮动 myValue = 1234567890123456789024;

然后我收到一条错误消息:

“积分常数太大” ?

这个值比“3.402823E+38”小得多,为什么我会收到错误消息?

c# variables compiler-errors minimax

2
推荐指数
1
解决办法
1万
查看次数

如何在Tictactoe中实现minimax

我读了这个答案,它让我很困惑:TicTacToe AI做出错误的决定

有人可以帮我理解如何将它应用于Tictactoe吗?

  1. 我将如何"在树上工作?
  2. 我怎么创建一个移动树?

注意:我目前有一个Board类,它存储有关游戏的状态(例如,游戏是否与当前移动一起完成?,是否有赢家?等)当前板上的每个移动都存储为1 - 9(左上角)在行的右下角).我可以轻松地复制当前的电路板状态.我可以返回"X"和"O"的当前移动列表,以及来自Board的可用移动.

algorithm minimax

1
推荐指数
1
解决办法
9421
查看次数

在没有递归的情况下实现Minimax

我正在建造一个Tic Tac Toe解决机器人.为了练习,我使用minimax算法编写了一个Tic Tac Toe游戏,该算法非常有效.当我想将代码移植到控制器时,我发现该控制器的C/C++编译器都不支持递归函数.因此,我需要帮助将此递归minimax函数转换为使用迭代或内部堆栈的函数:

int miniMax (char board[BOARD_DIM][BOARD_DIM], _Bool minNode, int *xBest, int *yBest)
{
    int possibleMoves[NSQUARES][2];
    int nPossibleMoves = generateMoves(board, possibleMoves);
    char boardChild [BOARD_DIM][BOARD_DIM];
    int ind, x_ind, y_ind;
    int minScore, maxScore;
    if (gameOver(board))
        return evaluateState(board);
    else if (minNode)
    {
        minScore = +INFINITY;
        for (ind = 0 ; ind < nPossibleMoves; ind++) 
        {
            duplicateBoard(board, boardChild);
            x_ind = possibleMoves[ind][0];
            y_ind = possibleMoves[ind][1];
            updateboard(boardChild, x_ind, y_ind, cPlayer);
            int score = miniMax(boardChild,!minNode ,&x_ind ,&y_ind);
            if (minScore > score)
                minScore = score;
        } …
Run Code Online (Sandbox Code Playgroud)

c c++ recursion tic-tac-toe minimax

1
推荐指数
1
解决办法
2048
查看次数

确定tic tac toe的最佳动作

我想编写一个递归函数来确定给定的tic - tac - toe游戏中的最佳移动

int nextMove(struct Game g, enum Symbol player) {
if (game_over(g) != 0) {
return -1;
}
int i, j;
int score, end;
for(i = 0; i < 3; i += 1) {
    for (j = 0; j < 3; j += 1) {
        if(g.board.fields[i][j] == 0) {
            g.board.fields[i][j] = player;
            score = nextMove(g, -player);
        }
    }
}
end = game_over(g)
}
Run Code Online (Sandbox Code Playgroud)

我的game_over功能:

enum Symbol game_over(struct Game g)
{
int x, y = x = 0; …
Run Code Online (Sandbox Code Playgroud)

c recursion minimax

0
推荐指数
1
解决办法
1116
查看次数

在 Tic Tac Toe 中为 AI 实施“难度”级别的有效方法是什么?

我正在开发一个简单的 Tic Tac Toe android 应用程序,支持 1 或 2 个玩家。我已经为 1 人模式实现了一个 AI,它使用 minimax 算法来完美地玩(赢或平)。我想允许用户可以在简单、中等和困难之间切换。我有哪些方法可以实现这一目标?

我的第一个想法是在随机移动或完美移动之间随机选择。做出完美移动的概率为中等为 60%,简单为 10%。任何其他想法或修改?

java android artificial-intelligence minimax

-1
推荐指数
1
解决办法
697
查看次数