Data da última atualização deste texto: 23/03/2023

O Cartola tem feito muito sucesso no Brasil nos últimos anos. Depois que comecei a jogar, comecei a me perguntar “O computador é capaz de montar bons times?”. Acredito que sim, mas é um problema complicado e vou apresentar os resultados das minhas tentativas.

O que é o Cartola?

O Cartola é um fantasy game criado pela Globo. O objetivo do jogador do Cartola (também chamado de Cartoleiro) é montar times de futebol antes de cada rodada do campeonato brasileiro com o intuito de marcar pontos e competir com colegas em ligas criadas dentro do game. O vencedor da liga em um determinado ano será o cartoleiro que acumular mais pontos durante as 38 rodadas do campeonato brasileiro.

Mas como os pontos são contados?

A pontuação de um jogador (PJ) em uma partida é dada pela soma dos scouts de ataque (SA) com os scouts de defesa (SD) do atleta em questão.

Os scouts de ataque são: gols (G), assistências (A), finalizações na trave (FT), finalizações defendidas (FD), finalizações para fora (FF), faltas sofridas (FS), penalties sofridos (PS), penalties perdidos pra fora (PPF), penalties perdidos com defesa de goleiro (PPD), penalties perdidos por bola na trave (PPT), impedimentos (I) e passes errados (PE).

Os scouts de defesa são: jogos sem sofrer gols (SG), defesas de penalties – só goleiro (DP), defesas (D), gols sofridos – só goleiros (GS), roubadas de bola – desarmes (RB), gols contra (GC), cartão amarelo (CA), cartão vermelho (CV), falta cometida (FC) e penalty cometido (PC).

Cada scout tem um peso diferente. Segue como o Cartola FC calcula SA, SD e PJ:

SA = 8*G + 5*A + 3*FT + 1.2*FD + 0.8*FF + 0.5*FS  + 1*PS – 3.2*PPF – 2.8*PPD – 1*PPT – 0.1*I – 0.1*PE;

SD = 5*SG + 7*DP + 1*D + 1.2*RB – 3*GC – 3*CV – 1*CA – 1*GS – 0.3*FC – 1*FC;

PJ = SA + SD.

Além disso, recentemente foram incluídas algumas alterações no jogo que impactam diretamente na pontuação do cartoleiro:

  • o cartoleiro tem de escolher um capitão para seu time e a pontuação do jogador (PJ) para o capitão é calculada da seguinte forma, PJ = 1.5 * (SA + SD); e
  • outra alteração é que além dos 11 jogadores + técnico, o cartoleiro deve escolher 1 jogador para cada posição do time (goleiro, zagueiro, lateral, meia, atacante) para a posição de reserva e esse reserva não pode ser mais caro do que o jogador titular mais barato da posição.

O primeiro critério que muitas pessoas utilizam ao escolher os jogadores é a média de pontuações do atleta. Por exemplo, se estamos na 4ª rodada e o jogador J atuou em todas as partidas anteriores, a média de pontuações dele é:

Média (J) = (PJ_rodada(1) + PJ_rodada(2) + PJ_rodada(3)) / 3

Apesar disso, se o cartoleiro olha apenas a média do jogador, pode acabar se dando mal já que outras condições podem afetar sua 4ª partida. Entre esses fatores, estão:

  • Sua equipe está completa?
  • O jogo é em casa ou fora?
  • O time adversário é considerado mais forte ou mais fraco?
  • O jogador está bem fisicamente para a partida?
  • Pode até acontecer do jogador não jogar porque o time tem um duelo mais importante por outra competição
  • etc.

Como o computador pode avaliar os jogadores?

Mas se apenas a média não é suficiente, o que um programa de computador deve considerar? O futebol é muito dinâmico e alguns fatores são difíceis de serem calculados.

Por exemplo:

  • Existe a chance de um jogador forçar um cartão para ser suspenso de um jogo menos importante e ficar zerado de cartões em jogos mais importantes?
  • Como o desempenho do jogador é afetado durante um clássico?
  • Como o computador pode adivinhar que um jogador com média de pontuação baixa estava lesionado, mas que esse jogador é craque e pode decidir uma partida?

Por outro lado, existem fatores que são mais fáceis de serem calculados:

  • Qual a média de pontuação do jogador?
  • Qual o desempenho do time do jogador como mandante ou visitante?
  • Qual time é favorito para a partida se olharmos a média de pontuação jogador por jogador?
  • De uma forma geral, é melhor jogar em casa ou fora de casa? Qual é a vantagem de se jogar em casa?

Com base em critérios computáveis como esses e alguns outros, implementei um sistema chamado Brasileirão com Inteligência Artificial – B. I. A.. As primeiras versões do sistema foram em Python, por volta de 2015. Mas depois de alguns colegas do trabalho sugerirem a disponibilização do sistema na Web em em 2016 mais ou menos, segui a dica e reescrevi o sistema em Java, que é uma linguagem que conheço melhor e com a qual eu posso encarar desafios maiores. Atualmente, a principal forma de se acessar o app é pela Google Play Store do Android.

As Figuras 1, 2 e 3 apresentam a interface gráfica do app. Nela, o cartoleiro insere um valor disponível, escolhe um modo de visualização que pode ser Completo (sem preencher o checkbox) ou Compacto (marcando o checkbox) e toca no botão “Escale seu time”. Se a visualização é Completa, a tela do meio é gerada, apresentando inclusive a justificativa de cada jogador ter sido inserido no time. Se a visualização é Compacta, mostramos apenas o mínimo para que a pessoa possa decidir se vai ou não usar o jogador indicado.

Screenshot_20230523_073247_B I A

Figura 1: Formulário para montar o time.


Screenshot_20230523_073331_B I A

Figura 2: Exibição do time em modo de exibição Completo;

