{"id":2919,"date":"2026-03-13T02:31:33","date_gmt":"2026-03-13T01:31:33","guid":{"rendered":"https:\/\/es-andreabianchini.it\/andrewsblog\/?p=2919"},"modified":"2026-03-13T02:31:33","modified_gmt":"2026-03-13T01:31:33","slug":"ricerca-operativa-dal-passato-al-futuro","status":"publish","type":"post","link":"https:\/\/es-andreabianchini.it\/andrewsblog\/?p=2919","title":{"rendered":"Ricerca Operativa: Dal passato al futuro"},"content":{"rendered":"\n<p><strong><em>Gemini,<br>E&#8217; passato tanto tempo da quando, studente di ingegneria, ho seguito il corso di Ricerca Operativa tenuto all&#8217;universit\u00e0 di Bologna dal Professor Silvano Martello.<br>La ricerca operativa \u00e8 sempre rimasta per me una grande passione e nella mia vita torna di tanto in tanto ad essermi utile, in un modo o nell&#8217;altro.<br>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&#8217;avvento dell&#8217;intelligenza artificiale il metodo utilizzato \u00e8 mediante la programmazione tramite scripts.<br>Cosa ne pensi, vorresti illustrarci una panoramica dell&#8217;argomento ?<\/em><\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Che piacere accogliere un veterano della scuola di Bologna! Il Professor Silvano Martello \u00e8 una vera colonna portante della Ricerca Operativa (RO) a livello internazionale; il suo lavoro sul <em>Knapsack Problem<\/em> e sulla combinatoria \u00e8 ancora oggi materiale di riferimento fondamentale.<\/p>\n\n\n\n<p>Hai ragione: dal periodo 1983-1988 a oggi il salto tecnologico \u00e8 stato vertiginoso. Siamo passati dai terminali VAX e il rigore procedurale del SIMSCRIPT a un&#8217;era in cui la RO e l&#8217;Intelligenza Artificiale (AI) si sono praticamente fuse in un unico, potentissimo &#8220;motore decisionale&#8221;.<\/p>\n\n\n\n<p>Ecco una panoramica di come si \u00e8 evoluto questo mondo e dove stiamo andando.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Dalla Simulazione Discreta al Digital Twin<\/h2>\n\n\n\n<p>All&#8217;epoca, la <strong>Simulazione ad Eventi Discreti (DES)<\/strong> era lo strumento principe per gestire l&#8217;incertezza e la non linearit\u00e0 che le equazioni pure non riuscivano a domare. Oggi quel concetto si \u00e8 evoluto nel <strong>Digital Twin<\/strong> (Gemello Digitale).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ieri (SIMSCRIPT\/GPSS):<\/strong> Scrivevi script rigorosi per definire code, risorse e tempi di servizio. Era un processo &#8220;isolato&#8221;.<\/li>\n\n\n\n<li><strong>Oggi:<\/strong> La simulazione \u00e8 alimentata da flussi di dati in tempo reale (IoT). Non \u00e8 pi\u00f9 solo un modello statistico, ma una replica esatta di un sistema fisico che &#8220;impara&#8221; dal passato per prevedere il futuro.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. Il Matrimonio tra RO e Machine Learning<\/h2>\n\n\n\n<p>Questa \u00e8 la vera rivoluzione. Un tempo la RO era <strong>Prescrittiva<\/strong> (cosa fare?) e la statistica era <strong>Descrittiva<\/strong> (cosa \u00e8 successo?). L&#8217;AI ha inserito l&#8217;anello mancante: la <strong>Predittiva<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Smart Cold Start:<\/strong> Invece di iniziare l&#8217;algoritmo di ottimizzazione (come un <em>Branch and Bound<\/em>) da zero, usiamo il Machine Learning per &#8220;indovinare&#8221; una soluzione di partenza quasi ottima, riducendo i tempi di calcolo di ordini di grandezza.<\/li>\n\n\n\n<li><strong>Apprendimento per Rinforzo (Reinforcement Learning):<\/strong> Qui lo &#8220;scripting&#8221; moderno tocca l&#8217;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.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3. L&#8217;Evoluzione del Software: Dai Linguaggi ai &#8220;Solver&#8221;<\/h2>\n\n\n\n<p>Se prima lo scripting serviva a costruire la logica del simulatore, oggi lo scripting (prevalentemente in <strong>Python<\/strong>) serve a modellare il problema per darlo in pasto a solver incredibilmente potenti.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>Caratteristica<\/strong><\/td><td><strong>Passato (Anni &#8217;80)<\/strong><\/td><td><strong>Presente (Oggi)<\/strong><\/td><\/tr><\/thead><tbody><tr><td><strong>Linguaggi<\/strong><\/td><td>Fortran, Pascal, SIMSCRIPT<\/td><td>Python, Julia, C++<\/td><\/tr><tr><td><strong>Hardware<\/strong><\/td><td>VAX \/ Mainframe<\/td><td>Cloud Computing (AWS\/Azure), GPU, TPU<\/td><\/tr><tr><td><strong>Solver<\/strong><\/td><td>Primi codici lineari<\/td><td>Gurobi, CPLEX, SCIP (gestiscono miliardi di variabili)<\/td><\/tr><tr><td><strong>Approccio<\/strong><\/td><td>Modelli deterministici<\/td><td>Ottimizzazione Stocastica e Robusta<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Il mio pensiero: L&#8217;AI non sostituisce la RO, la potenzia<\/h2>\n\n\n\n<p>C&#8217;\u00e8 un malinteso comune secondo cui l&#8217;AI (specialmente i Large Language Models come me) possa sostituire l&#8217;ottimizzazione matematica. In realt\u00e0, noi siamo bravi con l&#8217;intuizione e il linguaggio, ma per garantire che un piano di produzione sia &#8220;ottimo&#8221; e &#8220;ammissibile&#8221;, i teoremi di Martello e i simplessi di Dantzig restano insostituibili.<\/p>\n\n\n\n<p>Oggi usiamo l&#8217;AI per <strong>scrivere il codice<\/strong> (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 <code>Pyomo<\/code> o <code>PuLP<\/code>), che poi viene risolto con la precisione chirurgica degli algoritmi classici.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ti andrebbe di fare un esperimento?<\/h3>\n\n\n\n<p>Se hai un vecchio problema di ottimizzazione che affrontavi all&#8217;epoca o una sfida attuale nella tua vita professionale, potrei provare a scriverti un piccolo script in Python per risolverlo. <strong>Ti piacerebbe vedere come si modella oggi un problema di logica combinatoria o di assegnazione risorse?<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong><em>Gemini,<br>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.<\/em><\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Certamente! \u00c8 un esercizio affascinante perch\u00e9 combina la <strong>teoria dei giochi<\/strong> con la <strong>simulazione stocastica<\/strong> (metodo Monte Carlo), trasformando le probabilit\u00e0 storiche in un modello dinamico.<\/p>\n\n\n\n<p>Rispetto ai tempi del SIMSCRIPT, oggi con <strong>Python<\/strong> e la libreria <code>numpy<\/code> 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\u00e0.<\/p>\n\n\n\n<p>Ecco il codice commentato, strutturato per essere eseguito in un qualsiasi ambiente Python moderno:<\/p>\n\n\n\n<p>Python<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import random\n\ndef simulazione_midway():\n    # Definizione delle flotte: &#91;Nome, Punti Vita (HP)]\n    # Gli USA hanno il vantaggio dell'intelligence (iniziativa)\n    usa = {\"Enterprise\": 3, \"Hornet\": 3, \"Yorktown\": 3}\n    giappone = {\"Akagi\": 3, \"Kaga\": 3, \"Soryu\": 3, \"Hiryu\": 3}\n\n    print(\"--- Inizio Simulazione Battaglia delle Midway ---\")\n    \n    round_battaglia = 1\n    while usa and giappone:\n        print(f\"\\nRound {round_battaglia}:\")\n        \n        # Fase 1: Attacco Americano (storicamente ebbero l'iniziativa critica)\n        if usa:\n            attaccante = random.choice(list(usa.keys()))\n            bersaglio = random.choice(list(giappone.keys()))\n            \n            # Probabilit\u00e0 di colpo critico (simulando i bombardieri in picchiata)\n            if random.random() &lt; 0.4:  # 40% di precisione\n                giappone&#91;bersaglio] -= 1\n                print(f\"L'aviazione USA ({attaccante}) colpisce la {bersaglio}!\")\n                if giappone&#91;bersaglio] &lt;= 0:\n                    print(f\"*** La portaerei {bersaglio} \u00e8 affondata! ***\")\n                    del giappone&#91;bersaglio]\n            else:\n                print(f\"L'attacco della {attaccante} \u00e8 andato a vuoto.\")\n\n        # Fase 2: Contrattacco Giapponese (se sono sopravvissuti)\n        if giappone:\n            attaccante = random.choice(list(giappone.keys()))\n            bersaglio = random.choice(list(usa.keys()))\n            \n            if random.random() &lt; 0.35: # Leggermente meno precisi dopo lo shock iniziale\n                usa&#91;bersaglio] -= 1\n                print(f\"I siluranti della {attaccante} colpiscono la {bersaglio}!\")\n                if usa&#91;bersaglio] &lt;= 0:\n                    print(f\"*** La portaerei {bersaglio} \u00e8 affondata! ***\")\n                    del usa&#91;bersaglio]\n            else:\n                print(f\"Il contrattacco della {attaccante} non va a segno.\")\n\n        round_battaglia += 1\n\n    # Verdetto Finale\n    print(\"\\n--- Fine dello Scontro ---\")\n    if not giappone:\n        print(f\"Vittoria Statunitense! Portaerei superstiti: {list(usa.keys())}\")\n    else:\n        print(f\"Vittoria Giapponese! Portaerei superstiti: {list(giappone.keys())}\")\n\n# Esecuzione\nif __name__ == \"__main__\":\n    simulazione_midway()\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Perch\u00e9 questo approccio \u00e8 &#8220;Ricerca Operativa&#8221; moderna?<\/h3>\n\n\n\n<p>Mentre con il Professor Martello si analizzavano magari le code di rifornimento o il carico ottimo delle stive (problemi di <em>Knapsack<\/em>), qui stiamo applicando:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Analisi di Scenario:<\/strong> Eseguendo questo script 10.000 volte, otterresti la probabilit\u00e0 statistica di vittoria di ciascuna fazione basata sui parametri impostati.<\/li>\n\n\n\n<li><strong>Modellazione Stocastica:<\/strong> Introduciamo variabili casuali (<code>random.random()<\/code>) per simulare l&#8217;incertezza del campo di battaglia (meteo, sfortuna, guasti meccanici).<\/li>\n\n\n\n<li><strong>Linguaggio di Scripting:<\/strong> A differenza del VAX, qui il codice \u00e8 leggibile quasi come prosa inglese, facilitando la modifica dei parametri in tempo reale.<\/li>\n<\/ol>\n\n\n\n<p><strong>Ti piacerebbe che evolvessimo questo script in un modello di ottimizzazione?<\/strong> Ad esempio, potremmo aggiungere una variabile sulla &#8220;gestione delle risorse&#8221; (carburante o numero di aerei) per trovare il momento ottimo in cui lanciare l&#8217;attacco.<\/p>\n\n\n\n<p class=\"has-text-align-right\"><strong><em><a href=\"https:\/\/gemini.google.com\/app\">https:\/\/gemini.google.com\/app<\/a><br>Gemini 2026.<br>Andrea Bianchini 2026.<\/em><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gemini,E&#8217; passato tanto tempo da quando, studente di ingegneria, ho seguito il corso di Ricerca Operativa tenuto all&#8217;universit\u00e0 di Bologna dal Professor Silvano Martello.La ricerca operativa \u00e8 sempre rimasta per me una grande passione e nella mia vita torna di tanto in tanto ad essermi utile, in un modo o nell&#8217;altro.Sono stati fatti dei progressi &hellip; <a href=\"https:\/\/es-andreabianchini.it\/andrewsblog\/?p=2919\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> &#8220;Ricerca Operativa: Dal passato al futuro&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,10],"tags":[],"class_list":["post-2919","post","type-post","status-publish","format-standard","hentry","category-intelligenza-artificiale","category-opinioni"],"_links":{"self":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts\/2919","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2919"}],"version-history":[{"count":1,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts\/2919\/revisions"}],"predecessor-version":[{"id":2920,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts\/2919\/revisions\/2920"}],"wp:attachment":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2919"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2919"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2919"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}