В моем последнем посте по теме я описал и включил код для созданной вручную системы для игры в 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)

Оценка руки

Функция оценки руки присваивает значения каждой карте в руке, где более высокие значения являются более ценными картами, которые помогают составить комбинацию. Вы можете позволить себе сбросить менее ценные карты.

Идея, лежащая в основе функции оценки рук, собранных вручную, заключается в том, что если карта имеет горизонтальных ближайших соседей в масти, чтобы составить прямую комбинацию (например, от четырех до семи червей в руке выше), карта получает более высокое значение. Кроме того, если у карты есть вертикальные соседи (например, три ферзя), она также ценится выше.

Функция оценки рук, созданная вручную, использует матрицу свертки для оценки каждой карты в руке.

Это означает, что в зависимости от карт, которые расположены рядом по горизонтали, они добавляют наибольшую ценность, в то время как карты с одинаковым значением и разной мастью также высоко ценятся.

Стратегия

Каждый ход игрок должен принимать два решения:

  1. Взять: сбросить лицевой стороной вверх или открытую открытую карту?
  2. Сброс: какую из 11 карт в руке вы сбросите?

Стратегия, созданная вручную, представляет собой простое правило для шага Самовывоз:

  1. Оценить текущую руку с помощью топ-сброса
  2. Если верхний сброс - это карта с наименьшей ценностью в вашей руке, тогда возьмите запас. В противном случае пикап выбросить.

Еще проще правило для шага Сброс: оцените одиннадцать карт в руке и сбросьте карту с наименьшим достоинством.

Хороша ли стратегия, созданная вручную?

В неформальном турнире, в котором играли я и двое моих детей, Ава и Лука, стратегия, созданная вручную, была очень конкурентоспособной. Это лучшая стратегия для игры в Джин Рамми? Возможно нет. Стратегия, созданная вручную, немного глупа, потому что она игнорирует или «забывает» карты, которые были сыграны ранее. Я знаю, что если мой оппонент собирает тузов, я постараюсь не сбрасывать туза. Стратегия, созданная вручную, этого не делает.

Я мог бы хорошенько подумать над этим и сам построить расширение для функции оценки рук, которое учитывает исторические карты, но вместо этого я хочу разработать систему, которая учится этой оценке рук автоматически. Пришло время осваивать техники искусственного интеллекта. В следующем посте я расскажу о том, как я к этому подошел.