对于大型TicTacToe 5x5板,相当不错的启发式评估规则

时间:2014-06-01 17:29:21

标签: java evaluation tic-tac-toe heuristics

我创造了TicTacToe游戏。我使用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;
    }

1 个答案:

答案 0 :(得分:2)

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

编号因此实现启发式是正确的。

请注意,关于良好启发式的答案必须基于作者的意见,所以我发表意见但要找到

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

  • 选择您要比较的两个启发式A和B
  • 随机生成初始配置
  • 让O和B一起玩X
  • 从相同的起始配置让A玩X和B玩O
  • 获取哪一个获胜的统计数据

现在我的想法是关于nxn游戏场的获胜序列长度为n的良好可能的启发式起点:

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

一方面考虑:

  • playfield cells is n ^ 2
  • 如果我们将获胜长度保持等于场边缘大小
  • ,则获胜可能性为2n + 2
  • 这让我觉得增加的尺寸越大,玩的就越少,因为在少量移动(参考游戏区域)后抽签的概率越来越高。
  • 因为这个原因我认为获胜长度低于n的游戏(例如3独立于游戏场大小)更有趣。
    • 命名为我们的获胜长度,可能性的数量是2 *((n + 1-l)*(2n + 1-l))= O(n ^ 2)并且与场区域成比例