import java.util.*;import java.io.*;public class AlphaBeta implementsInterface{final int MAX_INT=32767;final int MIN_INT=-32768;final int MAX=1; //极大节点
final int MIN=0; //极小节点
public classNode
{privateString name;private intvalue;private int leval;//节点判断极大层还是极小层
privateString pFather;private ArrayListpChildren;
Node(String name)
{this.name=name;
value=-1;
pFather=newString();
pChildren=new ArrayList();
}
}private ArrayListNodeTree;privateString jianzhi[];private intcount;public voidgetStrategy(String inputFile){
NodeTree=new ArrayList();
jianzhi=new String[20];
count=0;
readTree(inputFile);
Alph_Beta(NodeTree.get(0).name);
System.out.println(count);
String bestRoute="";for(int i=0;i
{if(NodeTree.get(0).value==NodeTree.get(search(NodeTree.get(0).pChildren.get(i))).value)
{
bestRoute=NodeTree.get(0).name+" "+NodeTree.get(0).value+" "+NodeTree.get(search(NodeTree.get(0).pChildren.get(i))).name;break;
}
}
System.out.println(bestRoute);for(int i=0;i
{
System.out.println(jianzhi[i]);
}
}voidAlph_Beta(String str)
{boolean flag=false;
Node nNode=NodeTree.get(search(str));if(nNode.leval==MAX)
{for(int i=0;i
{
Alph_Beta(nNode.pChildren.get(i));if(nNode.value
{
nNode.value=NodeTree.get(search(nNode.pChildren.get(i))).value;if(Beta(str))//是否在极大点出执行Beta剪枝
{
jianzhi[count]=str+":";for(int j=i+1;j
{
jianzhi[count]=jianzhi[count]+" "+nNode.pChildren.get(j)+" β剪枝 ";
flag=true;
}if(flag==true)
{
count++;
}return;
}
}
}
}else{for(int i=0;i
{
Alph_Beta(nNode.pChildren.get(i));if(nNode.value>NodeTree.get(search(nNode.pChildren.get(i))).value)
{
nNode.value=NodeTree.get(search(nNode.pChildren.get(i))).value;if(Alpha(str))
{
jianzhi[count]=str+":";for(int j=i+1;j
{
jianzhi[count]=jianzhi[count]+" "+nNode.pChildren.get(j)+" α剪枝";
flag=true;
}if(flag==true)
{
count++;
}return;
}
}
}
}
}booleanAlpha(String str)
{
Node nNode=NodeTree.get(search(str));if(nNode.pFather==null)
{return false;
}int i=search(nNode.pFather);while(i>=0)
{if((NodeTree.get(i).value>=nNode.value)&&(NodeTree.get(i).leval==MAX)&&((NodeTree.get(i).value!=MIN_INT)))return true;else{if(i!=0)
{
i=search(NodeTree.get(i).pFather);//其祖先节点
}else
break;
}
}return false;
}booleanBeta(String str)
{
Node nNode=NodeTree.get(search(str));if(nNode.pFather==null)
{return false;
}int i=search(nNode.pFather);while(i>=0)
{if((NodeTree.get(i).value<=nNode.value)&&(NodeTree.get(i).leval==MIN)&&((NodeTree.get(i).value!=MAX_INT)))return true;else{if(i!=0)
{
i=search(NodeTree.get(i).pFather);
}else
break;
}
}return false;
}public voidreadTree(String filename)
{
File file=newFile(filename);
String nodename[]=new String[10];try{
BufferedReader in=new BufferedReader(newFileReader(file));
String s;
s=in.readLine();if(s.startsWith("ROOT"))
{
nodename=s.split("\\s+");
}
NodeTree.add(new Node(nodename[1]));
NodeTree.get(0).leval=MAX;
NodeTree.get(0).value=MIN_INT;
NodeTree.get(0).pFather=null;while(!(s=in.readLine()).equals("VALUE"))
{
nodename=s.split("\\s+");for(int i=1;i
{
NodeTree.get(search(nodename[0])).pChildren.add(nodename[i]);
Node nNode=new Node(nodename[i]); //value为-1;
nNode.pFather=nodename[0];if(NodeTree.get(search(nodename[0])).leval==MAX)
{
nNode.leval=MIN;
nNode.value=MAX_INT;
}else{
nNode.leval=MAX;
nNode.value=MIN_INT;
}
NodeTree.add(nNode);
}
}
String nodeValue[]=new String[10];while(!(s=in.readLine()).equals("END"))
{
nodeValue=s.split("\\s+");
NodeTree.get(search(nodeValue[0])).value=Integer.parseInt(nodeValue[1]);
}
in.close();
}catch(Exception e){
System.out.println("Error!!");}
}intsearch(String str)
{for(int i=0;i
{if(NodeTree.get(i).name.equals(str))returni;
}return -1;
}public static voidmain(String argv[]){
String test= "test.txt";newAlphaBeta().getStrategy(test);
}
}