jjzjj

java - 具有昂贵的自定义键功能的列表的最大值

在Java中查找您编写的序列的最大元素:GameStatebestGs=Collections.max(ns,Comparator.comparing(e->minimax(e)));这里的minimax是一个返回数字的函数,ns是一个集合。该代码有效,但将为集合中的每个元素多次评估键函数。我该怎么做才能使每个元素只评估一次?在Python中,您只需编写max(seq,key=lambdae:minimax(e))Java中一定有类似的东西吗?别让我自己写forloop,现在是21世纪我不应该写!显式循环代码如下:GameStatebest=null;//Doesn'tmatterwh

java - TicTacToe minimax 算法在 4x4 游戏中返回意外结果

在我的方法newminimax499中,我有一个利用内存和alphabeta修剪的minimax算法。该方法通常适用于3x3游戏,但是当我玩4x4游戏时,我会得到奇怪的、意想不到的计算机位置选择。他仍然从不输,但他似乎并不是为了赢而比赛。为了说明这里的问题,我们使用2个3x3和4x4游戏的场景。首先是一个3x3游戏的场景,其中玩家是X并迈出第一步:这还不错,事实上,这正是人们希望计算机执行的操作。现在来看一个4x4游戏的场景。同样,O是计算机,X启动:如您所见,计算机只是将Os一个接一个地按系统顺序排列,只有在它有可能获胜时才打破该顺序来阻止X。这是非常防守的打法,不像在3x3比赛中看

java - Tic Tac Toe 的 Minimax 算法中的错误

我目前正在尝试自学Minimax算法,并尝试在井字游戏中用Java实现它。但是我的算法中有一个错误,我无法弄清楚是什么导致了它。下面是完整的源代码(对不起,文字墙!):publicclassTicTacToe{privatestaticbooleangameEnded=false;privatestaticbooleanplayer=true;privatestaticScannerin=newScanner(System.in);privatestaticBoardboard=newBoard();publicstaticvoidmain(String[]args){System.o

java - 使用 minimax 的 tic-tac-toe 可以使用多少个线程?

让我们以5x5井字游戏为例。假设轮到我的AI了。然后,我走25步(基本上每个单元格,当然,如果它是合法的移动),为每个Action创建一个线程(总共(最多)25个线程),对每一步都调用一个minimax函数,然后当所有结果都来自每个线程时,比较得分并选择得分最高的着法。这是我的问题:使用25个线程是否高效?使用25个线程意味着什么?它是否快了25倍(很可能不是)?它取决于什么?当然是在计算机上,但是我如何根据计算机的资源知道可以使用多少线程呢?如果我使用太多线程会怎样(我猜没什么……)?我的想法好吗?谢谢。 最佳答案 对于典型的计算

基于Minimax和Alpha-Beta剪枝实现的C语言五子棋AI入门

😎五子棋工程需求→设计→编码→测试→发布前言五子棋AI是上大学第一学期做的第一个工程,其中断断续续做了近一个月时间,其中的思路和估值参考了许多这位大神的作品lihongxun,但其中有些算法功能还未能完全掌握运用,不过目前棋力很多时候已不输于其AI。由于没有掌握C++,而项目开始时过于自信,虽然程序中用了类,但实则为一个实实在在的C语言项目,可以直接忽略其中类的部分。就以后学习数据结构和算法前,此版为最终版,但此版中还存在着很多问题,其中最严重的就是由于拓展时建立了很多节点,当搜索广度为10,深度为时时,未经剪枝,则会创建约10^10个节点而每个节点都存有棋盘和下一步的点位棋盘,因此怀疑是内存

c++ - 极小极大递归究竟是如何工作的?

所以我正在查找井字游戏的Mini-max,但不明白递归是如何工作的?好的,基本上我的问题是:minimax如何知道轮到谁了?指示轮到哪个玩家的最佳方式是什么?您如何生成可能的Action?如何知道自己何时处于终端节点,以及如何生成终端节点?例如在这个伪代码中functionintegerminimax(node,depth)ifnodeisaterminalnodeordepthnode是一block正确的板吗?代码在递归中必须下降多少层?还有什么是max函数以及从哪里生成节点?现在,到目前为止,我已经有了创建看板的代码:classBoard{public:Board();~Board

c++ - 将带 alpha beta 剪枝的 minimax 转换为 negamax

我写了一个minimax算法与alphabetapruning对于游戏Checkers,现在我正在尝试使用negamax重写它方法。我希望这两者是等价的,因为negamax只是一种编写minimax的技术。但出于某种原因,我的两种算法表现不同。当我在相同的输入上运行它们时,negamax版本似乎评估更多状态,所以我认为alphabeta修剪一定有问题。下面的代码显示了两种算法(minimax和negamax函数),以及底部的play函数,我从中调用它们。evaluate函数是我用来评估两种算法状态的基本启发式方法。如果您能帮助我们发现错误,我们将不胜感激。#include"player

c++ - 一个简单的国际象棋 Minimax

我自己的国际象棋引擎使用minimax算法搜索国际象棋走法有问题我使用5层深度搜索并且只有Material/奖励/移动性评估,但即使我给出它也会做出愚蠢的移动并牺牲有值(value)的棋子对他们无穷大(这肯定是一个搜索问题),我没有使用任何类型的修剪,并在几秒钟内给出了5深度搜索结果。我在这个问题上被困了一个星期,我确信问题出在回溯而不是国际象棋逻辑(所以没有国际象棋背景的人都会解决这个问题:))我搜索了很多这是我的第一个问题在StackOverflow中,我希望你们不会让我失望:)这是简单的搜索代码intGameControl::Evaluate(ChessBoard_B){intm

c++ - 换位表会不会导致搜索不稳定

我正在编写一个国际象棋引擎,最近添加了一个换位表。在运行一些测试时,我发现虽然搜索仍然返回相同的最佳着法,但着法的值(value)(对最大化玩家的好处)波动了。这是换位表的正常行为吗?我记得读过一个转置表会导致搜索不稳定。这是什么意思?那么这是我的代码中的正常现象还是严重错误? 最佳答案 是的,换位表引入了搜索不稳定性。幸运的是,这种情况很少发生,换位表的优势远远超过了它的复杂性。1。转置表的作用是什么?在您的程序中添加换位表(TT)后,您应该注意到两个主要区别:改善着法顺序:从TT开始的着法通常是可能的最佳着法Earlycutof

c++ - 返回 tic tac toe 的 minimax 算法中的最佳 Move

我曾尝试编写RusselNorvig关于人工智能的书中给出的tic-tac-toe的minimax算法。它拥有一切,除了将bestMove返回给用户的方法。我正在努力返回bestMove,但无法决定何时选择bestMove。帮忙,有人吗?moveTMiniMax(stateTstate){moveTbestMove;max_move(state,bestMove);returnbestMove;}intmax_move(stateTstate,int&bestMove){intv=-10000;if(GameIsOver(state)){returnEvaluateStaticPosi
12