我正在为2048工作AI。到目前为止它非常简单,我基本上试图制作一个减少瓦片的“蛇”,所以完美的游戏看起来像:,尽管那是与此一样好:。
我的启发式方法是使用一个简单的二维数组,将每个单元格的数量减少到震动的大小,如:
---------------------
| 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))])
答案 0 :(得分:0)
对于你的heuritic,你可以尝试:
| 32768 16384 8192 4096 |
| 256 512 1024 2048 |
| 128 64 32 16 |
| 1 2 4 8 |
找到最低限度?