Про цінності карт в грі «П'яниця»

Останнім часом я багато граю зі своїм 5-річним сином в карткову гру «П'яниця». І він, і я радіємо, коли перемагаємо, і засмучуємося, коли програємо.

В якийсь момент я задався питанням: яка «фінансова» цінність кожної з карток «П'яницю»? Так як Шістка б'є Туза (див. варіант правил під катом), то система цінностей в «П'яницю» циклічна, і відповідь неочевидний. Наприклад, цінніше чи Сімка Шістки? Сімка б'є Шістку — значить так! Але з іншого боку, кожна з них б'є тільки одну іншу карту в грі (Сімка — Шістку, а Шістка — Туза) — отже, вони рівні за цінності? Але Туз, побитий Шісткою, сам по собі набагато цінніше ніж Шістка, побита Сімкою — значить Шістка цінніше?!

Я вирішив підвести математичну модель під аналіз цінності карт в «П'яницю». Результати вийшли найнесподіваніші.

Для початку, ось правила нашого варіанти цієї гри:

  • У грі беруть участь 2 гравці.
  • 36 карт (від шісток до тузів) лунають порівну.
  • Кожен гравець знімає верхню карту своєї колоди і кладе її обличчям вгору — відбувається «битва». Переміг у битві гравець кладе всі карти битви під низ своєї колоди.
  • Переможець в битві визначається за звичайним старшинством карт (зверху вниз): Туз, Король, Дама, Валет, Десятка, Дев'ятка, Вісімка, Сімка, Шістка. Є тільки один дуже важливий виняток: Шістка перемагає Туза.
  • Якщо у битві беруть участь однакові карти (наприклад, два десятки), то відбувається «суперечка»: поверх «сперечаються» карт обличчям вниз кладуть ще по карті (вони є пасивними заручниками суперечки), і потім горілиць ще дві карти які вступають у бій. Переможець забирає собі всі карти спору.
Як зрозуміло з правил, перемога в цій грі залежить виключно від везіння — переможець визначається роздачею карт, так як від гравців взагалі нічого не залежить.

Отже, як ми можемо визначити «цінність» карти «П'яницю»? Я вирішив визначити цінність картки через очікуване кількість карт які ця карта принесе якщо гра буде тривати нескінченно довго.

Почнемо з простої задачі: визначення очікуваної кількості карт тільки для Шістки і тільки одного бою. У колоді 36 карт, значить, якщо ми ходимо Шісткою, вона вступає в бій з іншого (випадково вибраної) картою з решти 35ти. Що може статися? З ймовірністю у 4/35 випаде Туз, і тоді ми отримаємо і Шістку, і Туза. З ймовірністю у 3/35 випаде ще одна Шістка, і відбудеться суперечка — а так як ми припускаємо абсолютно випадковий розклад, то ми з рівною ймовірністю або виграємо, або програємо його, а значить, що в середньому очікується, що наша Шістка залишиться у нас. У всіх інших випадках ми втрачаємо шістку. Загальна очікувана кількість карток для Шістки після одного бою: 7/35 Шістки + 4/35 Туза.

Тепер заповнимо матрицю для очікуваних кількість у всіх карток для одного бою (ряд Шістки — це очікувана кількість карт отримується після одного бою з участю нашої Шістки).
Шістка Сімка Вісімка Дев'ятка Десятка Валет Дама Король Туз
Шістка 7/35 0 0 0 0 0 0 0 4/35
Сімка 4/35 7/35 0 0 0 0 0 0 0
Вісімка 4/35 4/35 11/35 0 0 0 0 0 0
Дев'ятка 4/35 4/35 4/35 15/35 0 0 0 0 0
Десятка 4/35 4/35 4/35 4/35 19/35 0 0 0 0
Валет 4/35 4/35 4/35 4/35 4/35 23/35 0 0 0
Дама 4/35 4/35 4/35 4/35 4/35 4/35 27/35 0 0
Король 4/35 4/35 4/35 4/35 4/35 4/35 4/35 31/35 0
Туз 0 4/35 4/35 4/35 4/35 4/35 4/35 4/35 31/35
Очевидно, що недостатньо врахувати один бій, щоб визначити цінність карти. Наприклад, у Шістки є шанс виграти Туза, який зіграє в якийсь момент в майбутньому і, в свою чергу, має шанс виграти інші карти. Як отримати подібну матрицю, але з очікуваними кількість вами карт через два бої? Відповідь виявляється до подиву простим — треба просто помножити цю матрицю на саму себе! (Основи матричного множення: щоб отримати елемент (X, Y) результату множення, треба скалярно помножити ряд Х першої матриці на колонку Y другий, тобто попарно перемножити відповідні елементи цих двох векторів і результати скласти).

