O Cartola FC 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 bem complicado e vou apresentar os resultados das minhas tentativas.

O que é o Cartola FC?

O Cartola FC é um fantasy game criado pela Globo. O objetivo do jogador do Cartola FC (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 perdidos (PP), impedimentos (I) e passes errados (PE).

Os scouts de defesa são: jogos sem sofrer gols (SG), defesas de penalties – só goleiros (DP), defesas difíceis – só goleiros (DD), gols sofridos – só goleiros (GS), roubadas de bola (RB), gols contra (GC), cartão amarelo (CA) e cartão vermelho (CV).

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

SA = 8*G + 5*A + 3.5*FT + 1*FD + 0.7*FF + 0.5*FS – 3.5*PP – 0.5*I – 0.3*PE;

SD = 5*SG + 7*DP + 3*DD + 1.7*RB – 6*GC – 5*CV – 2*CA – 2*GS – 0.5*FC;

PJ = SA + SD.

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?
  • 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 a jogador?
  • De uma forma geral, é melhor jogar em casa ou fora de casa?

Com base em critérios computáveis como esses e muitos outros, implementei um sistema chamado Cartola com Inteligência Artificial (C.I.A.). As primeiras versões do sistema foram em Python. Mas depois de alguns colegas do trabalho sugerirem a disponibilização do sistema na Web, aceitei a dica e reescrevi o sistema em Java, que é uma linguagem que conheço melhor e com a qual eu posso encarar desafios maiores. A Figura 1 apresenta a interface gráfica do sistema em Java.

Seleção_001

Figura 1 – Escalação parcial do sistema C.I.A. para a rodada 17 do campeonato brasileiro de 2016. Foram fornecidas 109,58 cartoletas.

Como C.I.A. escolhe os jogadores?

Para C.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 C.I.A. 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 de aproximadamente 1000 times. 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 C.I.A., eu tenho definido como ponto de parada qualquer time melhor do que os gerados pelos algoritmos anteriores ou um máximo de 20 gerações (iterações).

O interessante do algoritmo Genético quando aplicado ao Cartola FC é que ele reproduz o comportamento dos cartoleiros quando compartilham suas escalações com seus colegas. Quando você vê que seu colega fez uma boa escolha, às vezes você se arrisca a remover um jogador que você escolheu e colocar o jogador indicado pelo seu colega 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 C.I.A.?

Essa é uma pergunta difícil de responder porque só tenho dados oficiais a partir da nona rodada. O programa tem sido aperfeiçoado a cada rodada, mas ainda possui poucas cartoletas (C$ 109.58) se comparado com a maior parte de seus adversários na liga em que criei (em média C$ 151.69). O programa tem sido avaliado na liga chamada “C@rtoleiros F@lidos”, que possui 13 pessoas e uma conta exclusiva para representar as escolhas de C.I.A.. A seguir, apresento uma tabela que mostra como estava o programa em cada rodada e seu desempenho:

Rodada Cartoletas (C$) Critérios para Avaliação de Jogadores Algoritmo Pontuação Posição na Rodada
9 100 Média do Jogador e Fator-Casa Genérico. Balanceado 30.50 14º lugar
10 Média do Jogador e Fator-Casa Genérico. Balanceado 26.06 13º lugar
11 Média do Jogador, Fator-Casa Genérico, Soma das Médias dos Jogadores dos Times, Variação de Preço dos Jogadores. Balanceado 28.29 12º lugar
12 101.99 Média do Jogador, Fator-Casa Genérico, Soma das Médias dos Jogadores dos Times, Variação de Preço dos Jogadores. Balanceado com refinamento por posições 53.79 12º lugar
13 110.28 Média do Jogador, Percentual de Jogos Disputados, Aproveitamento do Time, Media dos Times, Posição do Time na Tabela, Variação de Preço dos Jogadores, Cartoletas Disponíveis. Balanceado com refinamento por posições 45.85 5º lugar
14 112.67 Média do Jogador, Percentual de Jogos Disputados, Aproveitamento do Time, Media dos Times, Posição do Time na Tabela, Variação de Preço dos Jogadores, Cartoletas Disponíveis. Genético 35.52 13º lugar
15 Media(J), Percentual de Jogos Disputados, Aproveitamento do Time, Media dos Times, Posição do Time na Tabela, Variação de Preço dos Jogadores, Risco em Clássicos, Cartoletas Disponíveis. Genético 20.73 14º lugar
16 108.50 Média do Jogador, Percentual de Jogos Disputados, Aproveitamento do Time, Media dos Times, Posição do Time na Tabela, Variação de Preço dos Jogadores, Risco em Clássicos, Cartoletas Disponíveis. Genético 22.75 12º lugar
20 111.9 Média do Jogador, Percentual de Jogos Disputados, Aproveitamento do Time, Media dos Times, Posição do Time na Tabela, Variação de Preço dos Jogadores, Risco em Clássicos, Cartoletas Disponíveis. Genético 33.43 1º lugar
21 118.24 Média do Jogador, Percentual de Jogos Disputados, Aproveitamento do Time, Media dos Times, Posição do Time na Tabela, Variação de Preço dos Jogadores, Risco em Clássicos, Cartoletas Disponíveis. Genético 41.03 8º lugar

Exceto pela rodada 13, pode ser visto que o programa não tem ido bem. Apesar disso, estou confiante que ele tem melhorado as escalações, mesmo que os resultados ainda não mostrem isso.

Acredito que é possível melhorar C.I.A. de diversas formas. Por exemplo, após identificar os fatores mais importantes para avaliar jogadores (média, aproveitamento do time, favoritismo, risco em clássicos, etc), uma Rede Neural talvez poderá ajudar a definir 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.

Fiquem atentos, ao final de cada rodada a tabela acima será atualizada. Espero que vocês ainda vejam 1º lugar em alguma das rodadas. =)

