Ir para o conteúdo
Para as notícias Blog

Prever corridas de Fórmula 1

Prever corridas de Fórmula 1
Escrito por
Data Science Lab
Publicado em
13 de julho de 2021
Como fã de Fórmula 1, passo todos os fins de semana de corrida em suspense no sofá. Claro que torço por Max Verstappen, mas também tento vencer os meus familiares no GP-spel da NU.nl. Embora tenha a certeza de que sou quem mais sabe de Fórmula 1 na minha família, recorro muitas vezes à matemática para me ajudar.

Como funciona o GP-spel?

O GP-spel foi desenvolvido pela NU.nl e abrange uma temporada de Fórmula 1. Todos os fins de semana há uma corrida num país diferente, com uma sessão de qualificação e a corrida propriamente dita. Para cada fim de semana de corrida, os participantes têm de formar uma equipa de quatro pilotos e prever os três primeiros classificados. Também pode ganhar pontos extra se acertar na posição de Max Verstappen. Neste artigo, explico como usei modelos matemáticos para otimizar a minha equipa de quatro pilotos. Desta vez, não vou abordar a previsão dos resultados da qualificação e da corrida, embora seja uma aplicação interessante de data science.

Para formar uma equipa de quatro pilotos, dispõe de um orçamento total de 100 milhões. A equipa da NU.nl definiu o custo de cada piloto: quanto melhor for o piloto, mais caro é. Lewis Hamilton custa nada menos do que 50 milhões, enquanto Mick Schumacher – filho de - custa «apenas» 5 milhões. Ganha pontos consoante as posições em que os pilotos da sua equipa terminam a qualificação e a corrida. Por exemplo, se Max Verstappen fizer parte da sua equipa, conquistar a pole position no sábado e vencer a corrida no domingo, ganha (10 pela pole position + 25 pela vitória na corrida) 35 pontos. O objetivo é, naturalmente, acumular o máximo de pontos possível com a equipa que escolheu.

Problema da mochila

O problema descrito acima — escolher a equipa ideal de pilotos — é um problema da mochila. Trata-se de um conhecido problema matemático que coloca a seguinte questão:

‘Dado um conjunto de itens I, em que cada item i tem um peso associado c_i e um valor associado w_i, determine que itens devem ser colocados na mochila para maximizar o valor total sem exceder o peso máximo.’

Ilustração de uma mochila rodeada de pesos de 1 a 20 quilos.

O objetivo é maximizar o valor dos itens na mochila; chamamos a isto função objetivo. Ao mesmo tempo, o peso máximo não pode ser ultrapassado; chamamos a isto uma restrição.

O jogo de GP como problema da mochila

Podemos agora formular a escolha de uma equipa de pilotos como um problema da mochila. Temos um conjunto de pilotos I, cada um com um custo c_i. O objetivo é maximizar o valor total da equipa. No entanto, não sabemos qual o valor que cada piloto acrescenta, pelo que precisamos de encontrar uma solução ‘inteligente’ (voltarei a este ponto mais à frente). Além do orçamento de 100 milhões, há algumas restrições adicionais do jogo que temos de ter em conta:

  1. Pode escolher, no máximo, um piloto de cada equipa.
  2. Tem de escolher exatamente quatro pilotos.
  3. A solução do problema é binária: ou escolhe um piloto (1) ou não o escolhe (0).

O jogo de GP como problema de programação linear inteira

O passo seguinte é formular o nosso problema matemático como um problema de programação linear inteira. Na nossa área, sabemos que um problema da mochila pode ser resolvido com recurso à programação linear. A programação linear é um método para resolver problemas de otimização em que a função objetivo e as restrições são lineares. É também o caso do nosso problema. Falamos de um problema de programação linear inteira porque a solução é binária (e, portanto, composta por valores inteiros). Para cada piloto i, definimos uma variável de decisão x_i. Esta variável é igual a 1 se o piloto i for escolhido para a solução e igual a 0 se não o escolhermos. Podemos então formular o nosso problema como um problema de programação linear inteira (atenção: vêm aí fórmulas matemáticas!).

Fórmulas matemáticas de uma função objetivo com restrições.

A formulação matemática do nosso problema parece bastante complicada, mas, na verdade, é simples. Comecemos pela função objetivo. Como referi, queremos maximizar o valor da nossa equipa. Por isso, calculamos um valor w_i para cada piloto i (20 no total). Este valor baseia-se na classificação atual do campeonato e nos resultados dos treinos livres. Assim, tenho em conta o desempenho de cada piloto tanto ao longo da época como durante o fim de semana de corrida. Por exemplo, o valor de Max Verstappen para o fim de semana de corrida na Áustria (de 2 a 4 de julho de 2021) pode ser calculado da seguinte forma:

Pontos no campeonato a 3 de julho de 2021: 156 pontos no campeonato (KP)
Posição no treino livre 1: 1 (P1)
Posição no treino livre 2: 3 (P2)
Posição no treino livre 3: 1 (P3)
Valor de Max: KP + (21 – P1) + (21 – P2) + (21 – P3) = 156 + (21 – 1) + (21 – 3) + (21 – 1) = 214

Podemos calcular o valor da equipa selecionada somando os valores dos seus pilotos. Note que isto corresponde à função objetivo da nossa formulação matemática acima, porque a variável x_i é igual a 0 quando um piloto não faz parte da nossa equipa.