Наприклад, ймовірність почати з Шістки і через 2 битви тримати на руках Шістку — (7/35)^2, так як Туз, потенційно виграний у першому бою ніяк не збільшувати шансів отримати Шістку у другому. Однак, той же Туз збільшує шанси отримати кожну з решти карток у другому битві — але очікувані кол-ва карт для Туза у другому битві множаться на ймовірність отримати Туза в першому бою (4/35). І т. д.

Тут можна цілком резонно заперечити, що до моменту другого битви ймовірності вже не будуть такими, як на момент першого, так як ми припускаємо певні результати першого бою. Дійсно, в ідеалі ми прорахували б усі шляхи цього саду розбіжних тропок. Але зробити це непросто, тому ми припустимо, що змінюється ймовірності однакові для всіх карт і помилки якимось чином усереднюються.

Отже, зовсім трохи рубі коду:

require 'matrix'
# Матриця очікуваних кількість для одного бою
m1 = Matrix[
[7.0/35, 0, 0, 0, 0, 0, 0, 0, 4.0/35],
[4.0/35, 7.0/35, 0, 0, 0, 0, 0, 0, 0],
[4.0/35, 4.0/35, 11.0/35, 0, 0, 0, 0, 0, 0],
[4.0/35, 4.0/35, 4.0/35, 15.0/35, 0, 0, 0, 0, 0],
[4.0/35, 4.0/35, 4.0/35, 4.0/35, 19.0/35, 0, 0, 0, 0],
[4.0/35, 4.0/35, 4.0/35, 4.0/35, 4.0/35, 23.0/35, 0, 0, 0],
[4.0/35, 4.0/35, 4.0/35, 4.0/35, 4.0/35, 4.0/35, 27.0/35, 0, 0],
[4.0/35, 4.0/35, 4.0/35, 4.0/35, 4.0/35, 4.0/35, 4.0/35, 31.0/35, 0],
[0, 4.0/35, 4.0/35, 4.0/35, 4.0/35, 4.0/35, 4.0/35, 4.0/35, 31.0/35]
]
# Матриця очікуваних кол-у після 1000 битв (m1 ступеня 1000)
m1000 = m1 ** 1000
# значення округлені) => Matrix[[0.0667, 0.0667, 0.0667, 0.0667, 0.0667, 0.0667, 0.0667, 0.0667, 0.0667], [0.0095, 0.0095, 0.0095, 0.0095, 0.0095, 0.0095, 0.0095, 0.0095, 0.0095], [0.0127, 0.0127, 0.0127, 0.0127, 0.0127, 0.0127, 0.0127, 0.0127, 0.0127], [0.0178, 0.0178, 0.0178, 0.0178, 0.0178, 0.0178, 0.0178, 0.0178, 0.0178], [0.0267, 0.0267, 0.0267, 0.0267, 0.0267, 0.0267, 0.0267, 0.0267, 0.0267], [0.0444, 0.0444, 0.0444, 0.0444, 0.0444, 0.0444, 0.0444, 0.0444, 0.0444], [0.0889, 0.0889, 0.0889, 0.0889, 0.0889, 0.0889, 0.0889, 0.0889, 0.0889], [0.2667, 0.2667, 0.2667, 0.2667, 0.2667, 0.2667, 0.2667, 0.2667, 0.2667], [0.4667, 0.4667, 0.4667, 0.4667, 0.4667, 0.4667, 0.4667, 0.4667, 0.4667]]

Зверніть увагу, як через деякий кол-во битв всі очікувані кол-ва карт для однієї карти стають однаковими, так як (за циркулярної системи цінностей) в кінці кінців ми можемо виграти карти, то очікувані кол-ва для всіх карт сходяться до одного числа. Тепер залишилося зовсім небагато — складаємо всі числа в кожному ряду щоб дізнатися цінність кожної з карт (тобто, очікуване число карт після 1000 битв):

m1000.row_vectors.map {|row| row.reduce(&:+).round(3)}
# [0.6, 0.086, 0.114, 0.16, 0.24, 0.4, 0.8, 2.4, 4.2]

Для наочності:
Шістка Сімка Вісімка Дев'ятка Десятка Валет Дама Король Туз
Цінність 0.6 0.086 0.114 0.16 0.24 0.4 0.8 2.4 4.2
Несподівані висновки:

  • Цінність Шістки лежить між Валетом і Дамою!
  • Тільки у Короля і Туза очікуване кінцеве кількість карт перевищує 1 (тобто, очікується позитивний ROI).

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.