Я работаю с ИИ на 2048 год. До сих пор его довольно просто, я в основном пытаюсь сделать «змею» для уменьшения плиток, поэтому идеальная игра будет выглядеть так: , хотя это так же хорошо, как это: .2048 эвристические, неожиданные результаты
Моей эвристика использует простой 2d массив, который умножает каждую ячейку с уменьшением величины в виде сотрясения, как:
---------------------
| 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 с углом должно привести к лучшему результату?
EDIT:
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
ли базовая реализация минимакса, что я использую. Эвристическая функция, как описано, представляет собой простое умножение двумерных массивов. Одним из них является сама плата, другая маска, есть в общей сложности 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))])
Обнаружить случаи, когда правильное положение оставлено, и эвристика говорит правильно и регулирует его. – ziggystar
Это именно то, что мне нужно, я добавил примеры того, где эвристика дает неожиданные результаты, и я не знаю, как настроить ее, чтобы она работала. Установка более высоких весов будет определять приоритеты самых больших плиток и игнорировать меньшие, это разрушит структуру. Если вы держите весов вниз, то сделать небольшой неправильный ход не будет наказывать достаточно, чтобы предотвратить его. Ясно, что мне нужна дополнительная эвристика поверх текущей. – Limon
Можете ли вы объяснить, как ваш алгоритм выбирает решение, например, для одного из ваших примеров, баллы каждой из возможностей (вверх, вниз, влево, вправо). Это поможет нам лучше понять ваш алгоритм и оптимизировать его! – Gabz