- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用java构建一个针对AI计算机玩家的tic_tac_toe(棋盘)游戏,我为计算机编写了一个MiniMax算法。板的宽度可以改变,如 3*3 或 4*4。和
when i run the game with 3*3 board the computer player workingvery well, but when i tried 4*4 board, the computer player doesn'twork it's just taking a lot of time in his turn and then nothing justwaiting until i stop the game.And here is a screen shoot what's happening.
这是我编写的 MiniMax 算法:
private Pair<Integer, State> maxMove(State b) {
if(b.isWin('X') || b.isFinished())
return new Pair<>(b.eval('X'), b);
else{
int max = -222, temp;
Pair<Integer, State> p = null;
for (State s : b.allNextMoves('O')){
temp = minMove(s).getKey();
if (temp > max){
max = temp;
p = new Pair<>(s.eval('X'), s);
}
}
return p;
}
}
private Pair<Integer, State> minMove(State b) {
if(b.isWin('O') || b.isFinished())
return new Pair<>(b.eval('O'), b);
else{
int min = 222, temp;
Pair<Integer, State> p = null;
for (State s : b.allNextMoves('X')){
temp = maxMove(s).getKey();
if (temp < min){
min = temp;
p = new Pair<>(s.eval('O'), s);
}
}
return p;
}
}
eval函数是评估网格,我只是将其作为样本来遵循,这是函数:
public int eval(char player) {
if (isWin(player))
return -1;
else
return 0;
}
有人知道为什么会发生这种情况吗?
allNextMoves(char c)
函数将采用该棋盘并尝试通过找到棋盘中的第一个空字符并输入“X”或“O”来找到该棋盘的所有可能的移动根据玩家的回合,返回新棋盘列表,代码如下。
public List<State> allNextMoves(char player) {
List<State> nextBoards = new LinkedList<>();
for (int i = 0; i < width; i++) {
for (int j = 0; j < width; j++) {
if (board[i][j] == ' ') {
State nextBoard = new State(this);
nextBoard.play(i, j, player);
nextBoards.add(nextBoard);
}
}
}
return nextBoards;
}
最佳答案
极小极大算法不响应的原因是,对于 4x4 网格,要访问的板数量要多得多。
首先,我发现您的算法将继续搜索,直到获胜或平局,这意味着大量搜索路径将完全填满棋盘。在你的第一个 Action 之后,还剩下 15 个回合,每个回合分别有 15、14、13、... 1 个替代 Action 可供选择。所以有接近15个!董事会国家参观。由于会发现(非受迫性)胜利,所以这个数字有点少,但仍然是 15!是对尺寸的一个很好的粗略估计。
在 3x3 棋盘中,这个数字只有 8!
比较两个数字:
8! = 40 230
15! = 1 307 674 368 000
因此,在 4x4 棋盘中进行搜索将比在 3x3 棋盘中花费大约 3000 万倍的时间。
可以采取多种措施,也可以将这些措施结合起来。这不是完整的列表,而是我将按顺序处理的事情的列表:
当搜索深度过大时,需要停止搜索。有几种方法可以决定何时停止:
当您限制搜索时,您需要一个评估函数来给出状态值,而无需进行更深入的搜索。这将具有一定的启发值(value)。例如,它可以计算玩家仍然可以获胜的行数(如果对手打得不好),并将其与对手 View 中的相同数字进行抵消。
可以通过不同的移动路径达到相同的棋盘状态。例如,如果两个玩家交换了他们的第一步和第二步,那么您将进入相同的棋盘状态。
此外,多个状态通过沿 X、Y 或对角轴镜像来相互映射。
通过维护先前评估状态的哈希表(还管理镜像方面),您可以避免进行搜索,这本质上是重复的。
alpha-beta算法进行的剪枝不会影响结果。它给出与极小极大算法相同的结果。
在极端情况下,当前棋盘可能距离获胜仅一步之遥,但如果这是考虑的最后一步,则需要花费大量时间来寻找其他一步。因此,如果您可以首先以最有希望的 Action 最先完成的方式对 Action 进行排序,您将赢得时间:alpha beta 修剪将更加有效。
您可以根据棋子是否位于被“许多”对手棋子占据的线上来对棋子进行排名,或者当这没有区别时,首先处理中心和角棋子,因为它们比边界棋子可以参与更多的解决方案.
如果在采取某种行动后,您发现回复是救命稻草,或者是强制获胜的关键举措,那么首先尝试相同的回复可能会有所返回,而不是最初的行动,而替代行动是玩过。
关于java - Tic_Tac_Toe_对抗计算机 使用 MiniMax 算法,当计算机轮到 4*4 棋盘时,它玩得不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59485184/
我正在为一个小游戏实现 minimax,我注意到一些我称之为“拖延”的事情。归结为一个非常简单的例子: 在夺旗游戏中,旗帜在玩家 A 上方一格,玩家 B 距离玩家 50 格。轮到 A,他可以向前搜索
我正在努力使用 miniMax 算法构建一个基本的 tictactoe 游戏,并且我在 JavaScript 中有一个可以运行的实现。然而,我正在向它提供一些测试板状态,但它似乎没有按我预期的方式工作
我正在为 Connect 4 编写 MiniMax 代码。基本上,我有一个 SimpleMiniMax 类,它有一个方法 minimax (接受 grid 的输入),该方法应该返回类 Move 的实例
我正在尝试用 Java 编写一个小型 AI 算法来实现 miniMax 算法。 此游戏所基于的游戏是双人游戏,两名玩家每回合各走一步,每个棋盘位置都会导致每位玩家得分。玩家 X 位置的“质量”是通过从
我正在为一个简单的国际象棋引擎制作一个极小极大算法,但是遇到了一些困难。我已经运行了我的代码几个小时但无济于事,它似乎仍然输出错误的结果;当我威胁它的一个棋子并且它有一个有效的移动可以挽救该棋子时,它
我正在构建一个 Tic Tac Toe 解决机器人。为了练习,我使用 minimax 算法写了一个 Tic Tac Toe 游戏,效果很好。当我想将我的代码移植到 Controller 时,我发现这个
我目前正在使用 C# 开发针对 AI 的西洋跳棋游戏。我尝试使用 minimax 算法来实现 AI。尽管我的功能有效,但它选择的 Action 根本不符合逻辑。我用很多游戏和算法测试了它,当有很多更好
我正在设计一款 3D 井字棋游戏,发现时间限制了我的 Minimax 算法的深度。虽然深度达到 6 在很大程度上是无关紧要的时间 (Depth 7 = 6 seconds >Depth 8 = 49
我正在使用 Realm of Racket 中给出的 stub 为滴答游戏构建 AI。书作为依据。到目前为止,一切进展顺利。但是,当我尝试运行我的 minimax 时树根上的函数,它返回一个列表,其中
我正在尝试用 C 语言创建完美的井字游戏。我正在使用 2D 数组来跟踪棋盘。 我已将问题缩小到我的 minimax 函数对每个潜在移动进行评分的方式,但我在调试它时遇到了麻烦,因为错误通常发生在第二步
我在 Python 中为基本的井字棋 AI 实现了一个极小极大算法,如下所示: def minimax(currentBoard, player): if isGameOver(current
我正在研究 Minimax 算法来构建五子棋游戏。我对 Minimax 的问题是,在子节点中具有相同的评估值,这是真正添加到父节点或随机添加的。 Example tree from Wiki 所以从上
考虑到我正在从头开始构建井字游戏,我目前正在尝试使用 minimax 算法,这样我就可以让计算机作为玩家 1,而我自己作为玩家 2。我想我理解 minimax 算法(作为某种形式的深度第一次搜索)。
据我所知,最简单形式的 Minimax 算法的工作方式如下:自下而上遍历游戏树,如果轮到玩家,则将所有子节点的最大分数分配给当前节点,否则最低分数。叶子根据游戏输出进行评分,比方说赢+1,平0,输-1
我正在尝试打印出 Mini Max 的访问状态和效用。当值从终端状态返回到其根时,我遇到了问题,从而导致我访问的状态实用程序值中的 4 个不正确。我只是不知道是什么原因导致了这个错误。我很确定我的 M
我正在使用带 alpha-beta 剪枝的极小极大算法编写黑白棋引擎。它工作正常,但我发现了以下问题: 当算法发现位置丢失时,它会按预期返回 -INFINITY,但在在这种情况下,我无法追踪“最佳”走
我自己的国际象棋引擎使用 minimax 算法搜索国际象棋走法有问题我使用 5 层深度搜索并且只有 Material /奖励/移动性评估,但即使我给出它也会做出愚蠢的移动并牺牲有值(value)的棋子
我正在尝试实现一个使用 Minimax 进行点和框游戏的 AI (http://en.wikipedia.org/wiki/Dots_and_Boxes) 这是我目前所拥有的: public
我正在尝试让 minmax 算法(计算机 AI)在我的井字游戏中发挥作用。我已经坚持了好几天了。从本质上讲,我不明白为什么计算机 AI 只是简单地将它的标记 ("O") 从棋盘 block 0-8 中
我的目标摘要:弄清楚在使用我认为不能进行尾递归的算法时,如何使用连续传递样式来避免堆栈溢出。或者,找到一种方法使函数尾递归。 详情: 我是 F# 的新手(以及一般的函数式编程),我正在尝试使用 alp
我是一名优秀的程序员,十分优秀!