Sintetização de Voz

Finalmente, após ter boa parte do desenvolvimento concluído, eu quis deixar o sistema mais amigável. A partir disso, me coloquei no lugar de outros cartoleiros e me perguntei: “Por que eu deveria seguir as dicas desse sistema?”. Dessa forma, veio a ideia de incluir um campo Justificativa, em que são apresentados alguns dos fatores que fizeram C.I.A. avaliar positivamente cada jogador.

Para aqueles que utilizam Chrome na versão 33 ou superior, ainda é possível ouvir a famosa voz em português do Google Translate lendo o texto do campo Justificativa. Ainda estou analisando e entendendo melhor quais navegadores tem esse suporte a voz e pode ser que eu atualize esse trecho do post assim que eu chegar a uma conclusão.

C.I.A. – Acesso ao sistema e código em Python

Caso você seja cartoleiro(a) e tenha interesse de receber dicas do sistema C.I.A. para a próxima rodada do campeonato brasileiro de 2016, clique no link a seguir:

logo
Figura 2 – Logo do sistema C.I.A.

C.I.A. – Cartola com Inteligência Artificial

Por outro lado, se você for desenvolvedor / estudante e tiver interesse em saber mais ou menos como o sistema C.I.A. funciona, a versão em Python usada até a rodada 14 foi disponibilizada no meu GitHub.

Gostaria de agradecer aos colegas do trabalho pelas contribuições. Foram vários momentos nos últimos 2 meses em que eles compartilharam como montam seus times, quais critérios consideram, como o sistema poderia ficar melhor, etc. Essas ideias enriqueceram a forma como C.I.A. avalia os jogadores antes de escolhê-los para os times sendo montados. Além disso, gostaria de agradecer minha namorada pela paciência quando eu começava a falar de Cartola e pela criação do layout responsivo para a página.

Se você gostou do post, se teve alguma ideia que pode melhorar o sistema C.I.A. ou se você gosta desse blog, não deixe de comentar.

Muito Obrigado!

P.S. (20/06/17):

O aplicativo C.I.A. foi removido da Play Store pela Google porque a empresa entendeu que violava direitos da marca Cartola ou dos times do campeonato ao usar seus escudos. Infelizmente eles não são explícitos nos motivos. Por conta disso, o aplicativo foi renomeado para B.I.A. (Brasileirão com Inteligência Artificial), repaginado em alguns aspectos e relançado na Play Store. Baixe já a sua versão para Android ou acesse pela Web se você usa Destktop/iOS:

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.
Anúncios