Algoritmo genetico di intelligenza artificiale in Python per il fantacalcio a listone

Un algoritmo genetico di intelligenza artificiale può aiutarci a trovare la combinazione migliore degli 11 calciatori da scegliere in un fantacalcio a listone? Sono partito dalle quotazioni del sito fantacalcio.it https://www.fantacalcio.it/quotazioni-fantacalcio e dalle sue statistiche della stagione scorsa 2022/2023 https://www.fantacalcio.it/statistiche-serie-a/2022-23 e ho scritto un po’ di codice in Python. Vediamo com’è andata!

Breve introduzione al regolamento del fantacalcio a listone

Ripassiamo brevemente le regole di un fantacalcio a listone: i partecipanti al torneo (che chiamiamo fantallenatori) hanno a disposizione la lista dei calciatori del nostro campionato. Ad ogni calciatore è associato un costo in fanta-crediti (che abbrevieremo con la sigla fc). Ad esempio l’attaccante del Napoli Oshimen ha un costo di 43 fc, mentre Lautaro Martinez dell’Inter costa 37 fc.

Ogni fantallenatore deve scegliere 25 calciatori prima dell’inizio del campionato, utilizzando un budget massimo di 250 fc. A partire da questo gruppo di 25, in ogni giornata di campionato il fantallenatore sceglie soltanto 11 titolari, i quali saranno i soli a contribuire per quella determinata giornata alla classifica finale. Durante il campionato il costo dei calciatori cambia in base al loro rendimento. Generalmente è possibile fare degli scambi durante l’anno (nelle finestre di mercato) utilizzando il costo aggiornato in quel particolare momento.

Oltre al limite legato al numero di calciatori e ai fanta-crediti, ci sono anche altri vincoli legati ai ruoli. Ad esempio tra i 25 calciatori scelti all’inizio devono esserci 3 portieri, 8 difensori, 8 centrocampisti e 6 attaccanti. Anche il sottoinsieme di 11 giocatori scelto ad ogni giornata deve seguire delle regole: possono essere utilizzate più combinazioni, rifacendosi ai classici moduli calcistici 4-4-2, 4-3-3, 3-4-3, eccetera. In generale la combinazione maggiormente usata è quella con 1 portiere, 4 difensori, 3 centrocampisti e 3 attaccanti.

Come l’intelligenza artificiale può aiutarci nella composizione della rosa

Teoricamente ad ogni giornata potremmo scegliere una combinazione diversa degli 11 giocatori sui 25 a disposizione. Tuttavia, se facciamo un po’ di esperienza nel gioco, intuiremo subito che in questa modalità è meglio aver chiaro fin dall’inizio quali saranno gli 11 calciatori che tendenzialmente schiereremo sempre titolari, e che quindi contribuiranno attivamente alla nostra classifica. L’intelligenza artificiale ci aiuterà proprio nella scelta di questi 11 calciatori!

Per i restanti 14 “panchinari”, a prescindere da quanto siano effettivamente utili alla nostra squadra, è meglio scegliere tra i giocatori che hanno questa caratteristica:

il loro costo in fc è sotto-stimato rispetto a quello degli altri calciatori

Spieghiamo perché: come detto in precedenza, durante l’anno il costo dei calciatori evolve con il loro rendimento. I giocatori sotto-stimati, anche se non li sceglieremo mai tra gli 11 titolari e quindi non contribuiranno direttamente alla classifica, potranno essere rivenduti nelle finestre di mercato ad un valore più alto, permettendoci di accumulare fanta-crediti per migliorare gli 11 titolari di base.

Personalmente reputo troppo difficile creare un algoritmo per individuare questa tipologia di calciatori, in quanto le sotto-stime sono generalmente frutto di fattori non catturabili dai numeri e dalle statistiche. Spesso infatti si tratta di calciatori che inizialmente dovevano essere delle riserve nello loro squadre reali, ma che poi sono diventati titolari durante la preparazione estiva pre-campionato (per loro merito o per demerito di chi era considerato all’inizio titolare), che hanno cambiato squadra durante il calcio-mercato reale, o magari l’allenatore è stato sostituito da uno nuovo che li conosce bene, e altre situazioni di questo tipo.

Questi 14 giocatori sono dunque da scegliere manualmente, cercando di consumare un budget abbastanza basso che andremo a scalare dai 250 fc totali.

