利用α-β剪枝算法,对下图所示的博弈树进行搜索,搜索得到根节点选择的走步,以及没有必要进行评估的节点,并求出给出在何处发生了剪枝,以及剪枝的类型(属于α剪枝还是β剪枝)。

注:□表示MIN节点;○表示MAX节点

public interface Interface{

    public void getStrategy(String InputFile);

}
import java.util.*;
import java.io.*; public class AlphaBeta implements Interface{
final int MAX_INT=32767;
final int MIN_INT=-32768;
final int MAX=1; //极大节点
final int MIN=0; //极小节点 public class Node
{
private String name;
private int value;
private int leval;//节点判断极大层还是极小层
private String pFather;
private ArrayList<String> pChildren; Node(String name)
{
this.name=name;
value=-1;
pFather=new String();
pChildren=new ArrayList<String>();
} } private ArrayList<Node> NodeTree;
private String jianzhi[];
private int count; public void getStrategy(String inputFile){
NodeTree=new ArrayList<Node>();
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<NodeTree.get(0).pChildren.size();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<count;i++)
{
System.out.println(jianzhi[i]);
} }
void Alph_Beta(String str)
{
boolean flag=false;
Node nNode=NodeTree.get(search(str));
if(nNode.leval==MAX)
{
for(int i=0;i<nNode.pChildren.size();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(Beta(str))//是否在极大点出执行Beta剪枝
{
jianzhi[count]=str+":";
for(int j=i+1;j<nNode.pChildren.size();j++)
{
jianzhi[count]=jianzhi[count]+" "+nNode.pChildren.get(j)+" β剪枝 ";
flag=true;
}
if(flag==true)
{
count++;
}
return;
}
}
}
}
else
{
for(int i=0;i<nNode.pChildren.size();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<nNode.pChildren.size();j++)
{
jianzhi[count]=jianzhi[count]+" "+nNode.pChildren.get(j)+" α剪枝";
flag=true;
}
if(flag==true)
{
count++;
}
return;
}
}
}
}
}
boolean Alpha(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;
}
boolean Beta(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 void readTree(String filename)
{
File file=new File(filename);
String nodename[]=new String[10];
try
{
BufferedReader in=new BufferedReader(new FileReader(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<nodename.length-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!!");}
}
int search(String str)
{
for(int i=0;i<NodeTree.size();i++)
{
if(NodeTree.get(i).name.equals(str))
return i;
}
return -1;
}
public static void main(String argv[]){
String test = "test.txt";
new AlphaBeta().getStrategy(test);
} }
//test.txt文件
ROOT A
A B C END
B D E END
C F G END
D H I END
E J K END
F L M END
G N O END
VALUE
H 4
I 1
J 5
K 0
L 3
M 2
N 7
O 1
END

结果:

α-β剪枝算法的java语言实现(非常实用)的更多相关文章

  1. 深度实战玩转算法, Java语言7个经典应用诠释算法精髓

    深度实战玩转算法,以Java语言主讲,通过7款经典好玩游戏,真正将算法用于实际开发,由算法大牛ACM亚洲区奖牌获得者liuyubobobo主讲,看得见的算法,带领你进入一个不一样的算法世界,本套课程共 ...

  2. 数据结构与算法之java语言实现(一):稀疏数组

    一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...

  3. 算法改进 | java语言中判断素数

    参考文章:http://blog.csdn.net/kp_liu/article/details/37569507 http://blog.csdn.net/huang_miao_xin/articl ...

  4. 我们一起来排序——使用Java语言优雅地实现常用排序算法

    破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...

  5. 算法笔记_216:第六届蓝桥杯软件类校赛部分真题(Java语言C组)

    目录 1 题目一 2 题目二 3 题目三 4 题目四 5 题目五 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学 ...

  6. 算法之求质数(Java语言)

    质数(Prime number) 又称素数,指在的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数). 算法原理 验证一个数字 n 是否为素数的一种简单但 ...

  7. 算法之冒泡排序(Java语言)

    冒泡排序(英语:Bubble Sort) 是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说 ...

  8. 【算法】计算一篇文章的单词数(C、Java语言实现)

    1. C语言:一个字符一个字符的读取 (有空再贴出来) 2.Java语言:按行读取,并用正则分割成多个单词,再用MapReduce并行计算单词数 (我使用的是ieda,有些地方跟eclipse有点区别 ...

  9. 算法之杨辉三角形(Java语言)

    杨辉三角形, 又称贾宪三角形.帕斯卡三角形. 前9层写出来如下: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 ...

随机推荐

  1. dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent

    本篇是实战文章,从代码的角度分析这两种方式.本文参考自下列文章: http://www.jianshu.com/p/1d42d2e6f4a5 http://www.jianshu.com/p/94d4 ...

  2. C#泛型详解(转)

    初步理解泛型: http://www.cnblogs.com/wilber2013/p/4291435.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber ...

  3. C语言中如何判断文件是否存在

    方法一:access函数判断文件夹或者文件是否存在 函数原型: int access(const char *filename, int mode); 所属头文件:io.h filename:可以填写 ...

  4. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  5. 编译器开发系列--Ocelot语言2.变量引用的消解

    "变量引用的消解"是指确定具体指向哪个变量.例如变量"i"可能是全局变量i,也可能是静态变量i,还可能是局部变量i.通过这个过程来消除这样的不确定性,确定所引用 ...

  6. 初识npm

    一.npm简介: npm全称为Node Package Manager,是一个基于Node.js的包管理器,也是整个Node.js社区最流行.支持的第三方模块最多的包管理器. npm的初衷:JavaS ...

  7. 简单Linux命令学习笔记

    1.查看进程 ps -ef | grep 关键字       /*关键字为服务名*/ netstat -unltp | grep 关键字        /*关键字为服务名或者是端口均可*/ 2.杀死进 ...

  8. 二次剩余、三次剩余、k次剩余

    今天研究了一下这块内容...首先是板子 #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  9. js月份,日期加一天

    js没有直接可以用的函数,所以只能自己写,其中需要涉及到每个月天数的判断,如果是2月份的话,还要涉及到闰年的判断 var addDate = { //日期,在原有日期基础上,增加days天数,默认增加 ...

  10. magic方法的magic

    事实上,在python中一个类被实例化的时候首先被调用的并不是__init__方法,而是__new__方法.只是new方法一般很少重写.new方法会有返回值传给init方法.因此,init方法不能够有 ...