Надеюсь, среди читателей есть любители спорта. Если Вы играете в бадминтон или настольный теннис, то Вы возможно задавались вопросом: какова вероятность выиграть игру при известной вероятности выиграть очко? Допустим Вы проигрываете своему сопернику со счетом около 11:7. Казалось бы всего 4 очка разницы, но при этом никак не удается выиграть партию. Не везет? Предлагаю решить эту задачу и получить ответ на этот вопрос.

Имея косвенное отношение к финансовой математике я знаю, что именно для финансового математика такая задача покажется особенно несложной. Возможные методы ее решения очень напоминают методы расчета цены опциона. Но есть в этой задачи и нюансы, несколько нетипичные для финансов. Давайте рассмотрим варианты решения.

Для начала я поручил решить такую задачу численными методами своему 15-летнему сыну, который немного занимается программированием на Python (ключевое слово «немного»). Я предложил ему попробовать метод бинарного дерева (в финансовой риск аналитике обычно называется binomial method или lattice) и Монте Карло. Сын на удивление быстро справился с Монте Карло, написав довольно компактный код. Если кто не знает, идея Монте Карло состоит в том, чтобы сделать большое количество случайных вбросов смоделировав задачу и найдя ответ. Допустим Вы – первый игрок. В данном случае мы имеем вероятность выигрыша очка (7/(11+7)) ~=0.39. Начинаем партию, генерируя случайное число X в диапазоне [0.,1.]. Если X < 0.39, значит очко выигрываете Вы. Доводим партию до конца и отмечаем кто победил. Для достижения приемлемой точности проделываем такую процедуру большое количество раз. В финансах обычно используется диапазон от 100К до 1М, это обеспечивает точность 8-ми значащих цифр. Мой сын считал до 10К, это было мгновенно и однозначно обеспечивало достаточную точность. За которой, впрочем мы не гнались, так как для простоты решили проигнорировать козлиный бой. То есть счет 11:10 считали победой. Пол страницы кода легко хватает для решения такой задачи. Попробуйте и вам понравится.

Я не удовлетворился простотой решения с помощью Монте Карло и решил нагрузить сына методом бинарного дерева. Он долго отнекивался и жаловался на сложность. Пришлось ему слегка помочь с матчастью.

Бинарное дерево строится следующим образом. Начинаем со счета 0:0. Если первое очко выигрывает первый игрок, поднимаемся на клетку вверх и вправо, если выигрывает второй – вниз и вправо. Движение вправо – это движение по очкам от начала партии к концу. Для игры до 3-х полное дерево приведено ниже. Синим цветом подсвечены вершины промежуточных результатов, желтым – выигрыши матча первым игроком, и зеленым – выигрыши вторым игроком.



Начинаем со счета 0:0, вероятность которого 100%. Каждый переход вправо имеет свою вероятность. Обозначим вероятность выигрыша очка первым игроком — р1, а вторым – р2. Естественно, сумма р1 + р2 = 1. Идем по дереву от начала к концу и подсчитываем вероятность попадания в данную клетку. Для самых верхних и нижних клеток переход возможен только из одной клетки предыдущего уровня. Например, счет 3:0 возможен только после 2:0. Попадание в остальные клетки происходит из двух соседних слева. Например счет 1:1 возможен после 1:0 при последующем выигрыше очка вторым игроком, или при 0:1 при выигрыше первым игроком.



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

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



Дальше остается идти двойным циклом слево направо и сверху вниз подсчитывая верояности ячеек и принимая во внимание граничные условия. Они отливаются в if/if/else. Ну и остается просуммировать вероятности выигрышных ячеек для одного из игроков (можно и для второго чтобы проверить что их сумма равна 1).

Ну и наконец третий метод. Любой финальный счет партии (например 11:7) подразумевает определенное количество вариантов. Статистика говорит что это есть количество сочетаний из 7 по 17. Значение есть 17!/((17-7)!7!). 17 есть общее количество очков, набранное при данном счете минус один, так как последнее очко всегда выигрышное для победителя, то есть 7 проигранных не могут находиться на этом месте. Возможные варианты выигрышных счетов таковы (игнорирую козлиный бой) – 11:0, 11:1,…,11:10.

То есть можно перебрать все исходы выигрышного счета для игрока, просуммировав количество вариантов в каждом из них, умноженное на вероятность данного исхода. В таблице собраны результаты расчетов для вероятности выигрыша очка 39%. power1 – это степень, в которую возводится вероятность выигрыша очка победителем, power2 – проигравшим.



Все приведенные методы надежно работают и дают одинаковые результаты.
В заключении приведу график зависимости вероятности выигрыша матча в настольный теннис (до 11) и в бадминтон (до 21) в зависимости от средней вероятности выигрыша очка.



Синяя линия представляет настольный теннис, оранжевая — бадминтон. Как видно из графика, чтобы иметь хоть какие-то шансы (~3%) выиграть игру в настольный теннис, требуется выигрывать хотя бы 30% очков. Уже при 25% шансы уходят ниже 1%.
В бадминтоне требования еще жестче. Там потребуется более 35% чтобы надеяться на выигрыш игры с вероятностью около 3%.

Естественным образом вероятность выигрыша матча (из нескольких игр) падает еще сильнее если Вы набираете менее 50% по каждому очку.

Ценный совет напрашивается сам собой — чтобы выигрывать матчи, надо работать над выигрышем каждого очка.

