为了账号安全,请及时绑定邮箱和手机立即绑定

使用二叉搜索树进行 Alpha Beta 剪枝

使用二叉搜索树进行 Alpha Beta 剪枝

素胚勾勒不出你 2021-11-17 15:21:44
我正在使用此处找到的 Alpha-Beta 修剪示例来研究 Minimax 算法。在示例中,他们使用数组来实现搜索树。我遵循了这个例子,但也尝试用二叉搜索树来实现它。以下是我在树中使用的值:3、5、6、9、1、2、0、-1。最后的最佳值应该是 5。使用 BST 实现,我一直得到 2。我认为这是问题所在,但我不知道如何解决它:如果在尝试检查下一个值时看到叶节点停止获取空指针异常,我编写了代码以退出递归。但是相反,我认为它过早地停止搜索(基于我在使用调试器单步执行代码时看到的内容)。但是,如果我删除检查,则代码会在空指针上失败。有人可以指出我正确的方向吗?我究竟做错了什么?这是代码:public class AlphaBetaMiniMax {    private static BinarySearchTree myTree = new BinarySearchTree();    static int MAX = 1000;    static int MIN = -1000;    static int opt;    public static void main(String[] args) {        //Start constructing the game        AlphaBetaMiniMax demo = new AlphaBetaMiniMax();        //3, 5, 6, 9, 1, 2, 0, -1        demo.myTree.insert(3);        demo.myTree.insert(5);        demo.myTree.insert(6);        demo.myTree.insert(9);        demo.myTree.insert(1);        demo.myTree.insert(2);        demo.myTree.insert(0);        demo.myTree.insert(-1);        //print the tree        System.out.println("Game Tree: ");        demo.myTree.printTree(demo.myTree.root);        //Print the results of the game        System.out.println("\nGame Results:");        //run the  minimax algorithm with the following inputs        int optimalVal = demo.minimax(0, myTree.root, true, MAX, MIN);        System.out.println("Optimal Value: " + optimalVal);    }    /**     * @param alpha = 1000     * @param beta = -1000     * @param nodeIndex - the current node     * @param depth - the depth to search     * @param maximizingPlayer - the current player making a move     * @return - the best move for the current player     */    public int minimax(int depth, MiniMaxNode nodeIndex, boolean maximizingPlayer, double alpha, double beta) {        //Base Case #1: Reached the bottom of the tree        if (depth == 2) {            return nodeIndex.getValue();        }        }    }}输出:Game Tree: -1 ~ 0 ~ 1 ~ 2 ~ 3 ~ 5 ~ 6 ~ 9 ~ Game Results:Optimal Value: 2
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

您的问题是您的迭代取决于 2 的循环控制,而不是 node== null 查找 nodeIndex.getRight()(for max) getLeft(for min.)


记住一棵树有 1 个头(第一级)


第二级 = 2


第 3 级 = 4


4日8等。所以你的循环算法甚至不会下降 3 个级别。


for (int i = 0; i < 2; i++) {


     int val = minimax(depth + 1, nodeIndex.getLeft(), false, alpha, beta);

                best = Math.max(best, val);

                alpha = Math.max(alpha, best);


                //Alpha Beta Pruning

                if (beta <= alpha) {

                    break;

                }

更改循环以正确控制迭代,您应该很容易找到最高值。


查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 220 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信