Java 剪枝算法
我很难理解为什么某个课程示例中的某些节点会作为alpha-beta修剪的结果打印出来,所以我在Java中实现了Peter Norvig版本的alpha-beta修剪Java 剪枝算法,java,algorithm,minimax,Java,Algorithm,Minimax,我很难理解为什么某个课程示例中的某些节点会作为alpha-beta修剪的结果打印出来,所以我在Java中实现了Peter Norvig版本的alpha-beta修剪 With a tree like this: max / | \ min min min / / | / | \ / | \ 3 1
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
根是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);
}
}
package-alphabeta;
导入java.util.ArrayList;
类节点{
布尔isMin;
布尔isMax;
布尔值;
int值;
智力深度;
ArrayList子项=新的ArrayList();
}
公共类AlphaBeta{
静态节点alphaBetaSearch(节点状态){
state.value=最大值(state,-9999999);
System.out.println(state.value);
返回null;
}
静态int max_值(节点状态、int alpha、int beta){
if(state.isTerminal){
System.out.println(“带值的访问叶”+state.value);
返回状态.value;
}
state.value=-99999;
用于(节点a:state.children){
state.value=Math.max(state.value,min_值(a,alpha,beta));
如果(state.value>=beta){
返回状态.value;
}
alpha=数学最大值(alpha,state.value);
}
返回状态.value;
}
静态int min_值(节点状态、int alpha、int beta){
if(state.isTerminal)
返回状态.value;
state.value=99999;
用于(节点a:state.children){
state.value=Math.min(state.value,max_值(a,alpha,beta));
如果(state.value>=beta){
返回状态.value;
}
beta=Math.min(beta,state.value);
}
返回状态.value;
}
公共静态void main(字符串[]args){
节点t1=新节点();
//t1.1值=4;
t1.1值=3;
t1.深度=2;
t1.isTerminal=true;
节点t2=新节点();
//t2.1值=8;
t2.1值=12;
t2.深度=2;
t2.isTerminal=true;
节点t3=新节点();
//t3.1值=7;
t3.1值=8;
t3.深度=2;
t3.isTerminal=true;
Node min1=新节点();
min1.isTerminal=false;
min1.深度=1;
min1.children.add(t1);
min1.children.add(t2);
min1.children.add(t3);
节点t4=新节点();
//t4.价值=5;
t4.价值=2;
t4.深度=2;
t4.isTerminal=真;
节点t5=新节点();
//t5.1值=2;
t5.1值=3;
t5.深度=2;
t5.isTerminal=真;
节点t6=新节点();
//t6.数值=1;
t6.数值=9;
t6.深度=2;
t6.isTerminal=真;
Node min2=新节点();
min2.isMin=true;
min2.isTerminal=false;
min2.深度=1;
min2.儿童。添加(t4);
min2.children.add(t5);
min2.children.add(t6);
节点t7=新节点();
//t7.1值=1;
t7.数值=14;
t7.深度=2;
t7.1最小值=真;
节点t8=新节点();
//t8.1值=6;
t8.值=1;
t8.深度=2;
t8.isTerminal=true;
节点t9=新节点();
//t9.0值=0;
t9.数值=8;
t9.深度=2;
t9.isTerminal=true;
Node min3=新节点();
min3.isMin=true;
min3.isTerminal=false;
min3.深度=1;
min3.children.add(t7);
min3.children.add(t8);
min3.children.add(t9);
Node max1=新节点();
max1.isMax=true;
max1.isTerminal=false;
max1.深度=0;
max1.children.add(min1);
max1.children.add(min2);
max1.children.add(min3);
alphaBetaSearch(max1);
}
}
您有两行代码:
如果(state.value>=beta){
如果将alpha和beta更新置于
if (state.value >= beta){
return state.value;
}
它应该是有效的你的问题是关于你对算法的理解是否正确,还是你的代码与你对算法的理解是否匹配?@Oli Charlesworth:我想说两者,关于minimax树的alpha-beta修剪输出的教科书正确吗?是我的代码吗?两者都不正确吗?你能提供textb的参考吗查找上下文?@omgzor您不需要设置
min1.isMin=true
?查找(ideone.com)。为什么它输出3 2 3 9 14
,但不是您所说的。看起来,algo在阅读第一个元素后立即停止处理左分支。是的,我刚刚注意到并准备进行更新。我认为教科书是正确的,谢谢。