Seguem-se as restrições. A restrição 1 estabelece que o custo total dos pilotos que escolhemos para a nossa equipa não pode exceder o orçamento de 100 milhões. Calculamos o custo total somando o custo c_i de cada piloto i da nossa equipa. Aplica-se o mesmo raciocínio usado para a função objetivo: se não escolhermos um piloto para a nossa equipa, a variável x_i é igual a 0 e o seu custo não entra no cálculo. A restrição 2 garante que selecionamos exatamente quatro pilotos para a nossa equipa. A terceira restrição garante que escolhemos, no máximo, um piloto por equipa. Suponhamos que o piloto j é Max Verstappen (equipa Red Bull) e o piloto k é Sergio Perez (também da equipa Red Bull). Esta restrição estabelece que a soma das suas variáveis de decisão pode ser, no máximo, 1. Isto significa que não podemos escolher ambos os pilotos (pois, nesse caso, x_j + x_k = 2).

Calcular a solução ótima

Desta vez, para construir o modelo, escolho Excel em vez de Python ou R. No Excel, é fácil formular e resolver problemas de programação linear com o Solver. Abaixo, pode ver uma captura de ecrã da minha folha de Excel.

Captura de ecrã de uma folha de Excel com a janela do Solver aberta.

Primeiro, fazemos um levantamento de todos os dados necessários, como o custo e o valor de cada piloto. Depois, usamos esses dados para definir o nosso problema de programação linear inteira. Temos de introduzir as células certas nos locais certos no Solver:

  • Função objetivo (‘Set Objective’)
    A função objetivo encontra-se na célula C26. Esta célula contém a seguinte fórmula: SUMPRODUCT(I4:I23, J4:J23). Queremos maximizar a função objetivo.
  • Variáveis de decisão (‘By Changing Variable Cells’)
    As variáveis de decisão encontram-se nas células J4:J23.
  • Restrições (‘Subject to the Constraints’)
    Aqui adicionamos todas as restrições:
Restrição Células Fórmula no Excel
Tem de escolher 4 pilotos C27 <= D27 SUM(J4:J23) <= 4
Não pode gastar mais de 100 milhões C28 <= D28 SUMPRODUCT(D4:D23,J4:J23) <= 100
Pode escolher apenas 1 piloto por equipa C29:C38 <= D29:D38 Por exemplo, SUM(J4:J5) <= 1 para a Mercedes.
Variáveis de decisão binárias J4:J23 J4:J23 = binary

Em seguida, podemos indicar no Solver que algoritmo queremos usar para resolver o problema. Escolhemos Simplex LP porque a nossa função objetivo e as restrições são lineares. Obtemos então a seguinte solução ótima:

Quatro cartões com pilotos de Fórmula 1, o seu valor e os seus resultados desta temporada.

Esta solução tem um valor de 472 pontos. Para o fim de semana de corridas na Áustria, decido confiar plenamente no meu modelo e escolher estes pilotos para a minha equipa. Dedos cruzados…

Foi esta a melhor equipa?

Agora que o fim de semana de corridas na Áustria terminou, podemos fazer o balanço: o modelo escolheu a melhor equipa? Podemos calcular isso com base nos resultados da qualificação e da corrida. No total, a minha equipa somou 69 pontos: 27 na qualificação e 42 na corrida. Podemos agora pedir ao modelo que calcule novamente a equipa ótima, usando como valor a distribuição de pontos do jogo GP com base nos resultados da qualificação e da corrida. Obtemos assim a seguinte equipa ótima:

Quatro cartões com pilotos de Fórmula 1, o seu valor e os seus resultados desta temporada. Esta equipa somou mais 4 pontos do que a equipa que escolhi, num total de 73. Uma coisa é certa: teria sido melhor escolher Max Verstappen e Lando Norris para a equipa, pois os dois, juntos, garantem 49 pontos. Infelizmente, olhando para trás, o modelo não escolheu a equipa ideal para o fim de semana de corrida na Áustria. Isso não se deve ao modelo em si nem ao método simplex, mas ao facto de termos estimado o valor dos pilotos antes da qualificação através da função de valor. No entanto, para determinar se o modelo é estatisticamente melhor do que um participante humano, temos naturalmente de analisar mais do que um fim de semana de corrida. Uma coisa é certa: fui quem somou mais pontos na nossa liga familiar com a minha equipa.

O que pode ser melhorado

Naturalmente, ainda há vários aspetos que posso melhorar no meu modelo, sobretudo na forma como determino o valor dos pilotos. Por exemplo, o cálculo pode passar a incluir os resultados da qualificação ou o desempenho em circuitos semelhantes. Também seria interessante investigar se a função ponderada é a melhor opção para determinar esse valor. A função de valor poderia eventualmente ser otimizada com recurso a machine learning, ou o valor poderia ser tratado como estocástico em vez de determinístico. Esta última abordagem, em particular, pode trazer muito valor ao modelo, já que a sorte e o azar podem ter um papel importante na Fórmula 1.

Aplicações da programação linear

A programação linear tem inúmeras aplicações nas empresas. Pode servir, por exemplo, para encontrar a combinação ideal de produtos que uma empresa deve produzir para maximizar o lucro, elaborar os horários de trabalho do pessoal hospitalar, encontrar o percurso mais curto de A até B ou resolver um problema de transporte. Na minha opinião, as técnicas de investigação operacional, como a programação linear, ainda são pouco utilizadas no mundo da data science. Por vezes, treinam-se redes neuronais muito complexas quando a mesma pergunta poderia ser respondida com um modelo muito mais simples. No nosso trabalho, devemos, por isso, continuar sempre a ponderar a complexidade face à eficácia. Será o meu modelo suficientemente eficaz para ganhar o jogo de F1 do NU.nl? Saberemos no final desta temporada de Fórmula 1 ;).

Blog

Também poderá ter interesse nisto,

Subscreva a nossa newsletter.

Quer ser a primeira pessoa a saber quando publicamos um novo artigo no blogue?

Introduza um endereço de e-mail válido.