В моем последнем посте по теме я описал и включил код для созданной вручную системы для игры в Gin Rummy, которая учитывает только текущие видимые карты, а не память ранее видимых карт, которые подобрал противник. или закопаны в кучу отбраковки. Моя интуиция подсказывает, что если вы включите в стратегию историю известных карт, вы сможете играть в лучшую игру и надежно превзойти мою стратегию, созданную вручную.
Ключом к пониманию стратегии, созданной вручную, является, во-первых, представление руки и состояния игры, а во-вторых, функция оценки руки.
Представление
Представление мира в джин-рамми представляет собой матрицу 4 x 13, соответствующую четырем мастям в колоде и значениям карт масти, от туза до короля. Например, возьмем эту (выигрышную) комбинацию из десяти карт:
Это будет представлено матрицей (где 1 означает, что у вас есть эта карта):
Состояние игры также представляет собой матрицу 4 x 13, однако вместо 0/1 есть девять состояний, соответствующих тому, какой игрок держит какие карты, какие карты были помещены в стопку сброса и которые остаются в запасе ( стопку закрытых карт). Это следующие состояния:
## Card states: ## 0 Stock ## 1 Player 0 card that was stock ## 2 Player 0 card that was discard ## 3 Player 1 card that was stock ## 4 Player 1 card that was discard ## 5 Player 0 top-discard ## 6 Player 0 discard ## 7 Player 1 top-discard ## 8 Player 1 discard
Пример состояния игры, когда Игрок 0 только что выиграл игру с рукой, показанной выше:
Наконец, есть еще одно представление, а именно порядок складских карт (stockOrder), который представлен в виде списка из 52 карт в колоде, который представляет собой уплощенную версию матрицы 4 x 13. В начале игры тасование колоды сводится к:
stockOrder = np.arange(52)
Оценка руки
Функция оценки руки присваивает значения каждой карте в руке, где более высокие значения являются более ценными картами, которые помогают составить комбинацию. Вы можете позволить себе сбросить менее ценные карты.
Идея, лежащая в основе функции оценки рук, собранных вручную, заключается в том, что если карта имеет горизонтальных ближайших соседей в масти, чтобы составить прямую комбинацию (например, от четырех до семи червей в руке выше), карта получает более высокое значение. Кроме того, если у карты есть вертикальные соседи (например, три ферзя), она также ценится выше.
Функция оценки рук, созданная вручную, использует матрицу свертки для оценки каждой карты в руке.
Это означает, что в зависимости от карт, которые расположены рядом по горизонтали, они добавляют наибольшую ценность, в то время как карты с одинаковым значением и разной мастью также высоко ценятся.
Стратегия
Каждый ход игрок должен принимать два решения:
- Взять: сбросить лицевой стороной вверх или открытую открытую карту?
- Сброс: какую из 11 карт в руке вы сбросите?
Стратегия, созданная вручную, представляет собой простое правило для шага Самовывоз:
- Оценить текущую руку с помощью топ-сброса
- Если верхний сброс - это карта с наименьшей ценностью в вашей руке, тогда возьмите запас. В противном случае пикап выбросить.
Еще проще правило для шага Сброс: оцените одиннадцать карт в руке и сбросьте карту с наименьшим достоинством.
Хороша ли стратегия, созданная вручную?
В неформальном турнире, в котором играли я и двое моих детей, Ава и Лука, стратегия, созданная вручную, была очень конкурентоспособной. Это лучшая стратегия для игры в Джин Рамми? Возможно нет. Стратегия, созданная вручную, немного глупа, потому что она игнорирует или «забывает» карты, которые были сыграны ранее. Я знаю, что если мой оппонент собирает тузов, я постараюсь не сбрасывать туза. Стратегия, созданная вручную, этого не делает.
Я мог бы хорошенько подумать над этим и сам построить расширение для функции оценки рук, которое учитывает исторические карты, но вместо этого я хочу разработать систему, которая учится этой оценке рук автоматически. Пришло время осваивать техники искусственного интеллекта. В следующем посте я расскажу о том, как я к этому подошел.