Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 剪枝算法_Java_Algorithm_Minimax - Fatal编程技术网

Java 剪枝算法

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

我很难理解为什么某个课程示例中的某些节点会作为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
根是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在阅读第一个元素后立即停止处理左分支。是的,我刚刚注意到并准备进行更新。我认为教科书是正确的,谢谢。