我很难理解为什么由于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) 我必须为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
我正在尝试使用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) 我试图了解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) 当我检查“float.MaxValue”的值时,我得到:
3.402823E+38
即:
340,282,300,000,000,000,000,000,000,000,000,000,000
那么为什么当我试图将一个小得多的值设置为一个浮点变量时:
浮动 myValue = 1234567890123456789024;
然后我收到一条错误消息:
“积分常数太大” ?
这个值比“3.402823E+38”小得多,为什么我会收到错误消息?
我读了这个答案,它让我很困惑:TicTacToe AI做出错误的决定
有人可以帮我理解如何将它应用于Tictactoe吗?
注意:我目前有一个Board类,它存储有关游戏的状态(例如,游戏是否与当前移动一起完成?,是否有赢家?等)当前板上的每个移动都存储为1 - 9(左上角)在行的右下角).我可以轻松地复制当前的电路板状态.我可以返回"X"和"O"的当前移动列表,以及来自Board的可用移动.
我正在建造一个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) 我想编写一个递归函数来确定给定的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) 我正在开发一个简单的 Tic Tac Toe android 应用程序,支持 1 或 2 个玩家。我已经为 1 人模式实现了一个 AI,它使用 minimax 算法来完美地玩(赢或平)。我想允许用户可以在简单、中等和困难之间切换。我有哪些方法可以实现这一目标?
我的第一个想法是在随机移动或完美移动之间随机选择。做出完美移动的概率为中等为 60%,简单为 10%。任何其他想法或修改?