在java中使用alpha beta prunning的tic tac脚趾
我正在尝试使用迭代Alpha-Beta prunning玩tic tac脚趾,我有一个移动的第二个限制,但由于某种原因,它不能很好地工作。
我修改了常规的alpha-beta代码,而不是返回alpha或beta,它返回一个状态(这是下一步移动的板子)
每次我创建孩子时,我都会更新他们的深度。
但由于某种原因,我仍然失败,我发现我的alpha测试版并没有看到最好的举动。
这是我的代码:
外部循环:
while (watch.get_ElapsedMilliseconds() < 900 && d <= board.length * board[0].length - 1)
{
s = maxiMin(beginSt, d, watch);
if (s.getNextMove().getIsWin() == true)
{
break;
}
d++;
}
return new location(s.getNextMove().getRow(), s.getNextMove().getCol());
阿尔法测试版:
public State maxiMin(State s, int depth, Stopwatch timer)
{
if (s.getDepth() == 7)
{
Console.WriteLine();
}
if (timer.get_ElapsedMilliseconds() > 850 || s.getDepth() == depth || goalTest(s.getBoard()) != 0)
{
s.evaluationFunc(line_length, PlayerShape);
s.setAlpha(s.getEvaluation());
s.setBeta(s.getEvaluation());
return s;
}
LinkedList<State> children = createChildren(s, true);
// No winner, the board is full
if (children.get_Count() == 0)
{
s.evaluationFunc(line_length, PlayerShape);
s.setAlpha(s.getEvaluation());
s.setBeta(s.getEvaluation());
return s;
}
while (children.get_Count() > 0)
{
State firstChild = children.get_First().get_Value();
children.RemoveFirst();
State tmp = miniMax(firstChild, depth, timer);
int value = tmp.getBeta();
if (value > s.getAlpha())
{
s.setAlpha(value);
s.setNextMove(tmp);
}
if (s.getAlpha() >= s.getBeta())
{
return s;
}
}
return s;
}
public State miniMax(State s, int depth, Stopwatch timer)
{
if (s.getDepth() == 7)
{
Console.WriteLine();
}
if (timer.get_ElapsedMilliseconds() > 850 || s.getDepth() == depth || goalTest(s.getBoard()) != 0)
{
s.evaluationFunc(line_length, PlayerShape);
s.setAlpha(s.getEvaluation());
s.setBeta(s.getEvaluation());
return s;
}
LinkedList<State> children = createChildren(s, false);
// No winner, the board is full
if (children.get_Count() == 0)
{
s.evaluationFunc(line_length, PlayerShape);
s.setAlpha(s.getEvaluation());
s.setBeta(s.getEvaluation());
return s;
}
while (children.get_Count() > 0)
{
State firstChild = children.get_First().get_Value();
children.RemoveFirst();
State tmp = maxiMin(firstChild, depth, timer);
int value = tmp.getAlpha();
if (value < s.getBeta())
{
s.setBeta(value);
s.setNextMove(tmp);
}
if (s.getAlpha() >= s.getBeta())
{
return s;
}
}
return s;
}
如果任何人都可以告诉我是否有什么错误,那么会非常流行。 我怀疑可能是因为我返回“s”而不是常规alpha测试版返回评估结果,但我没有找到错误。
提前致谢,
莉娜
首先tic-tac-toe是一个非常简单的游戏,我相信它可以用一个简单得多的代码来解决,主要是因为我们知道总是有一个tie选项,并且状态总数小于3 ^ 9(包括对称和许多不可能的状态)。
至于你的代码,我相信你的问题之一是,你似乎没有递增递归调用的深度。
你的代码中也存在许多不良风格的问题,你将miniMax和MaxiMin分离成两个函数,尽管它们基本相同。 您可以通过从集合中删除元素来迭代集合,而不是使用for-each或iterator(甚至是int iterator)。
链接地址: http://www.djcxy.com/p/56393.html上一篇: tic tac toe using alpha beta prunning in java
下一篇: Java minmax algorithm returning null move and failing to correctly undo moves