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();
}
// 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;
}
}