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

注:□表示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. vscode 1.5安装体验

    1.下载安装 官方下载地址: http://code.visualstudio.com/ 界面截图: 2.图标显示功能File Icon Themes vscode1.5版本文件夹视图,可显示文件类型 ...

  2. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  3. 【从零开始学BPM,Day5】报表配置及自定义功能页面开发

    [课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第五天课程] 1.课程概要 Step 1 软件下载:H3 BP ...

  4. H3 BPM初次安装常见错误详解1-4

    错误1: 首次安装完成无法访问,效果如下. 错误原因:没有配置IIS. 解决方法: 控制面板-程序-打开或关闭Windows功能,选择internet信息服务. 因为安装的时候没有没有iis,所以程序 ...

  5. Mach-O 的动态链接(Lazy Bind 机制)

    ➠更多技术干货请戳:听云博客 动态链接 要解决空间浪费和更新困难这两个问题最简单的方法就是把程序的模块相互分割开来,形成独立的文件,而不再将它们静态的链接在一起.简单地讲,就是不对那些组成程序的目标文 ...

  6. WebAPI

    WebAPI的Host OWIN IIS WebAPI 的handler和Filter有啥区别? WebAPI  常用 Filters Exception Filter Timer Filter Lo ...

  7. MVP初探

    什么是MVP MVP是一种UI的架构模式,是MVC的一种变体,适用于基于事件驱动的应用框架.MVP中的M和V分别对应了MVC中的Model和View,而P代替了Controller,而它更多地体现在了 ...

  8. 在 Linux 中使用搜狗拼音输入法以及搞定 Flash 和支付宝

    在 Ubuntu 中安装搜狗输入法 在 Ubuntu Kylin 系统中,默认安装搜狗拼音输入法,但是在原生 Ubuntu 系统中则不是.这可以理解,毕竟搜狗输入法的 Linux 版有 Kylin 团 ...

  9. (转) [it-ebooks]电子书列表

    [it-ebooks]电子书列表   [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...

  10. windows10简单试用(多图,连薛定谔的猫都杀死了)

    为了大家看起来方便,我的截图都是gif的,比较小,但是颜色会有色差,相信大家不介意的 昨天windows10可以下载第一时间就下了玩玩 由于是技术预览,所以不打算替换之前的系统,只装在虚拟机里玩玩就好 ...