Это серия статей об использовании линейной оптимизации для игры в фэнтези-футбол. В Части 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.