Комментарии (13)


  1. slonpts
    04.02.2019 22:25

    Хорошая задача!

    В решении с деревом на узлах можно посчитать вероятности аналитически.

    Дерево исходов матча — обычное биномиальное дерево, нарисованное до уровня 2n-1.
    Нас интересуют только вероятности в вершинах, отмеченных зеленым. (Поэтому мы не рисуем вершины левее и правее — они не влияют на зеленые вершины, хотя и присутствуют в биномиальном дереве).

    В случае игры до 11 голов, зеленые вершины — это вероятности матча со счетом 11-0, 11-1,… 11-10 в нашу пользу.
    Ну и надо просто их просуммировать (это уже можно и на компьютере сделать).

    image

    P.S. Только заметил — у меня немного другие обозначения вероятностей гола, p и q. Но это ни на что не влияет, понятно.


    1. p53
      05.02.2019 14:48
      +1

      Всё ещё проще. Пусть игроки играют не до k=11 очков, а фиксированные 2k-1 = 21 раунд. Тогда тот, кто в течение игры первым наберёт 11 очков, гарантировано выиграет по результатам 21 раунда. В результате мы получаем биномиальное распределение очков x, набранных первым игроком, а нас интересует вероятность P(x >= k), что соответствует кумулятивной вероятности 1-F(k; 2k-1, p) = F(k; 2k-1, q) которая выражается через регулярную неполную бета-функцию. P(x >=k ) = I_p(k, k). Ответ в виде графика можно спросить у вольфрам-альфы.


      image


  1. wormball
    04.02.2019 23:14

    > Ценный совет напрашивается сам собой — чтобы выигрывать матчи, надо работать над выигрышем каждого очка.

    Я бы из графика противоположный бы вывод сделал — можно выигрывать 60% подач и при этом выигрывать 90% матчей. График, кстати, не подписан.

    На схожую тему есть ещё один прикол. Как-то раз я писал программу, играющую в футбол, и решил посчитать, сколько мне надо времени играть, чтобы узнать, улучшился алгоритм или ухудшился. Не помню точных цифр, но получалось, что чтобы сколько-либо надёжно заметить разницу частоты забития голов в 10%, надо играть хотя бы до 200 голов.

    А теперь вспомним, что начинается после каждого футбольного матча. Каждый первый зритель сразу начинает делать далеко идущие выводы — у кого сегодня зубы болели, кто играть не умеет, кого надо уволить, кого отправить на мыло, кто с кем сговорился, какие национальные традиции помешали забить гол и т. п. Хотя на самом деле с таким смешным количеством голов, как в футболе, результат матча ненамного отличается от результата подбрасывания монетки.

    В баскетболе чуть получше, но и там надо помнить, что, как правило, после гола одной команды мяч получает другая и с довольно большой вероятностью сама забьёт гол. Так что от счёта надо отнять эдак половину (и ещё поделить на два — большинство голов-то двухочковые).


  1. Pochemuk
    05.02.2019 00:38

    В данном случае мы имеем вероятность выигрыша очка (7/(11+7)) ~=0.39.

    Существенная неточность…

    Из того факта, что мы выиграли 7 и проиграли 11 очков вовсе не следует, что вероятность выигрыша очка равна ровно 7/(7+11).
    Вообще о точном значении вероятности исходя из этих данных утверждать нельзя. Можно только утверждать, что данная вероятность имеет некоторое непрерывное распределение, называемое бета-распределением.

    А уж дальше можно заниматься монте-карлой. Только придется брать не конкретное значение вероятности, а некоторые интегральные значения на узеньких диапазонах с некоторыми вероятностями каждое.

    В общем, все не так просто, как на самом деле…


  1. andrexj7
    05.02.2019 00:48

    вы пишите что

    Допустим Вы – первый игрок. В данном случае мы имеем вероятность выигрыша очка (7/(11+7)) ~=0.39.

    но моделируемая вами ситуация со счетом 11:7 — предполагает что первый игрок — должен иметь 11 очков а не 7…


  1. Germanjon
    05.02.2019 08:17

    Интересный пост. Вопрос: в случае с настольным теннисом учитывался ли дальнейший розыгрыш «Больше-меньше» при счёте 20:20?


    1. vesper-bot
      05.02.2019 12:04
      +1

      Нет, в тексте дважды упомянут «игнорирую козлиный бой», что означает отсутствие учета бесконечного дерева возможных очков. Т.е. в случае 20:20 следующее очко в этой модели однозначно определяет победителя.


  1. Sirion
    05.02.2019 09:05

    Задача о разорении игрока. Старая как мир, имеющая аналитическое решение. Или это для «финансового математика» недостаточно хайпово?


    1. BorisStratula
      05.02.2019 10:22

      Ещё бы это всё разжевать, а то за такой стеной математики мне не понять.


    1. echasnovski
      05.02.2019 11:50
      +1

      Это не совсем задача о разорении игрока, т.к. там игрок может выиграть только «забрав деньги» у соперника. Она бы подходила, если бы победа в спортивном матче присуждалась когда кто-то из игроков «оторвался» от другого на фиксированное количество очков.

      Задача в статье — это вариант Задачи о разделении ставки, достаточно подробно описанная в этой статье (обе ссылки на англоязычные источники).

      Но и у этой задачи (набрать image очков до того, как соперник наберёт image очков, при вероятности image выигрыша одного очка) есть интересные аналитические решения:


      Я использовал эти формулы для создания модификации рейтинга Эло, который учитывает матчи «до image побед». Вот ссылка на хабр-статью, если вдруг интересно.


      1. Sirion
        05.02.2019 12:50

        Действительно. Невнимательно вчитался в статью, блеснул эрудицией не по делу. Каюсь.


      1. dmagin
        05.02.2019 17:36

        У вас по ссылке интересная статья, но странно, что ее нет в хабе «Математика».


        1. echasnovski
          05.02.2019 18:31

          Спасибо.
          Она больше задумывалась как практическое изучение узкой области с использованием математики, а не статья по математике, поэтому как-то даже и не подумал о добавлении в этот хаб. Но да, возможно, нужно было.