Dove invece la potenza computazionale e gli algoritmi possono fare la differenza è nella scelta degli 11 titolari: in questo caso abbiamo tanti dati statistici da poter dare in pasto agli algoritmi, in primis il rendimento al fantacalcio nella stagione appena passata. Tuttavia non possiamo scegliere semplicemente gli 11 giocatori con la media-punti più alta, in quanto abbiamo il vincolo dei ruoli e dei 250 fc (che intanto saranno diventati 210 circa, dopo la scelta dei 14 panchinari). Per questo può venirci in aiuto Python e l’intelligenza artificiale, come vedremo nei prossimi paragrafi.

Applichiamo un algoritmo genetico per la scelta dei calciatori titolari

L’idea alla base del nostro algoritmo consiste nel creare generazioni di squadre sempre più forti, utilizzando meccanismi simili a quelli genetici e dell’evoluzione naturale di Charles Darwin.

Come punto di partenza consideriamo tutti i giocatori del listone che nell’anno precedente abbiano ottenuto un fanta-punteggio in almeno 20 partite di campionato (colonna pv) e, per ognuno di essi, andiamo a considerare la media aritmetica di questi fanta-punteggi (colonna fantamedia). Nella colonna quotazione riportiamo invece il costo in fanta-crediti di ogni calciatore.

dataframe di partenza per algoritmo genetico applicato al fantacalcio

L’idea dell’algoritmo è creare generazioni di squadre via via più forti. Per valutare la performance di una squadra consideriamo la somma delle fanta-medie dei suoi 11 componenti. La prima generazione sarà composta da 400 squadre casuali (ognuna delle quali rispetta comunque i vincoli di ruoli e di somma complessiva dei fanta-crediti). La seconda generazione sarà invece composta da:

  • le 200 squadre più forti della prima generazione
  • 100 squadre generate combinando le 200 più forti del punto precedente
  • altre 100 squadre casuali

Iterando questo procedimento possiamo creare una sequenza di generazioni, con al suo interno delle squadre che diventano via via più adatte all’obiettivo di massimizzare la somma delle fanta-medie, un po’ come avviene nell’evoluzione della specie. Considereremo come output finale la squadra più forte della cinquantesima generazione creata.

Tutto il codice è disponibile sul mio repository Github https://github.com/iantomasinicola/fantacalcio-e-intelligenza-artificiale. Vi lascio il link alla pagina di wikipedia se volete approfondire ulteriormente il tema degli algoritmi genetici https://it.wikipedia.org/wiki/Algoritmo_genetico. Nel prossimo paragrafo vedremo finalmente le formazioni generate!

Analizziamo le squadre ottenute con l’algoritmo genetico

Ho scritto il codice Python in modo da potergli dare in input il numero totale di fanta-crediti disponibili. Ecco una squadra generata impostando un vincolo di 209 fc (questo vuol dire che ne useremo 41 per scegliere manualmente i 14 panchinari) e il modulo 4-3-3. L’algoritmo non è deterministico, comunque le squadre generate in output hanno un valore complessivo molto simile.

Le squadre che ho ottenuto hanno qualche difetto: spesso sono presenti calciatori che hanno una quotazione molto bassa in quanto quest’anno giocano in una squadra diversa dalla precedente o non saranno più titolari, quindi è abbastanza difficile che ripetano i risultati dell’anno precedente. Rieseguo allora l’algoritmo eliminando alcune di queste casistiche: Musso, Gosens, Zanoli, Miranchuk e Colpani. Ecco la nuova squadra!

Prossimi sviluppi

Oltre a un miglioramento generale della forma del codice, le prime feature che vorrei aggiungere sono:

  • rendere parametrizzabile il numero di giocatori da scegliere e i rispettivi ruoli. Potrei infatti voler creare una squadra di 12-13 titolari per avere un minimo di possibilità di scelta ogni settimana, o viceversa una squadra di 8-9 perché alcuni acquisti sono per me irrinunciabili
  • implementare una stima dei bonus ottenuti tramite la regola del modificatore di difesa

Inoltre non sono sicuro che il numero di squadre in ogni generazione (400) e la relativa suddivisione in migliori, combinazioni e random (200-100-100) sia quella migliore. Se avete dei suggerimenti sono sicuramente graditi!

Intanto, se ti piace l’analisi dei dati, dai un’occhiata al mio corso completo di Data Analysis!

Torna in alto
Torna su