Могут ли трансформеры научиться стратегировать?

Может ли Трансформеры научиться стратегировать?

TicTacGPT для игры в простые настольные игры

Фото от Jon Tyson на Unsplash

Хотя большинство настольных игр требуют использования сверточных нейронных сетей или других геометрически вдохновленных архитектур, тот факт, что мы фактически можем представлять состояния доски в виде строк, вызывает вопрос о том, можно ли трансформеры естественным образом применять к игре. Здесь мы посмотрим, сможем ли мы ответить на этот вопрос в контексте простой игры в крестики-нолики. Хотя это может показаться не очень практичным (почти все знают, что в этой игре есть стратегия равновесия Нэша в закрытом виде, которую очень легко выучить), это полезная площадка для наших вопросов. Причина в том, что игра достаточно проста, чтобы мы могли легко обучить трансформер играть в нее, но достаточно сложна, чтобы не было сразу очевидно, какая стратегия лучше.

Реализация игры

Мы начнем с реализации класса `TicTacToe`. Это довольно просто. Мы хотим представлять доску в виде строки из 9 символов, по одному для каждой клетки. Мы будем использовать `X` для первого игрока, `O` для второго игрока и `-` для пустой клетки. Мы также будем отслеживать, чей ход следующий, и закончена ли игра или нет. Мы также добавим хороший метод для печати доски, чтобы нам не приходилось смотреть на строки при отладке.

class TicTacToe:    def __init__(self):        # Инициализируем пустую доску        self.board = ['-' for _ in range(9)]        self.current_player = 'X'  # X начинает        def make_move(self, position):        """Сделать ход на доске."""        if self.board[position] == '-':            self.board[position] = self.current_player            self.switch_player()            return True        else: return False  # недопустимый ход        def switch_player(self):        """Сменить текущего игрока."""        self.current_player = 'O' if self.current_player == 'X' else 'X'        def check_winner(self):        """Проверить, есть ли победитель."""        # Строки, столбцы, диагонали        выигрышные_позиции = [            [0, 1, 2], [3, 4, 5], [6, 7, 8],  # Строки            [0, 3, 6], [1, 4, 7], [2, 5, 8],  # Столбцы            [0, 4, 8], [2, 4, 6]  # Диагонали        ]                for positions in выигрышные_позиции…