Este projeto utiliza programação inteira para resolver desafios de construção de esquadrão (SBCs). O problema de otimização é resolvido usando o solucionador Google CP-SAT. Essa abordagem oferece amplos recursos de personalização, juntamente com a capacidade de determinar a otimização da solução.
The goal is to obtain the squad with the minimum total cost.
Para baixar o conjunto de dados do clube, use a extensão (versão >= 1.1.0.3).
As entradas para as diferentes restrições podem ser encontradas em input.py
. Configure as entradas apropriadas para cada restrição SBC em input.py
( L43-77
e L28-30
) e, em seguida, navegue até optimize.py (L581-615)
e remova o comentário da linha relevante com base nos requisitos do SBC. Também não se esqueça de definir a formation
em input.py
!
Por exemplo, se o requisito for Same League Count: Max 5
ou Max 5 Players from the Same League
então defina MAX_NUM_LEAGUE = 5
( L53
em input.py
) e remova o comentário model = create_max_league_constraint(df, model, player, map_idx, players_grouped, num_cnts)
( L589
em optimize.py
).
Se o requisito for Nations: Max 2
, defina NUM_UNIQUE_COUNTRY = [2, "Max"]
( L62
em input.py
) e remova o comentário model = create_unique_country_constraint(df, model, player, map_idx, players_grouped, num_cnts)
( L598
em optimize.py
).
Se você estiver priorizando duplicatas definindo ( L28-L30
) em input.py
então model = prioritize_duplicates(df, model, player)
em optimize.py
( L615
) deve ser descomentado.
Se, por exemplo, o SBC quiser at least 3 players from Real Madrid and Arsenal combined
e at least 2 players from Bayern Munich
, então defina CLUB = [["Real Madrid", "Arsenal"], ["FC Bayern"]]
e NUM_CLUB = [3, 2]
( L43-44
em input.py
) e, em seguida, remova o comentário model = create_club_constraint(df, model, player, map_idx, players_grouped, num_cnts)
( L581
em optimize.py
).
Se o SBC exigir pelo menos 6 Rare
e 8 Gold
, defina RARITY_2 = ["Rare", "Gold"]
e NUM_RARITY_2 = [6, 8]
em input.py (L71-72)
e remova o comentário model = create_rarity_2_constraint(df, model, player, map_idx, players_grouped, num_cnts)
( L603
em optimize.py
).
Restrições como Chemistry
( optimize.py
, L620
) ou FIX_PLAYERS
( optimize.py
, L623
) não requerem ativação explícita. Se não houver necessidade de Chemistry
, defina-o como 0
em input.py (L79)
. Da mesma forma, se nenhum jogador precisar de conserto, deixe FIX_PLAYERS
vazio em input.py (L12)
.
O objective
é definido em optimize.py
( L626
). A natureza do objective
pode ser alterada em input.py
( L20-21
). Atualmente o objetivo é minimize
o total cost
.
Parâmetros adicionais em input.py
devem ser revisados para obter mais informações.
Em main.py
, especifique o nome do club dataset
em L57
. O conjunto de dados é pré-processado em preprocess_data_2
dentro de main.py
. Filtros adicionais podem ser adicionados de maneira semelhante aos existentes.
Atualmente, os insumos estão definidos para resolver este desafio da MSC. A lista final de jogadores está gravada no arquivo output.xlsx
. Para executar o programa, basta executar py main.py
após instalar as dependências necessárias. Nota: Este parece ser um SBC muito difícil e por isso tive que ativar o filtro de classificação em main.py (L41)
.
Execute pip3 install -r requirements.txt
para instalar as dependências necessárias.
Ferramentas OR do Google v9.8
Pitão 3.9
pandas e openpyxl
https://github.com/ThomasSteere/Auto-SBC
https://github.com/bartlomiej-niemiec/eafc-sbc-solver
https://github.com/kosciukiewicz/sbc-solver
Obrigado GregoryWullimann
por tornar o processo de criação de modelo incrivelmente mais rápido.
Obrigado Jacobi from EasySBC
por ajudar com squad_rating_constraint
.
Obrigado GeekFiro
por testar o solucionador e fornecer comentários e discussões valiosos.
Obrigado fifagamer#1515
e Frederik
por fornecerem os conjuntos de dados do seu clube ( Real_Madrid_FC_24.csv
e Frederik FC_24.csv
) e seus comentários.
Obrigado ckalgos
por criar a extensão para baixar o conjunto de dados do clube.
Obrigado drRobertDev
por fornecer o conjunto de dados Fc25Players.csv
.
Obrigado a todos que abriram problemas no repositório e forneceram seus comentários.
Obrigado a todas as pessoas que comentaram no post do reddit.
Obrigado FutDB por fornecer a API que me permitiu testar o solucionador originalmente em 10 mil jogadores ( input.csv
)