Screenshot_20230523_073402_B I A
Figura 3: Exibição do time em modo de exibição Compacto;

 

 

Como a B. I. A. escolhe os jogadores?

Para a B. I. A. poder escolher os jogadores, implementei alguns algoritmos que são mais ou menos o que nós cartoleiros fazemos. Por exemplo, suponha que você tem 100 cartoletas para montar um time, quem você compraria para a próxima rodada?

Uma pessoa conservadora dividiria as 100 cartoletas por 12 para poder comprar os 11 jogadores e o técnico. Depois disso, tentaria comprar para cada posição um jogador/técnico custando no máximo 8.33. Eu implementei esse comportamento chamando-o de algoritmo Balanceado.

Percebendo que o algoritmo Balanceado não usava todas as cartoletas, percebi que poderia aproveitar o que sobrasse das cartoletas dividindo pelo número das posições e então reforçando cada posição do time igualmente. Por exemplo, se o algoritmo Balanceado usou 80 de 100 cartoletas e o time que o app está montando irá jogar no 3-5-2, poderíamos dividir 20 por 5, em que 5 é o número de posições da formação 3-5-2 ([‘Goleiro’, ‘Zagueiros’, ‘Meias’ , ‘Atacantes’, ‘Técnico’]). Em seguida, poderíamos pegar as 4 cartoletas obtidas da divisão e tentar reforçar cada posição substituindo o jogador de menor pontuação por algum jogador de maior valor caso esse tenha também uma pontuação maior. Esse algoritmo eu chamo de Balanceado com Refinamento por Posições.

Um outro cartoleiro pode pensar diferente e querer contratar um jogador ou técnico muito caro e em seguida, dividir as cartoletas restantes por 11. Esse algoritmo, eu chamo de Estrela Solitária.

Mas o algoritmo que tem fornecido os melhores resultados é o algoritmo Genético, que eu apresentei brevemente como funciona nessa resenha. Para aplicar a ideia de algoritmos Genéticos no Cartola, o sistema gera uma população inicial com times gerados pelos outros algoritmos. A função de fitness do algoritmo Genético é dada pela soma das avaliações dos jogadores. Com base nessas avaliações, são atribuídas probabilidades de cada time ser selecionado para um cruzamento. Nesse passo, quanto maior a avaliação geral do time, maiores as chances de ele ser selecionado. A cada vez que dois times são selecionados, é definido um ponto aleatório para troca de jogadores e são gerados dois novos times com base no cruzamento (crossover). Para cada time filho, também é atribuída uma pequena chance de mutação, em que um jogador pode ser selecionado aleatoriamente e substituído. No app B. I. A., eu tenho definido como ponto de parada qualquer time melhor do que os gerados pelos algoritmos anteriores ou um máximo de gerações (iterações).

O interessante do algoritmo Genético quando aplicado ao Cartola é que ele reproduz o comportamento de cartoleiros e cartoleiras quando compartilham suas escalações com colegas. Quando você vê que outra pessoa fez uma boa escolha, às vezes você se arrisca a remover um jogador que você escolheu e colocar o jogador indicado pela outra pessoa no lugar e vice-versa (crossover). Da mesma forma, você substitui seus próprios jogadores, após ter algumas dúvidas e realizar suas análises (mutação).

E como tem sido o desempenho do B.I.A.?

Essa é uma pergunta difícil de responder porque depende da forma como a B. I. A. é usada. Se você tem muitas cartoletas, ela tem mais chance de dar boas dicas. Se você tem poucas, ela vai montar um time econômico para você e isso pode ser ruim. Nesse ano estou tentando melhorá-la e acompanhar o desempenho completo do app do início até o final do campeonato, algo que não fiz em anos anteriores (antes de 2023).

Acredito que é possível melhorar o app de diversas formas. Por exemplo, tentar incluir fatores importantes para avaliar jogadores (aproveitamento do time, favoritismo, clássicos, etc), e entender melhor os pesos de cada fator.

Além do algoritmo genético, outros algoritmos parecem apropriados para selecionar jogadores. Por exemplo: programação dinâmica (mochila booleana) e método húngaro de otimização. E com relação ao algoritmo genético, a população pode ser mais diversificada com o uso de um algoritmo de busca em profundidade.

 

B. I. A. – Acesso ao app

Caso você seja cartoleiro(a) e tenha interesse de receber dicas da B. I. A. para a próxima rodada do Brasileirão, clique no link a seguir:

ic_launcher-playstore

B. I. A. – Brasileirão com Inteligência Artificial

Por outro lado, se você for desenvolvedor / estudante e tiver interesse em saber mais ou menos como o sistema funciona, a versão inicial em Python está no meu GitHub.

Gostaria de agradecer aos colegas de trabalho da época em que trabalhei na Liquigás pelas contribuições. Foram vários momentos em que eles compartilharam como montavam seus times, quais critérios consideravam, como o sistema poderia ficar melhor, etc. Essas ideias enriqueceram a forma como a B. I. A. avalia os jogadores antes de escolhê-los para os times sendo montados. Além disso, gostaria de agradecer minha esposa pela paciência quando eu começo a falar de Cartola e pela criação do layout responsivo para o app.

Se você gostou do post, se teve alguma ideia que pode melhorar o app ou se você gosta desse blog, não deixe de comentar. Caso prefira, também pode me enviar um e-mail em felipemartinsss at gmail dot com

Muito Obrigado! Até logo!

Referências

  1. WGenial – GitHub
  2. Blogspot de Victor Andrade –
    Texto: Baixando o banco de dados do CartolaFC com Python e Mechanize
  3. Russel S. e Norvig P. – Inteligência Artificial: Uma abordagem moderna.
  4. Cartola 2022: confira os valores de todos os scouts do fantasy game