在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