Это серия статей об использовании линейной оптимизации для игры в фэнтези-футбол. В Части 1 я показал, как сформулировать линейную программу для выполнения упрощенного выбора команды FPL. На этой неделе мы рассмотрим, как начать решать проблему совершения трансферов для существующей команды.

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

Решения

В этой задаче мы хотим, чтобы наши решения представляли переходы игроков в команду и из нее. Они будут очень похожи на наши решения по выбору игроков — бинарное решение для каждого игрока, соответствующее «transfer_in» и одно — «transfer_out».

Дополнительная сложность заключается в том, что в неделю допускается одна бесплатная передача, а за все остальные взимается штраф в виде очков. Лучший способ смоделировать это — использовать отдельные переменные «free_transfer» и «paid_transfer».

Ограничения

Во-первых, мы используем решения о трансферах для расчета команды на следующей неделе.

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

Нам также потребуются следующие ограничения на переводы:

  • Разрешается только один бесплатный трансфер в неделю
  • Трансферный бюджет не может упасть ниже нуля

Цель

Это должно оставаться похожим на статический случай с прошлой недели: максимизировать ожидаемое количество очков в команде. Теперь к цели добавлено одно дополнение: штраф в четыре очка за дополнительные трансферы.

transfer_penalty = sum(transfer_in_decisions_paid) * 4

Собираем вместе

Окончательную версию TransferOptimiser можно найти здесь, а записную книжку для работы с данными FPL за 2020–21 годы — здесь.

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

Total expected score = 61.82

First Team:
Nick Pope | expected score = 4.47 | price = 5.5
Virgil van Dijk | expected score = 4.68 | price = 6.5
Andrew Robertson | expected score = 4.76 | price = 7.0
Trent Alexander-Arnold | expected score = 5.52 | price = 7.5
Matt Doherty | expected score = 4.39 | price = 6.0
Ashley Westwood | expected score = 3.10 | price = 5.5
Kevin De Bruyne* | expected score = 6.60 | price = 11.5
John Lundstram | expected score = 3.78 | price = 5.5
Anthony Martial | expected score = 5.26 | price = 9.0
Danny Ings | expected score = 5.21 | price = 8.5
Raúl Jiménez | expected score = 5.10 | price = 8.5

Subs:
Dale Stephens | expected score = 1.65 | price = 4.5
Mathew Ryan | expected score = 3.5 | price = 4.5
John Egan | expected score = 3.5 | price = 5.0
Mark Noble | expected score = 2.76 | price = 5.0

Наш оптимизатор трансферов требует, чтобы мы сделали прогноз счета каждого игрока на следующей неделе (Игровая неделя 2). Я рассмотрю эффективные способы сделать это в следующем посте. А пока, чтобы продемонстрировать алгоритм, я собираюсь сделать несколько простых предсказаний рук. Исходя из базового прогноза количества очков за игру в прошлом сезоне, я собираюсь дать +1 ожидаемое очко всем игрокам «Челси» и -1 ожидаемое очко всем игрокам «Ливерпуля».

Решение этой модели дает один перенос:

Out: Virgil van Dijk | expected score = 3.68 | price = 6.5
In: César Azpilicueta | expected score = 4.42 | price = 6.0

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

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

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

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

Блокноты и код доступны по адресу https://github.com/joconnor-ml/forecasting-fantasy-football.