2014-11-05 4 views
2

Я работаю с ИИ на 2048 год. До сих пор его довольно просто, я в основном пытаюсь сделать «змею» для уменьшения плиток, поэтому идеальная игра будет выглядеть так: Perfect game, хотя это так же хорошо, как это: enter image description here.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))]) 
+0

Обнаружить случаи, когда правильное положение оставлено, и эвристика говорит правильно и регулирует его. – ziggystar

+0

Это именно то, что мне нужно, я добавил примеры того, где эвристика дает неожиданные результаты, и я не знаю, как настроить ее, чтобы она работала. Установка более высоких весов будет определять приоритеты самых больших плиток и игнорировать меньшие, это разрушит структуру. Если вы держите весов вниз, то сделать небольшой неправильный ход не будет наказывать достаточно, чтобы предотвратить его. Ясно, что мне нужна дополнительная эвристика поверх текущей. – Limon

+1

Можете ли вы объяснить, как ваш алгоритм выбирает решение, например, для одного из ваших примеров, баллы каждой из возможностей (вверх, вниз, влево, вправо). Это поможет нам лучше понять ваш алгоритм и оптимизировать его! – Gabz

ответ

0

Для вашего heuritic, может вы попробуйте:

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

И найти минимум?

+0

Результаты: С минимальным максимальным количеством плиток 64. Та же маска, но с max имеет среднее значение 256. Проблема заключается в том, что числа настолько велики, что получение max tile right в основном нейтрализует другие ячейки. С этой эвристикой он часто формирует шаблон, подобный этому https://i.stack.imgur.com/Oce4N.png, вместо «змеи». Это менее эффективно и часто блокирует дальнейший прогресс. Я думаю, что правильный путь - использовать маску, которую у меня уже есть, но иметь какой-то другой карающий фактор. Я смотрел на функцию гладкости. – Limon

+0

Вышел из космоса, функция гладкости описана здесь: http://artent.net/2014/04/07/an-ai-for-2048-part-4-evaluation-functions/ Идея состоит в том, что один раз он находится в шаблоне змеи, из него будет дорого выходить, поскольку негладность будет увеличиваться. – Limon

Смежные вопросы