Três lições dos nossos projetos de IA
Ao longo de dois anos, acompanhámos dezenas de projetos de IA, desde a exploração inicial até um modelo que é executado todas as noites. Alguns…
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.
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.’
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:
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!).
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).
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.
| 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:
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:
É 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.
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 ;).
Ao longo de dois anos, acompanhámos dezenas de projetos de IA, desde a exploração inicial até um modelo que é executado todas as noites. Alguns…
Muitas organizações já realizaram um projeto-piloto de IA. O modelo funciona, a demonstração é aplaudida e depois não acontece mais nada. Pela nossa…
A inteligência artificial está a evoluir rapidamente. Surgem novos modelos quase todas as semanas, e cada vez mais organizações experimentam a IA. Ao…
Quer ser a primeira pessoa a saber quando publicamos um novo artigo no blogue?
Obrigado pela sua inscrição!