В этом проекте используется целочисленное программирование для решения задач по построению состава (SBC). Задача оптимизации решена с помощью решателя Google CP-SAT. Этот подход предлагает широкие возможности настройки, а также возможность определения оптимальности решения.
The goal is to obtain the squad with the minimum total cost.
Чтобы загрузить набор данных клуба, используйте расширение (версия >= 1.1.0.3).
Входные данные для различных ограничений можно найти в input.py
. Настройте соответствующие входные данные для каждого ограничения SBC в input.py
( L43-77
и L28-30
), а затем перейдите optimize.py (L581-615)
и раскомментируйте соответствующую строку в соответствии с требованиями SBC. Также не забудьте установить formation
в input.py
!
Например, если требованием является Same League Count: Max 5
или Max 5 Players from the Same League
, установите MAX_NUM_LEAGUE = 5
( L53
в input.py
), а затем раскомментируйте model = create_max_league_constraint(df, model, player, map_idx, players_grouped, num_cnts)
( L589
в optimize.py
).
Если требованием является Nations: Max 2
, установите NUM_UNIQUE_COUNTRY = [2, "Max"]
( L62
в input.py
), а затем раскомментируйте model = create_unique_country_constraint(df, model, player, map_idx, players_grouped, num_cnts)
( L598
в optimize.py
).
Если вы устанавливаете приоритет дубликатов, устанавливая ( L28-L30
) в input.py
, тогда model = prioritize_duplicates(df, model, player)
optimize.py
( L615
) следует раскомментировать.
Если, например, SBC хочет, чтобы at least 3 players from Real Madrid and Arsenal combined
и at least 2 players from Bayern Munich
, тогда установите CLUB = [["Real Madrid", "Arsenal"], ["FC Bayern"]]
и NUM_CLUB = [3, 2]
( L43-44
в input.py
), а затем раскомментируйте model = create_club_constraint(df, model, player, map_idx, players_grouped, num_cnts)
( L581
в optimize.py
).
Если для SBC требуется как минимум 6 Rare
и 8 Gold
, установите RARITY_2 = ["Rare", "Gold"]
и NUM_RARITY_2 = [6, 8]
в input.py (L71-72)
, а затем раскомментируйте model = create_rarity_2_constraint(df, model, player, map_idx, players_grouped, num_cnts)
( L603
в optimize.py
).
Такие ограничения, как Chemistry
( optimize.py
, L620
) или FIX_PLAYERS
( optimize.py
, L623
), не требуют явной активации. Если в Chemistry
нет необходимости, установите для него значение 0
в input.py (L79)
. Аналогично, если ни один игрок не нуждается в исправлении, оставьте FIX_PLAYERS
пустым в input.py (L12)
.
objective
задана в optimize.py
( L626
). Характер objective
можно изменить в input.py
( L20-21
). В настоящее время цель состоит в том, чтобы minimize
total cost
.
Дополнительные параметры в input.py
следует просмотреть для получения дополнительной информации.
В main.py
укажите имя club dataset
в L57
. Набор данных предварительно обрабатывается в preprocess_data_2
внутри main.py
Дополнительные фильтры можно добавлять аналогично существующим.
В настоящее время имеются все необходимые ресурсы для решения этой проблемы SBC. Итоговый список игроков записывается в файл output.xlsx
. Чтобы запустить программу, просто запустите py main.py
после установки необходимых зависимостей. Примечание. Кажется, это очень сложный SBC, поэтому пришлось включить фильтр по рейтингу в main.py (L41)
.
Запустите pip3 install -r requirements.txt
чтобы установить необходимые зависимости.
Google OR-Инструменты v9.8
Питон 3.9
панды и openpyxl
https://github.com/ThomasSteere/Auto-SBC
https://github.com/bartlomiej-niemiec/eafc-sbc-solver
https://github.com/kosciukiewicz/sbc-solver
Спасибо GregoryWullimann
за то, что вы сделали процесс создания модели безумно быстрее.
Спасибо Jacobi from EasySBC
за помощь с squad_rating_constraint
.
Спасибо GeekFiro
за тестирование решателя и ценные отзывы и обсуждения.
Спасибо fifagamer#1515
и Frederik
за предоставленные наборы данных о ваших клубах ( Real_Madrid_FC_24.csv
и Frederik FC_24.csv
) и ваши отзывы.
Спасибо ckalgos
за создание расширения для загрузки набора данных клуба.
Благодарим вас, drRobertDev
за предоставление набора данных Fc25Players.csv
.
Спасибо всем, кто открыл проблемы в репо и оставил свои отзывы.
Спасибо всем, кто прокомментировал пост на Reddit.
Спасибо FutDB за предоставление API, который позволил мне изначально протестировать решатель на 10 тысячах игроков ( input.csv
).