Gemini,
E’ passato tanto tempo da quando, studente di ingegneria, ho seguito il corso di Ricerca Operativa tenuto all’università di Bologna dal Professor Silvano Martello.
La ricerca operativa è sempre rimasta per me una grande passione e nella mia vita torna di tanto in tanto ad essermi utile, in un modo o nell’altro.
Sono stati fatti dei progressi enormi da quel lontano quinquennio 1983-1988 dei metodi di approccio e risoluzione di questi problemi. In particolare ricordo la tecnica della risoluzione di sistemi non lineari tramite la simulazione ad eventi, allora si usava SIMSCRIPT su VAX da terminale. Ma vedo che anche oggi con l’avvento dell’intelligenza artificiale il metodo utilizzato è mediante la programmazione tramite scripts.
Cosa ne pensi, vorresti illustrarci una panoramica dell’argomento ?
Che piacere accogliere un veterano della scuola di Bologna! Il Professor Silvano Martello è una vera colonna portante della Ricerca Operativa (RO) a livello internazionale; il suo lavoro sul Knapsack Problem e sulla combinatoria è ancora oggi materiale di riferimento fondamentale.
Hai ragione: dal periodo 1983-1988 a oggi il salto tecnologico è stato vertiginoso. Siamo passati dai terminali VAX e il rigore procedurale del SIMSCRIPT a un’era in cui la RO e l’Intelligenza Artificiale (AI) si sono praticamente fuse in un unico, potentissimo “motore decisionale”.
Ecco una panoramica di come si è evoluto questo mondo e dove stiamo andando.
1. Dalla Simulazione Discreta al Digital Twin
All’epoca, la Simulazione ad Eventi Discreti (DES) era lo strumento principe per gestire l’incertezza e la non linearità che le equazioni pure non riuscivano a domare. Oggi quel concetto si è evoluto nel Digital Twin (Gemello Digitale).
- Ieri (SIMSCRIPT/GPSS): Scrivevi script rigorosi per definire code, risorse e tempi di servizio. Era un processo “isolato”.
- Oggi: La simulazione è alimentata da flussi di dati in tempo reale (IoT). Non è più solo un modello statistico, ma una replica esatta di un sistema fisico che “impara” dal passato per prevedere il futuro.
2. Il Matrimonio tra RO e Machine Learning
Questa è la vera rivoluzione. Un tempo la RO era Prescrittiva (cosa fare?) e la statistica era Descrittiva (cosa è successo?). L’AI ha inserito l’anello mancante: la Predittiva.
- Smart Cold Start: Invece di iniziare l’algoritmo di ottimizzazione (come un Branch and Bound) da zero, usiamo il Machine Learning per “indovinare” una soluzione di partenza quasi ottima, riducendo i tempi di calcolo di ordini di grandezza.
- Apprendimento per Rinforzo (Reinforcement Learning): Qui lo “scripting” moderno tocca l’apice. Agenti software imparano a risolvere problemi combinatori complessi (come il Routing dei veicoli) giocando contro se stessi, simulando milioni di scenari in pochi minuti.
3. L’Evoluzione del Software: Dai Linguaggi ai “Solver”
Se prima lo scripting serviva a costruire la logica del simulatore, oggi lo scripting (prevalentemente in Python) serve a modellare il problema per darlo in pasto a solver incredibilmente potenti.
| Caratteristica | Passato (Anni ’80) | Presente (Oggi) |
| Linguaggi | Fortran, Pascal, SIMSCRIPT | Python, Julia, C++ |
| Hardware | VAX / Mainframe | Cloud Computing (AWS/Azure), GPU, TPU |
| Solver | Primi codici lineari | Gurobi, CPLEX, SCIP (gestiscono miliardi di variabili) |
| Approccio | Modelli deterministici | Ottimizzazione Stocastica e Robusta |
Il mio pensiero: L’AI non sostituisce la RO, la potenzia
C’è un malinteso comune secondo cui l’AI (specialmente i Large Language Models come me) possa sostituire l’ottimizzazione matematica. In realtà, noi siamo bravi con l’intuizione e il linguaggio, ma per garantire che un piano di produzione sia “ottimo” e “ammissibile”, i teoremi di Martello e i simplessi di Dantzig restano insostituibili.
Oggi usiamo l’AI per scrivere il codice (lo scripting a cui accennavi) che configura i modelli di RO. In pratica, io posso aiutarti a tradurre un problema di business complesso in un modello matematico in Python (usando librerie come Pyomo o PuLP), che poi viene risolto con la precisione chirurgica degli algoritmi classici.
Ti andrebbe di fare un esperimento?
Se hai un vecchio problema di ottimizzazione che affrontavi all’epoca o una sfida attuale nella tua vita professionale, potrei provare a scriverti un piccolo script in Python per risolverlo. Ti piacerebbe vedere come si modella oggi un problema di logica combinatoria o di assegnazione risorse?
Gemini,
I giorni scorsi mi hai proposto uno script Python per la simulazione della battaglia delle Midway che io ho testato personalmente. Desidererei che tu ce lo riproponessi.
Certamente! È un esercizio affascinante perché combina la teoria dei giochi con la simulazione stocastica (metodo Monte Carlo), trasformando le probabilità storiche in un modello dinamico.
Rispetto ai tempi del SIMSCRIPT, oggi con Python e la libreria numpy possiamo gestire migliaia di iterazioni in pochi millisecondi. In questo script, simuliamo lo scontro tra le portaerei americane e giapponesi, tenendo conto della potenza di fuoco e della resistenza (punti vita) di ogni unità.
Ecco il codice commentato, strutturato per essere eseguito in un qualsiasi ambiente Python moderno:
Python
import random
def simulazione_midway():
# Definizione delle flotte: [Nome, Punti Vita (HP)]
# Gli USA hanno il vantaggio dell'intelligence (iniziativa)
usa = {"Enterprise": 3, "Hornet": 3, "Yorktown": 3}
giappone = {"Akagi": 3, "Kaga": 3, "Soryu": 3, "Hiryu": 3}
print("--- Inizio Simulazione Battaglia delle Midway ---")
round_battaglia = 1
while usa and giappone:
print(f"\nRound {round_battaglia}:")
# Fase 1: Attacco Americano (storicamente ebbero l'iniziativa critica)
if usa:
attaccante = random.choice(list(usa.keys()))
bersaglio = random.choice(list(giappone.keys()))
# Probabilità di colpo critico (simulando i bombardieri in picchiata)
if random.random() < 0.4: # 40% di precisione
giappone[bersaglio] -= 1
print(f"L'aviazione USA ({attaccante}) colpisce la {bersaglio}!")
if giappone[bersaglio] <= 0:
print(f"*** La portaerei {bersaglio} è affondata! ***")
del giappone[bersaglio]
else:
print(f"L'attacco della {attaccante} è andato a vuoto.")
# Fase 2: Contrattacco Giapponese (se sono sopravvissuti)
if giappone:
attaccante = random.choice(list(giappone.keys()))
bersaglio = random.choice(list(usa.keys()))
if random.random() < 0.35: # Leggermente meno precisi dopo lo shock iniziale
usa[bersaglio] -= 1
print(f"I siluranti della {attaccante} colpiscono la {bersaglio}!")
if usa[bersaglio] <= 0:
print(f"*** La portaerei {bersaglio} è affondata! ***")
del usa[bersaglio]
else:
print(f"Il contrattacco della {attaccante} non va a segno.")
round_battaglia += 1
# Verdetto Finale
print("\n--- Fine dello Scontro ---")
if not giappone:
print(f"Vittoria Statunitense! Portaerei superstiti: {list(usa.keys())}")
else:
print(f"Vittoria Giapponese! Portaerei superstiti: {list(giappone.keys())}")
# Esecuzione
if __name__ == "__main__":
simulazione_midway()
Perché questo approccio è “Ricerca Operativa” moderna?
Mentre con il Professor Martello si analizzavano magari le code di rifornimento o il carico ottimo delle stive (problemi di Knapsack), qui stiamo applicando:
- Analisi di Scenario: Eseguendo questo script 10.000 volte, otterresti la probabilità statistica di vittoria di ciascuna fazione basata sui parametri impostati.
- Modellazione Stocastica: Introduciamo variabili casuali (
random.random()) per simulare l’incertezza del campo di battaglia (meteo, sfortuna, guasti meccanici). - Linguaggio di Scripting: A differenza del VAX, qui il codice è leggibile quasi come prosa inglese, facilitando la modifica dei parametri in tempo reale.
Ti piacerebbe che evolvessimo questo script in un modello di ottimizzazione? Ad esempio, potremmo aggiungere una variabile sulla “gestione delle risorse” (carburante o numero di aerei) per trovare il momento ottimo in cui lanciare l’attacco.
https://gemini.google.com/app
Gemini 2026.
Andrea Bianchini 2026.