当前位置: 代码迷 >> 综合 >> Alpha-Beta剪枝算法原理介绍及JAVA代码实现
  详细解决方案

Alpha-Beta剪枝算法原理介绍及JAVA代码实现

热度:37   发布时间:2023-12-18 16:30:48.0

Alpha-Beta算法原理介绍及代码实现

一、Alpha-Beta剪枝算法原理

在这里插入图片描述
在这里插入图片描述
Alpha与Beta值的更新依照圆圈内数字的顺序进行。

该树从根节点向下进行深度遍历查找到指定深度的子节点或该子节点再无符合要求的子节点,根据评估函数得到此子节点的评估值,得到的评估值与Alpha或Beta值进行比较(Alpha取子节点的最大值,Beta取子节点的最小值),当得到的值使Alpha>Beta时,进行剪枝。最终根据根节点得到的Alpha的值就可以寻找最佳走步。

二、JAVA代码实现

在这里插入图片描述

    /** 剪枝算法实现 depth:设置搜索的最大深度 isAI:默认为false,我方先下 alpha和beta继承自父节点*/private int maxmin(boolean isAI, int depth, Node node, int a, int b) {if (node.getChildren().size() == 0 || depth == 0) {return node.getValue();}// betaif (isAI) {int min = Integer.MAX_VALUE;int index = 0;for (Node children : node.getChildren()) {index++;int tmp = maxmin(false, depth - 1, children, a, b);// beta表示从这个节点往下搜索最坏结局的上界if (b > tmp) {b = tmp;}// 孩子结点最小值 为父节点的值if (min > children.getValue()) {min = children.getValue();}node.setValue(min);// 剪枝 :如果从当前格局搜索下去,不可能找到比已知最优解更好的解,则停止这个格局分支的搜索(剪枝),回溯到父节点继续搜索。if (b <= a) {// 此结点剩下的孩子结点被剪枝for (Node node2 : node.getChildren().subList(index, node.getChildren().size())) {node2.setPruning("beta");prunedNodes.add(node2);}return b;}}return b;} else {// alphaint max = Integer.MIN_VALUE;int index = 0;for (Node children : node.getChildren()) {// 标识此结点的第几个孩子结点,为剪枝做准备index++;int tmp = maxmin(true, depth - 1, children, a, b);// alpha表示搜索到当前节点时已知的最好选择的下界if (a < tmp) {a = tmp;}// 孩子结点最大值 为父节点的值if (max < children.getValue()) {max = children.getValue();}node.setValue(max);// 剪枝 :如果从当前格局搜索下去,不可能找到比已知最优解更好的解,则停止这个格局分支的搜索(剪枝),回溯到父节点继续搜索。if (b <= a) {for (Node node2 : node.getChildren().subList(index, node.getChildren().size())) {node2.setPruning("alpha");prunedNodes.add(node2);}return a;}}return a;}}
  相关解决方案