Использование поиска по дереву Монте-Карло для вашего проекта фэнтези-футбола

28 июня 2018 г. · Чтение займет 9 мин.

Код в этом посте также доступен в виде записной книжки Jupyter.

Еще два месяца до начала следующего сезона американского футбола, а это значит, что игроки Fantasy Football по всему миру готовятся к предстоящему драфту лиги. В этом посте мы будем использовать алгоритм поиска по дереву Монте-Карло, чтобы оптимизировать наш следующий выбор в типичном проекте змейки. Если вы не знакомы с фэнтези-футболом или змейками, вы можете найти хорошее введение в Fantasy Football 101 ESPN. Мы рассмотрим стандартную лигу подсчета очков PPR, состоящую из десяти команд, но эти настройки должно быть легко изменить, чтобы они соответствовали вашим собственным лиги. Мы сосредоточимся в основном на реализации черновой логики Python 3 и оставим детали алгоритма ссылкам в тексте, но при этом предоставим код.

Проект

Драфт - это самое начало сезона вашей лиги. Каждый участник выбирает реальных футболистов, которые войдут в его первоначальный список. Плохой драфт может действительно испортить вам сезон, поэтому нужно много учиться, чтобы выбрать правильных игроков для своей команды. В большинстве лиг выбор осуществляется по очереди (от 1 до 10, затем от 10 до 1 и т. Д.). Это означает, что заполнение нужной позиции в реестре в нужное время является важной частью вашей стратегии. Если большинство ваших конкурентов начинают с выбора широких приемников, следует ли вам следовать за толпой или идти против нее? Это именно тот вопрос, на который мы хотим ответить с помощью нашего алгоритма скачать 1win на андроид.

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

Давайте посмотрим, как именно мы можем оценить состояние черновика. В наших составах есть один квотербек (QB), два бегущих бека (RB), два широких приемника (WR), один тайтовый конец (TE), один гибкий (RB, WR или TE), один защитник (D), один кикер (K ) и семь мест на скамейке запасных. Для начала предположим, что мы можем оценить каждого футболиста на основе его прогнозов общего количества очков фэнтези на сезон. Затем мы можем оценить каждую позицию в линейке на основе некоторого взвешивания. Веса важны, так как мы не можем использовать один и тот же состав игроков каждую неделю сезона из-за прощальных недель, травм или стратегических решений в течение сезона.

После некоторых экспериментов следующие веса выглядят нормально.

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

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

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

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

Это приводит к следующему коду.

Последняя часть логики касается обновления состояния черновика после каждого выбора. Код прост.

Наконец, нашему алгоритму требуется метод Clone, чтобы несколько прогонов моделирования не мешали друг другу.

Алгоритм

Монте-Карло Tree Search - это эвристический алгоритм поиска для поиска лучшего следующего хода в пошаговых играх, где практически невозможно учесть все возможные ходы (и их конечный результат). Он успешно используется для игр, таких как шахматы и покер, и совсем недавно он был очень важной частью победы Google над чемпионом мира по игре в го. Поскольку наш змейка также пошаговая, с множеством возможных ходов на каждом повороте, MCTS кажется отличным выбором для победы над конкурентами. Основная идея алгоритма состоит в том, чтобы имитировать множество игровых ходов - сначала выбирая случайные ходы, а затем приближаясь к лучшему ходу, сосредотачиваясь на наиболее многообещающих ходах. Он балансирует на компромиссе между разведкой (поиск более перспективных ходов) и эксплуатацией (сосредоточением внимания на наиболее многообещающих ходах).

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

Буквально единственное изменение в этом коде - в UCTSelectChild, где мы применили UCTK, чтобы найти лучший компромисс между исследованием и эксплуатацией. Это необходимо, поскольку исходный код основан на результатах игры от 0 (проигрыш) до 1 (победа), а наши результаты - это общее прогнозируемое количество очков команды, которые находятся в совершенно другом масштабе. Значение 200 установлено на основе опыта.

Запуск кода

Теперь у нас должны быть все компоненты для запуска нашего черновика. Не хватает только прогнозов на сезон. Вы можете найти множество веб-сайтов, которые предоставляют эти прогнозы, но я остановился на прогнозах ESPN, поскольку именно там размещается моя лига. Я создал CSV с прогнозами на 2018 год, который выглядит так.

Мы можем запустить полный черновик, в котором каждый участник наберет свою команду, используя алгоритм поиска по дереву Монте-Карло. Давай попробуем.

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

Окончательный результат составленных команд представлен ниже.

Следующие шаги

Теперь, когда у нас есть рабочая версия алгоритма дерева поиска Монте-Карло, примененная к драфту фэнтези-футбола, мы должны потратить некоторое время на анализ производительности. Я расскажу об этом в своем следующем посте, так что следите за моим блогом ...

Спасибо за прочтение! Пожалуйста, оставьте отзыв.

Популярные слоты

Автор: Вика Барсукова
Дата публикации: 05.27.2021
Рейтинг:
5.3