我很难理解为什么因为alpha-beta修剪而打印课程示例中的某些节点,所以我在Java中实现了Peter Norvig的alpha beta修剪版本。
With a tree like this:
max
/ | \
min min min
/ / | / | \ / | \
3 12 8 2 3 9 14 1 8
教科书说应该扩展的唯一终端节点是
3, 12, 8, 2, 14, 1
按顺序。
我的算法打印:
visited leaf with value 3
visited leaf with value 12
visited leaf with value 2
visited leaf with value 3
visited leaf with value 14
visited leaf with value 1
visited leaf with value 8
Root value 3
root是minimax根的正确值。我调试了几个小时,似乎无法找到错误。我忽略了什么或者教科书不正确吗?
package alphabeta;
import java.util.ArrayList;
class Node {
boolean isMin;
boolean isMax;
boolean isTerminal;
int value;
int depth;
ArrayList <Node> children = new ArrayList <Node>();
}
public class AlphaBeta {
static Node alphaBetaSearch(Node state){
state.value = max_value(state,-99999,99999);
System.out.println(state.value);
return null;
}
static int max_value(Node state, int alpha, int beta){
if (state.isTerminal){
System.out.println("visited leaf with value " + state.value);
return state.value;
}
state.value = -99999;
for (Node a: state.children){
state.value = Math.max(state.value , min_value(a, alpha, beta));
if (state.value >= beta){
return state.value;
}
alpha = Math.max(alpha, state.value);
}
return state.value;
}
static int min_value(Node state, int alpha, int beta){
if (state.isTerminal)
return state.value;
state.value = 99999;
for (Node a: state.children){
state.value = Math.min(state.value, max_value(a, alpha, beta));
if (state.value >= beta){
return state.value;
}
beta = Math.min(beta, state.value);
}
return state.value;
}
public static void main(String[] args) {
Node t1 = new Node();
// t1.value = 4;
t1.value = 3;
t1.depth =2;
t1.isTerminal = true;
Node t2 = new Node();
// t2.value = 8;
t2.value = 12;
t2.depth=2;
t2.isTerminal= true;
Node t3 = new Node();
// t3.value = 7;
t3.value = 8;
t3.depth=2;
t3.isTerminal= true;
Node min1 = new Node();
min1.isTerminal=false;
min1.depth=1;
min1.children.add(t1);
min1.children.add(t2);
min1.children.add(t3);
Node t4 = new Node();
// t4.value = 5;
t4.value = 2;
t4.depth =2;
t4.isTerminal = true;
Node t5 = new Node();
//t5.value = 2;
t5.value =3;
t5.depth=2;
t5.isTerminal= true;
Node t6 = new Node();
// t6.value = 1;
t6.value=9;
t6.depth=2;
t6.isTerminal= true;
Node min2 = new Node();
min2.isMin=true;
min2.isTerminal=false;
min2.depth=1;
min2.children.add(t4);
min2.children.add(t5);
min2.children.add(t6);
Node t7 = new Node();
// t7.value = 1;
t7.value=14;
t7.depth =2;
t7.isTerminal = true;
Node t8 = new Node();
// t8.value = 6;
t8.value=1;
t8.depth=2;
t8.isTerminal= true;
Node t9 = new Node();
// t9.value = 0;
t9.value=8;
t9.depth=2;
t9.isTerminal= true;
Node min3 = new Node();
min3.isMin=true;
min3.isTerminal=false;
min3.depth=1;
min3.children.add(t7);
min3.children.add(t8);
min3.children.add(t9);
Node max1 = new Node();
max1.isMax=true;
max1.isTerminal=false;
max1.depth=0;
max1.children.add(min1);
max1.children.add(min2);
max1.children.add(min3);
alphaBetaSearch (max1);
}
}
答案 0 :(得分:6)
你有两行:
if(state.value&gt; = beta){
其中一行应该alpha
而不是beta
。
答案 1 :(得分:1)
如果您在
之前添加了alpha和beta更新if (state.value >= beta){
return state.value;
}
它应该有用