Ir para o conteúdo
Ir para insights 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 cada fim de semana de corrida com os nervos à flor da pele. Torço pelo Max Verstappen, claro, mas também tento superar os meus familiares no jogo de GP da NU.nl. Embora tenha a certeza de que sou quem mais sabe de Fórmula 1 na minha família, muitas vezes recorro à matemática para me ajudar.

Como funciona o jogo de GP?

O jogo de GP foi desenvolvido pela NU.nl e decorre ao longo de uma temporada de Fórmula 1. Em cada fim de semana, realiza-se 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 é possível ganhar pontos extra ao prever corretamente a posição de Max Verstappen. Neste artigo, explico como usei modelos matemáticos para otimizar a minha equipa de quatro pilotos. Desta vez, deixo de fora 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, por exemplo, custa nada menos do que 50 milhões, enquanto Mick Schumacher – filho de - custa ‘apenas’ 5 milhões. Ganha pontos consoante as posições dos pilotos da sua equipa após 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 escolhida.

Problema da mochila

O problema descrito acima, que consiste em 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 quais os objetos a colocar na mochila para maximizar o valor 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, não podemos exceder o peso máximo; chamamos a isto uma restrição.

O jogo 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 que valor cada piloto acrescenta, pelo que precisamos de encontrar uma solução ‘inteligente’ para isso (voltarei a este ponto mais à frente). Além do orçamento de 100 milhões, o jogo impõe mais algumas restrições 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; escolhe um piloto (1) ou não o escolhe (0).

O jogo 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 recorrendo à 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. Além disso, falamos de um problema de programação linear inteira porque a solução é binária (e, por isso, assume valores inteiros). Definimos, para cada piloto i, uma variável de decisão x_i. Esta variável é igual a 1 se o piloto i for escolhido na solução e a 0 se não for escolhido. 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 anteriormente, queremos maximizar o valor da nossa equipa. Por isso, atribuímos um valor w_i a cada piloto i (20 no total). Este valor é determinado com base na classificação atual do campeonato e nos resultados dos treinos livres. Assim, tenho em conta o desempenho de cada piloto ao longo da época e durante o fim de semana da corrida. Por exemplo, o valor de Max Verstappen para o fim de semana da 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 nos treinos livres 1: 1 (P1)
Posição nos treinos livres 2: 3 (P2)
Posição nos treinos livres 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 pilotos que a integram. Note que isto corresponde à função objetivo da nossa formulação matemática acima, uma vez que a variável x_i é igual a 0 se um piloto não fizer parte da nossa equipa.

Seguem-se as restrições. A restrição 1 estabelece que o custo total de todos os pilotos que escolhemos para a 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 da função objetivo: se não escolhermos um piloto para a equipa, a variável x_i é igual a 0 e não incluímos esse custo. A restrição 2 garante que selecionamos exatamente quatro pilotos para a 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 determina que a soma das 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

Para a modelação, desta vez 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 cálculo do 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 os 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 está 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 estão 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
Só pode escolher 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

De seguida, podemos indicar ao Solver que algoritmo queremos usar para resolver o problema. Escolhemos o Simplex LP porque a nossa função objetivo e as restrições são lineares. Obtemos assim 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. Decido confiar totalmente no meu modelo para o fim de semana de corrida na Áustria e escolher estes pilotos para a minha equipa. Resta-me cruzar os dedos…

Foi esta a melhor equipa?

Agora que o fim de semana de corrida na Áustria terminou, podemos fazer o balanço: escolheu o modelo a melhor equipa? Podemos calculá-lo com base nos resultados da qualificação e da corrida. No total, a minha equipa conquistou 69 pontos: 27 na qualificação e 42 na corrida. Agora podemos pedir ao modelo que calcule novamente a equipa ótima, usando como valor a distribuição de pontos do jogo do 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, chegando aos 73. Não há dúvida de que devia ter escolhido Max Verstappen e Lando Norris para a sua equipa: juntos, conseguiram 49 pontos. Infelizmente, olhando para trás, o modelo não escolheu a equipa ideal para o fim de semana de corrida na Áustria. Isto 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 com a 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: a minha equipa foi a que somou mais pontos na nossa liga familiar.

Pontos a melhorar

É claro que ainda há vários aspetos do meu modelo que podem ser melhorados, sobretudo a forma de determinar 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 uma função ponderada é a melhor opção para determinar esse valor. A função de valor poderia 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, poderia acrescentar muito 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 todo o tipo de aplicações nas empresas. Pode servir, por exemplo, para encontrar a combinação ideal de produtos que uma empresa deve fabricar para maximizar o lucro, elaborar um horário de trabalho para profissionais de um hospital, 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 um modelo muito mais simples poderia responder à mesma pergunta. Por isso, no nosso trabalho, devemos continuar 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.