【问题标题】:Pretty good heuristic evaluation rules for big TicTacToe 5x5 board不错的大型井字游戏 5x5 板的启发式评估规则
【发布时间】:2014-07-21 20:41:56
【问题描述】:

我创建了井字游戏。我使用 minmax 算法。

当棋盘为3x3 时,我只计算游戏的所有可能移动直到结束,-1 表示失败,0 表示平局,1 表示胜利。

当涉及到 5x5 时,它无法完成(对于许多选项(如 24^24),所以我创建了评估方法,它给出:10^0 用于内联一个 CIRCLE,10^1 用于内联 2 个 CIRCLE,. .., 10^4 for 5 CIRCLES inline,但没用。

有人有更好的评估方法吗?

例子:

O|X|X| | |
----------
 |O| | | |
----------
X|O| | | |
----------
 | | | | |
----------
 | | | | |

Evaluation -10, 2 circles across once and inline once (+200), 2 crosses inline(-100), and -1 three times and + 1 three times for single cross and circle.

这是我现在的评价方法:

public void setEvaluationForBigBoards() {
        int evaluation = 0;
        int howManyInLine = board.length;
        for(; howManyInLine > 0; howManyInLine--) {
            evaluation += countInlines(player.getStamp(), howManyInLine);
            evaluation -= countInlines(player.getOppositeStamp(), howManyInLine);
        }
        this.evaluation = evaluation;
    }

    public int countInlines(int sign, int howManyInLine) {
        int points = (int) Math.pow(10, howManyInLine - 1);
        int postiveCounter = 0;
        for(int i = 0; i < board.length; i++) {
            for(int j = 0; j < board[i].length; j++) {
                //czy od tego miejsca jest cos po przekatnej w prawo w dol, w lewo w dol, w dol, w prawo
                if(toRigth(i, j, sign, howManyInLine))
                    postiveCounter++;
                if(howManyInLine > 1) {
                    if(toDown(i, j, sign, howManyInLine))
                        postiveCounter++;
                    if(toRightDiagonal(i, j, sign, howManyInLine))
                        postiveCounter++;
                    if(toLeftDiagonal(i, j, sign, howManyInLine))
                        postiveCounter++;
                }
            }
        }
        return points * postiveCounter;
    }

【问题讨论】:

  • 你应该添加检查这个“线”是否真的可以形成一个胜利线。否则,有没有用。结果,对于给定的情况,您只能在对角线上计算“o”(其余不能形成 5 行)

标签: java evaluation tic-tac-toe heuristics


【解决方案1】:

第一步之后的选项数(可能的移动顺序)是 24!而不是 24^24。还是太高了

数字,因此实施启发式是正确的。

请注意,关于好的启发式方法的答案必然基于作者的意见,所以我给出我的意见,但要找到

找出什么是“最好的启发式”,您应该通过以下方式使各种想法相互竞争:

  • 获取要比较的两个启发式 A 和 B
  • 随机生成一个起始配置
  • 让 A 和 O 一起玩,B 和 X 一起玩
  • 从相同的起始配置让 A 和 X 一起玩,B 和 O 一起玩
  • 统计谁赢的多

现在我对获胜序列长度为 n 的 nxn 游戏场可能的启发式起始点的想法:

  • 由于玩家的获胜条件,它要形成其标记的直线序列,我的想法是使用每个玩家仍然可用于构建这种直线序列的可能性数量作为基值。
  • 在空场中,理想情况下,O 和 X 都有可能以多种方式实现获胜序列:
    • 横向可能性:n
    • 垂直可能性:n
    • 对角线可能性:2
    • 总可能性:2n+2
  • 在一轮中间,玩家剩余机会的数量计算为:“没有对手标记的行数 + 没有对手标记的列数 + 没有对手标记的对角线数。
  • 而不是每次都计算,可以认为:
    • 在一名玩家移动后,仍然可用的可能性为:
      • 对他来说没有改变
      • 等于或降低对手(如果标记已放置在所考虑的玩家尚未放置标记的行/列/对角线中)
  • 作为启发式我可以建议 -
    • 有可能 - k * with k > 1 会产生更好的结果,最终这可能与如何考虑平局和输球有关。

一方面考虑:

  • 运动场单元格为 n^2
  • 如果我们保持获胜长度等于场地边缘大小,获胜的可能性是 2n+2
  • 这给了我一个想法,即尺寸越大,玩起来就越不有趣,因为在少量移动后(相对于游戏区域),平局的概率会越来越高。
  • 出于这个原因,我认为获胜长度低于 n 的游戏(例如,独立于游戏场地大小的 3)更有趣。
    • 命名为 l 的获胜长度,我们有可能的数量为 2*((n+1-l)*(2n+1-l)) = O(n^2) 并且与场地面积成比例.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多