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

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

一、Alpha-Beta剪枝算法原理

Alpha-Beta剪枝算法原理介绍及JAVA代码实现_第1张图片
Alpha-Beta剪枝算法原理介绍及JAVA代码实现_第2张图片
Alpha与Beta值的更新依照圆圈内数字的顺序进行。

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

二、JAVA代码实现

Alpha-Beta剪枝算法原理介绍及JAVA代码实现_第3张图片

    /*
	 * 剪枝算法实现 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();
		}
		// beta
		if (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 {// alpha
			int 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;
		}
	}

你可能感兴趣的:(算法)