在我的方法newminimax499我有一个minimax算法,利用memoization和alpha beta修剪.该方法适用于3x3游戏,但是当我玩4x4游戏时,我会为计算机选择奇怪的意外位置.他仍然没有输球,但他似乎没有赢得胜利.为了说明这里的问题,从3x3和4x4的2场比赛开始.首先是一个3x3游戏的场景,其中玩家是X并进行第一步:
这不错,实际上这是人们期望计算机做的事情.现在来看看4x4游戏中的场景.O再次是计算机而X开始:

正如你所看到的,计算机只是一个接一个地将Os放入一个系统的顺序中,只有当它有潜在的胜利时才打破该命令以阻止X. 这是非常防守的比赛,不像在3x3比赛中看到的那样.那么为什么3x3和4x4的方法表现不同?
这是代码:
//This method returns a 2 element int array containing the position of the best possible
//next move and the score it yields. Utilizes memoization and alpha beta
//pruning to achieve better performance.
public int[] newminimax499(int a, int b){
//int bestScore = (turn == 'O') ? +9 : -9; //X is minimizer, O is maximizer
int bestPos=-1;
int alpha= a;
int beta= b;
int currentScore;
//boardShow();
String stateString = "";
for (int i=0; i<state.length; i++) …Run Code Online (Sandbox Code Playgroud) 所以我过去3周一直在研究这个项目.我设法让minimax函数尽早开始使用3x3电路板,但是当我尝试将它用于4x4电路板时出现问题,即Java堆空间错误.从那时起,在Alpha beta修剪的帮助下,我成功地从aprox中降低了minimax函数中所需的minimax调用次数.59000到16000到11000,然后最终到8000个呼叫(假设已经填充了一个插槽的电路板的初始minimax调用).然而,现在的问题是该方法只是继续运行4x4游戏.它只是不停地调用自己,没有错误,没有结果,没有任何结果.从理论上讲,我看到它的方式,我的功能应该适用于任意的电路板尺寸,唯一的问题是内存.现在,因为我' 我大大减少了对我的功能的记忆贪婪,我希望它能起作用.嗯,它适用于3x3.但是,它不适用于4x4.函数功能的简要说明:该函数返回一个大小为2的数组,其中包含所有可能的下一步移动中最有利的下一步移动以及预期从该移动中获得的分数.评分系统很简单.O赢得+10,X赢得-10,平局0.该功能当然是递归的.在其中,您将找到某些快捷方式,可以减少对自身所需的调用次数.例如,如果它是X的转弯并且返回的分数是-10(这是X的最佳分数)然后退出循环,即停止观察来自该状态的其他潜在移动.这是类State的代码:它适用于3x3.但是,它不适用于4x4.函数功能的简要说明:该函数返回一个大小为2的数组,其中包含所有可能的下一步移动中最有利的下一步移动以及预期从该移动中获得的分数.评分系统很简单.O赢得+10,X赢得-10,平局0.该功能当然是递归的.在其中,您将找到某些快捷方式,可以减少对自身所需的调用次数.例如,如果它是X的转弯并且返回的分数是-10(这是X的最佳分数)然后退出循环,即停止观察来自该状态的其他潜在移动.这是类State的代码:它适用于3x3.但是,它不适用于4x4.函数功能的简要说明:该函数返回一个大小为2的数组,其中包含所有可能的下一步移动中最有利的下一步移动以及预期从该移动中获得的分数.评分系统很简单.O赢得+10,X赢得-10,平局0.该功能当然是递归的.在其中,您将找到某些快捷方式,可以减少对自身所需的调用次数.例如,如果它是X的转弯并且返回的分数是-10(这是X的最佳分数)然后退出循环,即停止观察来自该状态的其他潜在移动.这是类State的代码:该函数返回一个大小为2的数组,其中包含所有可能的下一个移动中最有利的下一步移动以及预期从该移动中获得的分数.评分系统很简单.O赢得+10,X赢得-10,平局0.该功能当然是递归的.在其中,您将找到某些快捷方式,可以减少对自身所需的调用次数.例如,如果它是X的转弯并且返回的分数是-10(这是X的最佳分数)然后退出循环,即停止观察来自该状态的其他潜在移动.这是类State的代码:该函数返回一个大小为2的数组,其中包含所有可能的下一个移动中最有利的下一步移动以及预期从该移动中获得的分数.评分系统很简单.O赢得+10,X赢得-10,平局0.该功能当然是递归的.在其中,您将找到某些快捷方式,可以减少对自身所需的调用次数.例如,如果它是X的转弯并且返回的分数是-10(这是X的最佳分数)然后退出循环,即停止观察来自该状态的其他潜在移动.这是类State的代码:该功能当然是递归的.在其中,您将找到某些快捷方式,可以减少对自身所需的调用次数.例如,如果它是X的转弯并且返回的分数是-10(这是X的最佳分数)然后退出循环,即停止观察来自该状态的其他潜在移动.这是类State的代码:该功能当然是递归的.在其中,您将找到某些快捷方式,可以减少对自身所需的调用次数.例如,如果它是X的转弯并且返回的分数是-10(这是X的最佳分数)然后退出循环,即停止观察来自该状态的其他潜在移动.这是类State的代码:
private String [] state; //Actual content of the board
private String turn; //Whose turn it is
private static int n; //Size of the board
public State(int n) {
state = new String[n*n];
for(int i = 0; i < state.length; i++) {
state[i] = "-";
}
State.n = n;
}
public int[] newminimax47(int z) {
int bestScore = (turn == "O") ? +9 : -9; //X is minimizer, O is maximizer
int bestPos = -1;
int currentScore;
int …Run Code Online (Sandbox Code Playgroud) 我有一个文本文件,其中包含我的计算机上保存的内容abcdefgh.我想使用FileInputStream来显示控制台上的字符,同时还要测量执行此操作所需的时间.它看起来像这样:
public class Readtime {
public static void main(String args[]) throws Exception{
FileInputStream in=new FileInputStream("bolbol.txt");
while(in.read()!=-1){
long startTime = System.nanoTime();
int x = in.read();
long endtime = System.nanoTime();
System.out.println(endtime-startTime);
System.out.println((char)x);
}
in.close();
}
}
Run Code Online (Sandbox Code Playgroud)
我在控制台上得到的是以下内容:
8863
b
7464
d
6998
f
6997
h
Run Code Online (Sandbox Code Playgroud)
其余的字母现在在哪里?就好像只进行了4次读操作一样.我的想法是朝着字符大小的方向前进,一次read()只能读取一个字节,但我没有到达任何地方.