2048启发式,意想不到的结果

时间:2014-11-05 16:59:24

标签: algorithm artificial-intelligence minimax

我正在为2048工作AI。到目前为止它非常简单,我基本上试图制作一个减少瓦片的“蛇”,所以完美的游戏看起来像:Perfect game,尽管那是与此一样好:enter image description here

我的启发式方法是使用一个简单的二维数组,将每个单元格的数量减少到震动的大小,如:

---------------------
| 16 | 15 | 14 | 13 |
| 9  | 10 | 11 | 12 |
| 8  | 7  | 6  | 5  |
| 1  | 2  | 3  | 4  |
---------------------

这种方法效果相对较好,大约有一半时间到达2048年,但有时会做出非常奇怪的决定,例如:

Suggests right, correct is left

Suggests right, correct is left

Suggests down, correct is left

Suggests down, correct is left/right

是否有可能调整权重或添加某种惩罚来惩罚这种行为?其他一切都很好,甚至在数学上,其中一些没有任何意义。 F.ex. #3显然比左边更好,而不是向下,最大的被乘数位于角落,并且将256合并到角落应该会产生最佳结果?

编辑:

def getBestMove(node, depth):
    bestValue, bestAction = -1, None
    for direction in xrange(4):
        temp, score, moved = Board.move(node, direction)
        if not moved: continue
        val = minimax(temp, depth - 1, False)
        if val > bestValue:
            bestValue = val
            bestAction = direction
    return bestValue, bestAction


def minimax(node, depth, maximizingPlayer):
    if depth == 0:
        return heuristic(node)
    elif Board.isLost(node):
        return 0

    if maximizingPlayer:
        bestValue = -1
        for direction in xrange(4):
            temp, score, moved = Board.move(node, direction)
            if not moved: continue
            val = minimax(temp, depth - 1, False)
            if val > bestValue: bestValue = val
        return bestValue
    else:
        bestValue = 1<<20
        for cell in Board.getFreeCells(node):
            for cellValue in [2, 4]:
                temp = deepcopy(node)
                temp[cell[0]][cell[1]] = cellValue

                val = minimax(temp, depth - 1, True)
                if val < bestValue: bestValue = val
        return bestValue

我使用的是minimax的基本实现。所描述的启发式函数是2D阵列的简单乘法。一个是电路板本身,另一个是电路板,总共有4个屏蔽,这只是“蛇”,从四个不同的角落开始减少数量:

def heuristic(board):
    return max([mulArr(board, grid) for grid in grids])


def mulArr(arr1, arr2):
    return sum([arr1[i][j]*arr2[i][j] for i in xrange(len(arr1)) for j in xrange(len(arr1))])

1 个答案:

答案 0 :(得分:0)

对于你的heuritic,你可以尝试:

| 32768 16384 8192 4096 |
|  256   512  1024 2048 |
|  128    64   32   16  |
|   1     2     4    8  |

找到最低限度?