Internet si espande ad una velocità vertiginosa. Le stime affermano che attualmente il numero degli utenti della rete ammonta a quasi un miliardo e mezzo di persone. Molti di questi utenti hanno una propria homepage. Tuttavia, come nella “vita vera”, non tutti curano il proprio spazio con la stessa premura. Le pagine Internet vanno e vengono, scompaiono del tutto dalla rete oppure vengono integrate in sistemi più grandi. Alcune incontrano un successo tale che se anche all’inizio erano liberamente accessibili, in un secondo momento possono essere visitate solo dietro pagamento. Welcome to the real world! Questo libro contiene molti indirizzi Internet interessanti per l’argomento trattato. Al momento della stampa essi sono tutti attivi e utilizzabili liberamente. Tuttavia, la situazione potrebbe cambiare. Già domani la stessa pagina web potrebbe mostrare contenuti diversi, o venire addirittura tolta dalla rete; potrebbero venire richieste tasse sul suo utilizzo o fare la loro comparsa nuovi banner pubblicitari, magari indecenti; tutto secondo la legge di Murphy: “If anything can go wrong, it will!” Una lista di tutti i links aggiornata (e cliccabile!) può essere trovata all’indirizzo: http://www-m9.ma.tum.de/rut
Questo libro contiene una serie di rimandi a pagine in Internet. Purtroppo non ci è stato sempre possibile verificare se il contenuto offerto in queste pagine web rispetta i diritti d’autore di terzi. Visitando una pagina web con contenuti che ledono i diritti d’autore, può essere commessa infrazione. Vorremmo segnalare questa circostanza. Springer
Peter Gritzmann · René Brandenberg
Alla ricerca della via più breve Un’avventura matematica 2a ed. Traduzione a cura di Stefano Ruggerini
123
Prof. Dott. Peter Gritzmann Dott. René Brandenberg TU München Zentrum Mathematik 80290 München, Deutschland
[email protected] [email protected]
ISBN 978-88-470-1088-8
e-ISBN 978-88-470-1089-5
Springer fa parte di Springer Science+Business Media springer.com c Springer-Verlag Italia, Milano 2009 Quest’opera è protetta dalla legge sul diritto d’autore, e la sua riproduzione è ammessa solo ed esclusivamente nei limiti stabiliti dalla stessa. Le fotocopie per uso personale possono essere effettuate nei limiti del 15% di ciascun volume dietro pagamento alla SIAE del compenso previsto. Le riproduzioni per uso non personale e/o oltre il limite del 15% potranno avvenire solo a seguito di specifica autorizzazione rilasciata da AIDRO, Via Corso di Porta Romana n. 108, Milano 20122, e-mail
[email protected] e sito web www.aidro.org. Tutti i diritti, in particolare quelli relativi alla traduzione, alla ristampa, all’utilizzo di illustrazioni e tabelle, alla citazione orale, alla trasmissione radiofonica o televisiva, alla registrazione su microfilm o in database, o alla riproduzione in qualsiasi altra forma (stampata o elettronica) rimangono riservati anche nel caso di utilizzo parziale. La violazione delle norme comporta le sanzioni previste dalla legge.
Collana ideata e curata da: Marina Forlizzi Traduzione di Stefano Ruggerini Impaginazione: le-tex publishing services oHG, Leipzig Copertina: progetto grafico di Simona Colombo, Milano Stampa: Grafiche Porpora, Segrate, Milano Stampato in Italia Springer-Verlag Italia S.r.l., via Decembrio 28, I-20137 Milano
Indice
Primo contatto
1
Pianificare un itinerario?
9
Piacere, grafo
23
Il peso ha un peso
37
Un’innocua esplosione
43
Monaco in quattro fermate
51
Scelte locali, benefici globali
59
In principio era l’input
69
Negativo è negativo
83
Tempi buoni, tempi cattivi
91
Intuito femminile
107
Il lavoro che precede il lavoro
119
Per assurdo
127
Il Prim della classe
141
Arraffa ciò che puoi
155
Arbore. . . cosa?
165
Un vecchio straordinario
175
VI Alla ricerca della via più breve
Magnetica dimostrazione
185
Euleriano o non euleriano, questo è il dilemma
193
Eulero e Babbo Natale
201
Oggi girovaga la nettezza urbana
211
La stagione delle coppie
223
Posta dalla Cina
233
Scacco matto?
249
Amore platonico?
265
Notoriamente Problematico
277
Sorte di un commesso viaggiatore
293
Chiedere meno e ottenere di più
309
150 per cento
319
Bonsai
329
Nient’affatto platonico
343
Il successo del commesso viaggiatore
355
Indice analitico
369
Primo contatto
«Ciao mamma.» «Ciao signorina.» Era dal giorno del quindicesimo compleanno di Rut che sua madre la chiamava in quel modo: Rut si era lamentata dicendo di non essere più “la piccola”. In quel momento Rut tornava da scuola piuttosto di cattivo umore. Con lo studio non se la cavava male. Da qualche tempo, tuttavia, era come se le materie scolastiche – o almeno la maggior parte di esse – la lasciassero indifferente. Questa situazione aveva cominciato a delinearsi quando ancora si trovava in Italia e, adesso che era all’estero, non faceva che precipitare. Sempre più spesso si chiedeva che senso avesse ciò che le veniva insegnato. La materia peggiore, da questo punto di vista, era senza dubbio la matematica. Nonostante fosse sempre stata piuttosto brava in questa disciplina, ultimamente non riusciva più ad interessarsene davvero. A che scopo ficcarsi in testa quella roba astratta? C’è forse qualcuno che calcola con le lettere o usa il teorema di Pitagora o di Talete? All’infuori di suo padre, non sapeva proprio chi potesse averne bisogno. E nemmeno suo padre era in grado di spiegarle perché quelle cose, di per sé, fossero tanto importanti: lui stesso, dopo tutto, aveva studiato informatica. Rut andò in camera sua. «Wow! Non ci posso credere. MAMMA!» Rut si precipitò in camera di sua madre. «È per me quello?» «No. L’abbiamo solo appoggiato da te in attesa che. . . »
2 Alla ricerca della via più breve
Sua madre non era proprio capace di fingere e non le riuscì di trattenere un sorriso di compiacimento. «Oh, è fantastico! Grazie Mamma.» «Ringrazia tuo padre, stasera quando torna. È stato lui a portarlo a casa.» Rut era davvero al settimo cielo: finalmente un computer tutto suo! Ormai la stragrande maggioranza dei compagni di scuola ne possedeva già uno e soprattutto i maschi non facevano che vantarsi delle prestazioni dei loro calcolatori, dell’arsenale di accessori in dotazione o dell’ultimo, nuovissimo gioco acquistato. Ebbene, anche lei ora poteva affrontarli alla pari. Suo padre aveva già collegato tutto. C’era perfino il modem. Internet, e-mail, newsgroups: tutto era possibile. A dire il vero, Rut avrebbe aiutato volentieri suo padre nell’assemblaggio, ma ora non restava che premere il pulsante di accensione e cominciare. Anche così non era male. Ascoltò il leggerissimo brusio che il calcolatore emise. A quanto pare, il software era già installato. Come avrebbe voluto assistere anche a questa operazione! Queste cose, semplicemente, la interessavano. Probabilmente c’erano programmi di ogni tipo. Dall’emozione non sapeva con che cosa cominciare: meglio scrivere una lettera o magari direttamente una e-mail? Anche un piccolo gioco non sarebbe stato sgradito. Un avviso sullo schermo la informò che avrebbe dovuto accendere anche il “dispositivo di comunicazione”. Ah sì: vicino al calcolatore c’era un apparecchio che Rut, per quanto potesse ricordare, non aveva mai visto a casa dei suoi amici. Doveva essere per forza il dispositivo di comunicazione. Una piccola pressione sull’interruttore e già la spia di controllo era illuminata. Rut si sforzò di capire cosa volesse dire ogni simbolo sul monitor. Sotto un’icona lesse: “Solo per giovani donne dai 15 anni in su”. Papà era incline a non prenderla sul serio. Come le dava fastidio questo! I genitori non possono semplicemente accettare il fatto che i loro figli crescono e diventano adulti? Ancora irritata per quelle righe, fece clic sull’icona e altri simboli apparvero nella finestra. Uno di questi ritraeva un volto. Rut provò ad aprire quello.
3 «Ciao Rut.»
«Ti prego, non così veloce. Mi devo prima abituare alla tua voce e alla tua pronuncia.» «Non può essere. Questa scatola non solo parla: capisce perfino!» «Scatola? Intendi dire con questo. . . me?» «Ehm. . . veramente sì.» «Mi chiamo Vim.» «Vim? E tu lo trovi del tutto normale, stare qui adesso a parlare con me? Chi, cioè. . . che cosa sei e come fai a sapere il mio nome?» «Non così veloce! Una domanda alla volta. A dire il vero, sono solo un programma, ma di un tipo assolutamente nuovo. Sono stato programmato in modo che con me si possa conversare normalmente. E adesso veniamo alla seconda domanda: il nome Rut è stato introdotto in questo computer come nome utente. Tu sei Rut, non è vero?» «Non credo a una parola di quello che dici. Un software col quale si può conversare tranquillamente non esiste proprio.» «Te l’ho pure detto che sono una novità assoluta.» «Ma una novità del genere non finisce comunque di certo sul mio computer.» «A quanto pare ci sono finito e farei anche volentieri amicizia con te.» «Amicizia con me? Ma se sei solo un programma per computer! Come puoi essere mio amico?» «Perché no? Una caratteristica importante degli amici è quella di poter parlare con loro di tutto. Io so ascoltare bene e ho anche qualcosa da raccontare. . . » «Credo che mi ci vorrà un po’ di tempo per digerire questa cosa.»
Primo contatto
«Cosa?. . . Come sarebbe a dire adesso “Ciao Rut”?»
4 Alla ricerca della via più breve
Rut era alquanto perplessa. Non sapeva proprio come comportarsi con questo programma. Vim un amico? La sera stessa ne avrebbe certamente parlato con papà. Un momento! Perché non farlo subito? Corse al telefono. «Ciao Rut.» «Ma come facevi a sapere che ero io?» «Qui il telefono è così intelligente, che mi fa vedere subito il numero di chi chiama.» «Ma poteva anche trattarsi di mamma.» «A quanto pare, però, non era lei.» Come le piacevano queste risposte di suo padre: avrebbe potuto saltargli al collo e abbracciarlo seduta stante. «Papà, grazie! Che magnifica sorpresa, il computer! Adesso che ce l’ho, potrò anch’io dire la mia, a scuola. E finalmente potrò scrivere con la posta elettronica ai miei amici a Milano. Sicuramente Sara starà già chiedendosi che fine ho fatto e aspetterà mie notizie. Ma c’è un problemino. . . » «Su, spara.» «Sul computer c’è quel software, lo sai, no? Quello per giovani donne dai quindici in su.» «Non l’ho guardato. Non sembra certo per me.» «Smettila! Ti conosco. È senz’altro roba tua. Questa faccenda delle giovani donne è sicuramente una tua trovata per farmi arrabbiare.» «Non so proprio di cosa parli; t’assicuro che sono innocente. Il software che dici tu deve far parte del pacchetto originale. Assieme a un computer nuovo ci sono sempre un mucchio di cianfrusaglie. E che vuoi che ne sappia io, di cosa sia di moda adesso in Germania.» Rut, ovviamente, non credeva a una sola parola di ciò che diceva suo padre, ma sapeva benissimo che non valeva la pena di insistere: lui avrebbe continuato a negare ogni cosa. E se fosse stato veramente all’oscuro di tutto? Questa alternativa era ancora più
5
«Va bene. Adesso devo andare a fare i compiti. Grazie ancora per la bellissima sorpresa. Ti mando un bacione.» «Ops, arrivato! Allora buon divertimento, ma ricordati che i compiti non si fanno da sé mentre tu giochi al computer.» «Chiaro. A dopo.» Rut i compiti li faceva sempre. Quasi sempre. Anche adesso aveva tutta l’intenzione di sedere al tavolo e cominciarli. Forse, però, era doveroso dare almeno una breve occhiata al computer, per controllare che tutto fosse a posto. Funzionerà ancora quel buffo programma? E se il dialogo di prima fosse stato solo frutto dell’immaginazione? «Ciao Rut.» Di nuovo “Ciao Rut”: ma come facevano a sapere tutti, oggi, che era lei? «Vim, tu hai detto poco fa di essere capace di raccontare.» «Sì, so ascoltare e so raccontare.» «Benissimo. Raccontami allora qualcosa. Dovrei fare i compiti, ma non ne ho la minima voglia.» «Perché? La scuola non ti piace?» «Beh, veramente. . . Nella mia classe mi trovo molto bene, ma il cambiamento di scuola non è stato così semplice.» «Hai cambiato scuola?» «Ah già, tu non puoi saperlo. Mio padre è stato mandato qui in Germania dalla sua azienda per tre anni. Ci disse che avevano bisogno di lui per lo sviluppo di non so quale software. E così siamo a Monaco dall’anno scorso.» «Nel capoluogo della Baviera, la terza città tedesca, famosissima per l’Oktoberfest.»
Primo contatto
emozionante: forse quel programma era stato installato per errore. Una svista. Magari si trattava perfino di software segreto. . . Vim stesso aveva detto di essere un programma assolutamente nuovo. Rut decise, per il momento, di tenere la cosa per sé.
6 Alla ricerca della via più breve Veduta di Monaco di Baviera, con le Alpi sullo sfondo
«Ehi, questa è bella! Una foto di Monaco. Da dove l’hai tirata fuori?» «Oh beh, stava da qualche parte nei miei archivi. Ma dimmi, ti piace Monaco?» «La città è fantastica ed ho già anche un mucchio di nuovi amici. Però le lezioni a scuola. . . » «Perché? Che cosa non ti piace allora della scuola?» «Si studia tanta roba inutile. . . Preferirei imparare qualcosa di più emozionante, magari qualcosa che possa servire anche nella vita vera. Figurati la matematica! Nessuno mi sa dire a che serve quell’accozzaglia di cose astratte. Tutti dicono che è importante per la mente, per il pensiero, ma io imparerei davvero più volentieri qualcosa di pratico.»
7 «Ma la matematica è pratica!»
«Ma no, che credi? Molto più emozionante. Se vuoi, ti racconto qualcosa di un settore della matematica che trova applicazioni concretissime nella vita di ogni giorno e che affronta problemi la cui comprensione, in fondo, è facile. Inoltre, scommetto che perfino il tuo insegnante di matematica ne sa poco.» «Guarda che se non si tratta delle solite due o tre formule, non mi meraviglierei affatto se il signor Liste non ne avesse ancora sentito parlare. In classe tutti dicono sempre: “Niente è più triste di mate con Liste”. Con il mio insegnante, a casa, andava meglio. Ma dimmi, esiste davvero una matematica che sia allo stesso tempo utile e facile?» «Calma! Non ho detto che la matematica sia facile. Ti ho solo detto che i problemi sono facili da capire. La matematica che ci sta dietro può essere molto difficile. Vi sono tuttavia problemi per i quali anche la matematica, fortunatamente, non è troppo complicata.» «Benissimo. E di che si tratta?» «Della Pianificazione di itinerario.»
Primo contatto
«Ti prego, non mi parlare di quei problemi “pratici” del tipo: se 3 bottiglie di birra costano 2 Euro, quanto costano 7 bottiglie? Ne ho già avuto abbastanza alle scuole medie!»
Pianificare un itinerario? «Pianificare un itinerario? E che vorrebbe dire? Ha qualcosa a che fare con i viaggi?» «Sì. Immagina di voler partire da Monaco, con i tuoi genitori, alla volta di Amburgo.» «Amburgo l’abbiamo vista proprio la scorsa estate! Era una tappa del nostro viaggio attraverso la Germania. Papà aveva insistito che cominciassimo a conoscere la Germania, ora che ci vivevamo.» «E dimmi, ti è piaciuta?» «Immensamente! Il viaggio è stato veramente interessante: c’è talmente tanto da vedere! Ma sai che Monaco, in fondo, è la città che preferisco?» «Ne sono proprio felice. Ammettiamo comunque che vogliate recarvi di nuovo ad Amburgo. Probabilmente deciderete, per prima cosa, se viaggiare in auto oppure in treno, dopodiché cercherete di viaggiare in modo ottimale. “Ottimale” potrebbe significare per voi arrivare ad Amburgo nel minor tempo possibile, oppure nel modo più economico. Ma potreste anche essere interessati alla possibilità di fare una sosta, lungo il tragitto, in qualche bella città intermedia.» «La mamma sicuramente insisterebbe per passare da Rothenburg. Dovrebbe essere una città medievale; la nostra vicina viene da là e gliene parla sempre.» «Bene, allora potreste fare un salto a Rothenburg, sempre che questo non comporti un allungamento eccessivo del vostro viaggio. La scelta dei possibili percorsi ne risulterà naturalmente ridotta. Sta a guardare: apro una finestra del browser
10 Alla ricerca della via più breve
per navigare in Internet. Anche on-line, infatti, puoi trovare programmi per la Pianificazione di itinerari.» «Sei capace di lanciare da solo altri programmi e perfino di collegarti ad Internet?» «Per me è un gioco da ragazzi. Posso procedere?» «Ma certo!» «Bene. Un programma simile si trova, ad esempio, all’indirizzo www.viamichelin.com ; qui puoi vedere la pagina iniziale:»
«Una sorta di navigatore? Intendi dire che ci dirà che strada fare? Mi chiedo se esista qualcosa del genere anche per l’Italia.» «In Internet ormai si trovano programmi per tutte le principali nazioni, ma per te è sufficiente selezionare la lingua giusta in questa stessa pagina web.» «I campi da riempire sono gli spazi bianchi al centro della pagina?» «Esattamente. Adesso non resta che digitare “Monaco” come città di partenza e “Amburgo” come città di arrivo. Dobbiamo ancora decidere se fargli cercare l’itinerario più breve, in termini di strada percorsa, o quello più rapido, in termini di tempo impiegato.» «Possiamo anche provarli entrambi.»
11
«Caspita, come ha fatto presto! E i due itinerari sono molto diversi!»
Pianificare un itinerario?
«D’accordo, allora lasciamo che i risultati vengano visualizzati in due diverse finestre del browser: in alto il tragitto più corto e in basso quello più rapido. Ci sarebbero ancora un paio di ulteriori opzioni da specificare, ma per ora le ignoriamo.»
12 Alla ricerca della via più breve
«Sicuro. Il programma calcola i percorsi proposti a partire dalle lunghezze note delle singole strade e da stime statistiche dei loro tempi di percorrenza. L’itinerario più lungo ha un tempo di percorrenza minore perché utilizza maggiormente l’autostrada ed è meno soggetto a code.» «E cosa viene preso in considerazione, esattamente, in questi diversi calcoli?» «Non ne ho la più pallida idea! Purtroppo, nella maggior parte dei casi, questi programmi non svelano come facciano ad elaborare gli itinerari proposti. Soprattutto nel caso dell’itinerario con il minor tempo di percorrenza non è chiaro quali dati vengano utilizzati. Qui servirebbero veramente informazioni sempre attuali circa i possibili fattori di intralcio del traffico. Ma queste informazioni non sono di solito a disposizione e dunque, in questo caso, si può solo sperare in una stima molto approssimativa. Così ci siamo già imbattuti in un problema pratico: come si stabiliscono i valori dei parametri che l’ottimizzazione richiede?» «Il concetto di “parametro” non mi è nuovo: l’ho già sentito nominare in matematica. Che cosa voleva dire?» «Hai fatto molto bene a chiederlo. Siccome abbiamo già un browser aperto, diamo un’occhiata in Internet se troviamo un dizionario on-line da consultare in proposito.» «I miei compagni di classe cercano sempre con Google. Credo che l’indirizzo sia www.google.com .» «Giusto. Cerchiamo allora con Google un dizionario on-line. Eccone qui uno: non resta che introdurre il lemma “parametro”. . . » paràmetro, s.m. 1) Matematica: variabile ausiliaria che compare in funzioni o equazioni a fianco delle variabili effettive; . . . 2) . . .
«E per quale motivo si usano i parametri?»
13
«A scuola ci hanno insegnato che se l’equazione √è in forma canonica – come la tua – la soluzione è: x = −b±
b2 −4ac .» 2a
«Se b2 − 4ac ≥ 0. Nei casi concreti, come ho detto, non si fa altro che sostituire ai parametri a, b, e c i rispettivi valori. Per essere una a cui non piace la matematica, non te la sei cavata male! Ma lasciamo stare la matematica della scuola e torniamo al nostro problema della ricerca di un itinerario. Se vogliamo la strada più corta, la determinazione dei parametri necessari è un po’ più semplice: si pone solo la questione se limitarsi alle autostrade o prendere in considerazione anche strade statali e provinciali.» «Beh, in autostrada si fa notevolmente prima. Qui in Germania non ci sono nemmeno i limiti di velocità.» «In generale no, ma in molti tratti non è consentito superare i 100 o i 120 Km orari.» «Tuttavia, con un maggior numero di strade a disposizione, si troverebbe sicuramente un collegamento più breve.» «Giusto. Lo dimostra l’esempio di prima: permettendo ogni tipo di strada, abbiamo ottenuto un percorso più breve.» «Ma nessuno farebbe questa strada, perché viaggiare per la campagna richiederebbe troppo tempo.» «Probabilmente hai ragione. La maggior parte delle persone sceglierebbe una via di mezzo, prendendo in considerazione sia la lunghezza del percorso che il tempo di percorrenza. Ma anche di questo potrebbe tener conto un programma come il nostro. Come puoi vedere, i parametri a disposizione consentono molta libertà.»
Pianificare un itinerario?
«I parametri consentono di formulare e risolvere, in un colpo solo, intere classi di problemi. Dovendo poi affrontare un caso concreto, si sostituiscono ai parametri i rispettivi valori e si ottiene la risposta. Comodo, no? La formula risolutiva delle equazioni di secondo grado ne è un esempio. Invece di risolvere da principio ogni singola equazione quadratica, si utilizzano i parametri a, b e c per scrivere la generica equazione ax 2 + bx + c = 0. La soluzione di questa equazione è espressa dalla famosa formula risolutiva, nei parametri a, b e c.»
14 Alla ricerca della via più breve
«Ma con troppa libertà va a finire che non so più se la strada proposta dal programma è davvero come la volevo io.» «È vero: per lo meno se il navigatore non rivela con precisione quali criteri segue.» «E come si fa, alla fine, a trovare la strada più breve? Deve essere molto difficile. Da dove si prendono tutti i dati? E come si calcola, ogni volta, il percorso più corto?» «Piano! I due problemi sono di natura completamente diversa. La tua domanda circa la provenienza dei dati è certamente importante, ma diamo per scontato di avere già tutti i dati necessari, avendoli presi, ad esempio, dalle tabelle delle distanze di un atlante stradale. La Pianificazione di itinerario – in tedesco chiamata Routenplanung – si occupa principalmente della tua seconda domanda: come si trova una soluzione ottimale, quando i dati sono noti.» «Ma che c’entra la matematica con tutto ciò? Quello che serve non è semplicemente un bravo programmatore? Nell’azienda dove lavora papà saprebbero senz’altro scrivere un bel software per risolvere questo problema.» «Non è facile come può sembrare. Con una tale quantità di itinerari possibili da vagliare, occorre una buona idea per riuscire a risolvere il problema in un tempo ragionevole. Se solo si tentasse di passare in rassegna, uno dopo l’altro, ogni singolo percorso, il tempo richiesto sarebbe troppo lungo. Inoltre è proprio la matematica che sviluppa le tecniche che consentono di affrontare problemi analoghi, senza dover, ogni volta, ricominciare da capo.» «Problemi analoghi?» «Ma certo! Esistono a proposito tantissimi esempi. Per alcuni di essi si riconosce immediatamente che si tratta di problemi di Routenplanung, ma di fronte ad altri, t’assicuro che stenteresti a credere che ci possa essere il benché minimo collegamento col problema della ricerca di un percorso ottimale.» «Dai, non farla tanto lunga!» «Dunque, il problema di trovare la via più breve per andare da un punto p, come partenza, ad un punto t, come traguardo, è
15
«Hai detto algoritmo? Si tratta di un programma per computer, no?» «Non proprio. Con il termine algoritmo si intende piuttosto il complesso delle idee che effettivamente stanno dietro il programma. Un algoritmo è indipendente dal linguaggio di programmazione nel quale verrà successivamente scritto il programma. In più, nel trovare un algoritmo ci si preoccupa solo del compito assegnato, tralasciando gli altri dettagli del programma, come l’acquisizione dei dati o la scrittura dei risultati. Guarda cosa dice il nostro dizionario on-line a proposito del lemma “algoritmo”:» algorìtmo, s.m. procedimento di calcolo che, a partire da dati in ingresso, fornisce un risultato in uscita, dopo un numero finito di passaggi.
«Insomma: una specie di ricetta.» «Se vuoi.» «Quello che hai detto delle Ferrovie mi è chiaro adesso: all’algoritmo non importa se io viaggio in auto o in treno.» «Alto là. Non puoi cavartela così alla svelta: ci sono delle belle differenze! Con la ferrovia mica sali in treno, ti siedi, si parte e si va dove vuoi tu. Le linee ferroviarie sono rigidamente fissate.» «Ma certo, eventualmente si cambia treno.» «Già. E aspettare le coincidenze richiede tempo. Tempo che non dipende dalla distanza tra le città. Ma anche qui, nonostante queste difficoltà, è ancora possibile formulare la questione in termini di un problema di cammino minimo.» «Okay, ma fin qui i due esempi che tu hai fatto non sono poi tanto diversi tra loro.»
Pianificare un itinerario?
chiamato dai matematici un problema di cammino minimo. A proposito, anche le Ferrovie dello Stato hanno bisogno di un algoritmo per la soluzione del problema del cammino minimo quando forniscono informazioni sui migliori collegamenti disponibili.»
16 Alla ricerca della via più breve
«Hai ragione. Entrambi sono di tipo “immediatamente riconoscibile”. Ma che ne dici di quest’altro esempio: dal satellite è stata scattata una fotografia di una determinata regione della superficie terrestre; a partire dall’immagine, un programma dovrebbe adesso scoprire, nel modo più automatico possibile, una strada per andare da un punto di partenza p ad un traguardo t. Nella mia banca dati c’è una simile fotografia della città di Charleston negli Stati Uniti:»
Dati resi disponibili da U.S. Geological Survey, EROS Data Center, Sioux Falls, SD
«È chiaro che il programma deve sempre trovare le strade tra due punti, ma che c’entra la Pianificazione degli itinerari? Qui, stando a quello che hai detto tu, non si tratta più di fornire il collegamento più breve.»
17
«Non credo di aver capito.» «La cosa migliore è che, per adesso, io ti racconti qualcosa in generale sui diversi esempi. Se poi ti interesserà, ti spiegherò un paio di semplici concetti che sono fondamentali in Pianificazione di itinerario e potremo ritornare anche sull’esempio della fotografia dal satellite.» «D’accordo. Tu rendi tutto così attraente che va a finire che, anche a casa, mi lascio rifilare dal mio computer una porzione extra di matematica. E va beh, che c’è ancora?» «Un ulteriore settore dove la messa a punto di itinerari trova applicazione è, naturalmente, la progettazione urbana. Qui si pone il problema di dove costruire nuove strade, autostrade o ferrovie per migliorare il traffico cittadino.» «Capisco. . . C’è dell’altro?» «Finché vuoi! Un altro settore si occupa della determinazione dei percorsi ottimali per la raccolta dei rifiuti, la distribuzione della posta, la pulizia delle strade o lo sgombero delle stesse dalla neve.» «Sembra importante. Lo scorso inverno, sulle autostrade della Baviera, ci furono grossi problemi per l’intervento non immediato dei mezzi spartineve. Molti rimasero bloccati per ore sull’autostrada.» «La colpa non fu dei mezzi spartineve, ma di tutti quegli automobilisti che, nonostante gli avvertimenti, viaggiavano senza pneumatici invernali.» «A quel punto, nemmeno la migliore Pianificazione degli itinerari serve più a qualcosa.»
Pianificare un itinerario?
«In matematica non devi pensare sempre in modo così diretto. A volte devi prima “tradurre” un po’ la nuova questione. Il problema del satellite può essere formulato in termini di un problema di cammino minimo se si pensa ai singoli pixel dell’immagine come alle città dei nostri esempi precedenti e se si convertono le differenze di colore tra i pixel in distanze tra di esse.»
18 Alla ricerca della via più breve
«È vero, ma perfino per la coordinazione delle operazioni di soccorso è stata chiamata in causa la Pianificazione di itinerario: pensa alle telecomunicazioni, ai telefoni cellulari o a Internet, per esempio.» «Perché? Che cosa c’entrano queste cose con la messa a punto di un itinerario?» «Non ti sei mai chiesta come vengono trasmessi i dati in Internet, oppure come si struttura la rete dei cellulari o, ancora, come si garantisce che i messaggi di posta elettronica o gli sms tra cellulari siano fatti pervenire, nel modo più efficiente possibile, dall’emittente al destinatario?» «Veramente. . . no. Ma questa non è una questione puramente tecnica? Che c’entra allora la tua Routenplanung?» «Prova a riflettere sul modo in cui un messaggio di posta elettronica che tu spedisci dal tuo computer di Monaco finisce a Milano. Ciò accade, per prima cosa, inviando i dati che codificano il messaggio al tuo provider; quest’ultimo quindi li inoltra attraverso una serie di stazioni intermedie finché la tua e-mail non arriva a destinazione a Milano. Guarda qui: per quanto riguarda la Germania questa potrebbe essere una rappresentazione schematica dei principali nodi della rete.» «Davvero graziosi i tuoi piccoli computer.» «Essi simboleggiano tuttavia grandi apparati di calcolo.» «Capisco. Considerando la rete nel suo complesso si origina sempre un problema di Pianificazione di itinerario. Solo che adesso non ci sono più strade tra città, ma connessioni tra computer.» «Stessa cosa tra telefoni.» «Ci sono ancora altri esempi?»
19
«Che c’entra con gli itinerari?» «Se vogliamo costruire una casa, dobbiamo svolgere tutta una serie di lavori intermedi.» «È chiaro: scavare le fondamenta e la cantina, poi i soffitti e molte altre cose, fino alla tappezzeria.» «Esatto, ed è chiaro che non si possono compiere questi lavori in un qualsiasi ordine cronologico. Le fondamenta e la cantina devono essere completate prima del tetto e così via. Aspetta, qui c’è un semplice esempio con la durata di ogni lavoro – espressa in unità di tempo fittizie – e la dipendenza di ciascun lavoro dagli altri:» No
Lavoro da svolgere
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
Scavo Fondamenta Opere murarie negli scantinati Soffitto cantina Opere murarie al piano terra Soffitto primo piano Struttura del tetto Impianto idrico (grezzo) Impianto elettrico (grezzo) Riscaldamento (grezzo) Impianti esterni Copertura del tetto Infissi Intonacatura interna Caldana Essiccazione caldana Intonacatura esterna Giardinieri Piastrellisti Pittori Installazioni idriche (rifiniture) Elettricista (rifiniture) Riscaldamento (rifiniture) Finitura pavimenti Porte interne Trasloco
Durata
Lavori precedenti
5 5 10 5 10 5 10 5 5 5 10 20 5 10 5 10 10 10 5 10 2 2 5 5 2 5
— 1 1,2 1,2,3 1,. . . ,4 1,. . . ,5 1,. . . ,6 1,. . . ,6 1,. . . ,6 1,. . . ,6 1,. . . ,7 1,. . . ,7 1,. . . ,7,12 1,. . . ,10,12,13 1,. . . ,10,12,. . . ,14 1,. . . ,10,12,. . . ,15 1,. . . ,16 1,. . . ,17 1,. . . ,10,12,. . . ,16 1,. . . ,10,12,. . . ,16,19 1,. . . ,10,12,. . . ,16,19 1,. . . ,10,12,. . . ,16,19,20 1,. . . ,10,12,. . . ,16,19,20 1,. . . ,10,12,. . . ,16,19,. . . ,23 1,. . . ,10,12,. . . ,16,19,. . . ,24 1,. . . ,25
«In effetti, quando siamo arrivati qui, i lavori in casa non erano ancora finiti e prima di poter estrarre la roba dai pacchi ho do-
Pianificare un itinerario?
«Te l’ho detto: ci sono problemi per i quali, a prima vista, non diresti affatto che si tratti sempre di Pianificazione di itinerario. Mettiamo ad esempio di voler costruire una casa.»
20 Alla ricerca della via più breve
vuto aspettare che la mia camera fosse imbiancata e i mobili sistemati. Le prime settimane sono state davvero caotiche.» «Problemi di questo tipo rientrano nell’ambito della Pianificazione di processo. E tutti i problemi di Pianificazione di processo possono essere riformulati in termini di problemi di Routenplanung. Anche nell’organizzazione di un concerto rock nascono questioni analoghe.» «Come? Vuoi dire che Ligabue, prima di ogni concerto, si studia in camerino la Pianificazione di itinerario?» «Lui personalmente no, ma i suoi manager sì. Tutta la preparazione del concerto, dalla scelta e l’affitto di una struttura idonea, la pubblicità, la prevendita dei biglietti, la costruzione del palco, l’installazione degli impianti audio e luci, fino alla stesura dell’ordine dei brani, tutto ciò costituisce sempre lo stesso tipo di problema.» «Non è proprio facile da riconoscere. Poi me lo spieghi meglio.» «Due ulteriori esempi sono: la foratura delle schede dei circuiti stampati – quelle usate in televisori, radio e computer, ma anche nelle lavatrici – e la datazione dei reperti archeologici. Il problema di stabilire in quale ordine debbano essere praticati i fori in una piastra conduttrice oppure quello di collocare in ordine cronologico i reperti degli scavi possono essere riformulati entrambi come problemi di Routenplanung.» «Okay Vim, penso che per ora possa bastare. Gli esempi che hai fatto sono così diversi tra loro che nessuno penserebbe che questi problemi siano tutti riconducibili alla Pianificazione di itinerario. Domani devi assolutamente dirmi qualcosa di più! Adesso però voglio scrivere ancora una e-mail ai miei amici: devono sapere che da oggi anch’io sono on-line. A domani.» Rut ne aveva abbastanza. Non perché trovasse noioso quello che Vim le raccontava, al contrario! Ma era impegnativo: così tante cose nuove e tutte in una volta. La matematica di scuola un
21
Rut si prese qualcosa da bere dalla cucina e tornò al computer per scrivere ai suoi compagni di scuola. La stuzzicava proprio il pensiero di far sapere a tutti che adesso aveva un computer tutto per sé. Infine scrisse anche a Sara a Milano e questa, naturalmente, fu la lettera più lunga di tutte.
Cara Sara, non immaginerai mai la novità: ho un computer tutto x me!!! :-))) Ti sto scrivendo questa e-mail dalla mia camera! L'idea di poterti raggiungere così facilmente mi fa sentire meno lontana, ma mi manchi sempre tantissimo. Dall'ultima volta sono già successe tante cose. Sono diventata un'assidua frequentatrice della metropolitana. La gente che vi si incontra è educata e se sale un vecchietto, lo fanno subito sedere. Là sotto tutti leggono un libro e anch'io ho cominciato a farlo. È bello xché non c'è niente da vedere dal finestrino e ti concentri benissimo sul libro. Un giorno, nella stazione principale, ho scoperto i topolini grigi che vivono tra i sassi dei binari. Anche i sassi sono grigi e io credevo che fossero tutti sassi: che salto ho fatto quando hanno cominciato a muoversi!!!! Ma la cosa + bella è il parco: non ho ancora scoperto dove finisce! Se c'è il sole, tutti si spogliano e si mettono a prenderlo, mezzi nudi. Se c'è il vento, fanno volare degli aquiloni così grandi che devi tenerli con due mani! In bicicletta, con le piste ciclabili, si può andare dovunque x la città, senza rischiare che ti mettano sotto, come in Italia :-( Non ci crederai: le macchine si fermano davanti alle strisce pedonali! Le prime volte non ci credevo neanch'io e restavamo fermi a guardarci negli occhi, io e l'autista! E si fermano anche prima di svoltare a destra, se devono lasciare passare una bicicletta! Però non ti sognare di attraversare la strada fuori dalle strisce, xché lì non ci pensano nemmeno a rallentare. Insomma, vedi che non mi annoio. Ma come sarebbe bello se tu potessi venire qui a trovarmi! Sarebbe davvero fantastico. Un abbraccio e scrivimi presto, tua Rut
Pianificare un itinerario?
vantaggio in questo l’aveva: non era mai così faticosa; spesso, tuttavia, nemmeno altrettanto avvincente.
Piacere, grafo
Rut, la sera, aveva finito per non parlare affatto di Vim a suo padre. Se lui negava di conoscerlo o mostrava comunque di non volerne sapere, doveva proprio essere lei a spifferargli tutto? Nella migliore delle ipotesi, i suoi genitori avrebbero finito per ripeterle le solite, noiose raccomandazioni riguardo al tempo che le era concesso stare davanti al computer. Meglio non toccare l’argomento. Sua madre, per di più, era stata a lungo contraria al fatto che lei avesse un computer personale. E se davvero Vim non fosse stato originalmente destinato a lei, Rut? Allora suo padre avrebbe sicuramente cominciato a raccontare qualcosa sul segreto di fabbrica o sul copyright e lo avrebbe cancellato per sempre dal suo computer. Anche a scuola Rut aveva certamente detto ai suoi compagni del computer nuovo, ma di Vim non aveva fatto parola con nessuno. Nemmeno a Martina, la sua migliore amica a Monaco, ne aveva parlato. Quando le lezioni finalmente furono terminate, Rut corse a casa. Voleva assolutamente conoscere il seguito del racconto. «Ciao Rut. Già qua? Come è andata a scuola?» «Benone. Le solite cose. Niente di interessante. Ti posso fare una domanda? Una domanda, per così dire, personale?» «Ma certo!» «Di’ un po’: chi ti ha dato il nome che porti? Genitori non penso tu ne abbia, o mi sbaglio?»
24 Alla ricerca della via più breve
«Beh, i miei programmatori sono per me un po’ come genitori. Credo che Vim sia l’abbreviazione di “Virtual Man”.» «Mi piace di più Vim.» «Anche a me.» «Allora continuiamo con Vim! Mi racconti ancora qualcosa sulla Pianificazione degli itinerari? Dai, parlami un altro po’ di Routenplanung, come la chiami tu.» «Volentieri. Per prima cosa, vorrei mostrarti come si modellano i problemi di Routenplanung. Sai cos’è un modello?» «Certo. Un modello può essere, ad esempio, una copia, una riproduzione di qualcosa.» «Precisamente. In matematica questo concetto è particolarmente importante. Un cattivo modello non rappresenta abbastanza bene la realtà; può allora facilmente accadere che le affermazioni che si fanno sulla base del modello non siano di alcuna utilità nella pratica.» «Intendi dire quando, ad esempio, il navigatore non tiene conto del fatto che certe strade sono sensi unici?» «Esatto, perché in questo caso il tragitto minimo calcolato potrebbe non essere affatto percorribile in auto. Un modello non dovrebbe però neppure essere troppo complesso: esso dovrebbe rappresentare solo l’essenziale. Altrimenti non sarebbe più possibile ricavarne dei risultati, o ci vorrebbe troppo tempo prima di ottenere delle soluzioni.» «È chiaro: se voglio andare da Monaco ad Amburgo, non mi servirà certo considerare il centro storico di Berlino.» «Esattamente così. Allora, come si modella un problema di Routenplanung? Al sito http://www.mvv-muenchen.de c’è un bell’esempio:»
25 Piacere, grafo «La mappa della metropolitana di Monaco? Non vorrai raccontarmi che è un modello matematico!»
26 Alla ricerca della via più breve
«Eccome, invece! Qui c’è uno schizzo della rete sotterranea e dei treni veloci di superficie di Monaco, ma il disegno non si orienta alle vere proporzioni della città. La vera tratta della linea U3 tra Marienplaz ed il Centro Olimpico non corre dapprima esattamente in direzione Nord, per poi fare di colpo una curva a gomito a sinistra e procedere dritta come un fuso in direzione ovest.» «Certo, non corre esattamente così.» «La rappresentazione con linee rette verticali, orizzontali e tutt’al più diagonali ha però il pregio di essere più chiara.» «Dunque non si riproduce il vero percorso, ma lo si rappresenta in modo che esso sia più comprensibile a colpo d’occhio.» «Esatto: una astrazione della realtà. La forma astratta scelta qui riveste un importante significato in tutti i problemi di Pianificazione di itinerario. In matematica, una cosa del genere si chiama grafo; eccoti una definizione:» Grafo G = (V, E) G e’ composto da V, un insieme finito di vertici e da E, un insieme di coppie di elementi di V, i lati.
«Suona un po’ complicato. Che cosa vuole dire?» «Dunque, un grafo – chiamiamolo G – possiede un insieme V di vertici, anche detti nodi. Nei problemi più comuni di Routenplanung, laddove si deve trovare un percorso tra due città diverse, i vertici rappresentano appunto le città.» «Quindi anche le fermate nella mappa della metropolitana di Monaco.» «Certo; oppure le uscite e gli snodi autostradali nel nostro viaggio Monaco-Amburgo. Ma i vertici potrebbero rappresentare anche i fori del trapano in una piastra conduttrice, i pixel colorati dell’immagine dal satellite oppure reperti archeologici.»
27
«Ciò non sarebbe insolito nei problemi di questo tipo. Se nel viaggio Monaco-Amburgo, oltre alle autostrade, considerassimo anche le strade provinciali e comunali, allora otterremmo ugualmente tantissimi incroci e svincoli.» «Dunque anche qui una montagna di vertici.» «E oltre ai vertici c’è l’insieme E dei lati, a volte detti anche spigoli. I lati possono essere visualizzati meglio come collegamenti tra due vertici. Ma attenzione: questi collegamenti possono essere molto astratti! I lati possono rappresentare strade tra due città oppure tratti di linea della metropolitana tra due fermate nella cartina. Potrebbero però anche esprimere la vicinanza tra pixel confinanti nell’immagine presa dal satellite. In questo caso si otterrebbe un grafo a griglia come il seguente:» Dati resi disponibili da U.S. Geological Survey, EROS Data Center, Sioux Falls, SD
«Se ho capito bene, si collegano i vertici tra loro quando i pixel corrispondenti sono affiancati, come due quadrati che hanno un lato in comune. È così?»
Piacere, grafo
«Ma se ad ogni pixel dell’immagine presa dal satellite corrisponde un vertice, otteniamo in questo modo una quantità pazzesca di vertici.»
28 Alla ricerca della via più breve
«Giusto. I matematici studiano in pratica solo questi grafi astratti, dato che per gli algoritmi non è poi così importante sapere quale applicazione concreta eventualmente si farà di essi.» «E in questo modo si può usare lo stesso algoritmo per problemi completamente diversi? Caspita, questo sì che è un bel colpo!» «Ma diamo adesso un’occhiata a un piccolo grafo esemplificativo. Che ne dici di questo:»
«Okay. I cerchietti, a quanto pare, rappresentano i vertici e le linee i lati. Era già così anche nel grafo a griglia.» «Esatto. Ma ti prego di non dimenticare mai che vertici e lati sono solo simboli astratti per cose qualsiasi e per i nessi che intercorrono tra loro, a due a due. I vertici non devono essere per forza località e i lati non rappresentano necessariamente le vie percorribili tra di esse.» «Questo l’ho capito. Mi basta ripensare all’esempio del satellite.» «Quello è un buon esempio per ricordarsi che i lati non devono essere per forza strade; ma in quell’esempio potevamo ancora interpretare i vertici come località. Nell’esempio della datazione dei reperti archeologici, invece, i vertici simboleggiano i reperti, indipendentemente da qualsivoglia luogo.» «Va bene, cercherò di ricordarmene. Ma adesso raccontami piuttosto come va avanti questa storia.»
29
«Beh, il concetto si spiega quasi da sé. Ma ciò non vale sempre?» «No. Guarda, ecco un grafo non connesso:»
«Sì, ma capita mai una cosa così? Nella rete stradale c’è sempre un collegamento tra due località. Anche negli altri esempi che hai fatto non ricordo un solo grafo che non fosse connesso.» «I grafi nei nostri esempi sono solitamente connessi, altrimenti non avrei fatto questa ipotesi. D’altro canto ci sono anche casi in cui i grafi non sono connessi: trovare il collegamento stradale più breve tra città dislocate su un gruppo di isole, ad esempio.» «Qui, senza traghetto, non si riesce.» «Si risolvono allora due diversi problemi separatamente: dal luogo di partenza al porto dove ci si imbarca e, sull’altra isola, dal porto alla destinazione.» «E va bene, ma in qualche modo il tuo esempio non mi convince. Non si potrebbero semplicemente aggiungere le rotte del traghetto come nuovi lati nel grafo? Così il grafo sarebbe di nuovo connesso.»
Piacere, grafo
«Il prossimo passo sarà richiedere che, per ragioni di semplicità, i nostri grafi siano sempre connessi. Ciò significa che, a partire da qualsiasi vertice, è possibile raggiungere ciascuno degli altri usando i lati a disposizione.»
30 Alla ricerca della via più breve
«Certo, questo è proprio uno dei motivi per cui partiamo dal presupposto che i grafi siano sempre connessi. Ci sono tuttavia problemi interessanti nei quali proprio la connessione gioca il ruolo decisivo.» «E di che problemi si tratta?» «Un esempio è il problema dell’affidabilità delle reti. Possiamo riferirci qui a tutti i tipi di reti incontrate finora: reti informatiche, reti della telefonia mobile e perfino la rete stradale.» «Affidabilità delle reti? E che significa?» «In tutte queste reti si tratta sempre di collegare qualcosa a qualcos’altro. Nello stabilire l’affidabilità di una rete, si pone la questione se il collegamento tra due vertici è garantito anche quando qualche connessione viene soppressa. Nell’agosto del 2003 venne a mancare l’energia elettrica in quasi tutto il nord est degli Stati Uniti, in alcune zone per più di 15 ore. E questo per la caduta di una sola linea in una delle grosse centrali sul Niagara. Il sovraccarico cui furono sottoposte le linee rimanenti provocò il collasso della centrale, scatenando una reazione a catena nella rete elettrica dell’intera regione.» «Accidenti, che farebbe la mia amica Inga senza il suo asciugacapelli. . . » «Un conto sono i problemi estetici, un altro è la completa paralisi di treni e aerei o il deterioramento delle derrate alimentari per il non funzionamento degli impianti di refrigerazione: quasi l’intera vita pubblica viene messa in ginocchio. E questa volta non era nemmeno andata così male.» «Questa volta? Perché? Succede spesso in America una cosa del genere?» «Periodicamente si ripete, con esiti più o meno gravi. Catastrofiche furono ad esempio le conseguenze di un analogo blackout nel 1965. Sul New York Times apparve il seguente articolo:»
31 Piacere, grafo
«Oh oh.» «L’inglese non è un problema per te, vero?» «No, l’ho cominciato già alle elementari. Caspita, se mi immagino di dover rimanere chiusa per ore in una metropolitana, magari sovraffollata!. . . Scoppierebbe sicuramente il panico.» «Le proporzioni della catastrofe furono tali che anche il presidente degli Stati Uniti Lyndon B. Johnson si attivò personalmente. Alla pagina web www.cmpco.com/about/system/ blackout.html è possibile trovare il testo originale della sua lettera al capo della Commissione Federale per l’Energia.» Today’s failure is a dramatic reminder of the importance of the uninterrupted flow of power to the health, safety, and well being of our citizens and the defense of our country. This failure should be immediately and carefully investigated in order to prevent a recurrence. . .
32 «Il tono sembra davvero drammatico!» Alla ricerca della via più breve
«Particolarmente gravi furono le irruzioni nei negozi e i saccheggi notturni a New York. A proposito, una conseguenza a lungo termine – diciamo: un “effetto collaterale demografico” – venne alla luce solo nel luglio 1966, nove mesi dopo il black-out. . . » «Beh, si sa: se non c’è il televisore da guardare. . . Ma che c’entra tutto ciò con il fatto che un grafo è o non è connesso?» «È semplice. Consideriamo ad esempio la rete elettrica. Possiamo di nuovo darle la forma di un grafo. I vertici rappresentano le stazioni di smistamento e i lati le linee elettriche tra le stazioni. Una tale rete è allora affidabile solamente se il grafo corrispondente rimane connesso anche dopo la rimozione di uno qualsiasi dei suoi lati. Il nostro grafo di prima è affidabile da questo punto di vista. Ecco, te lo disegno ancora. A fianco, invece, puoi vedere un grafo che non dà più la stessa garanzia. Se infatti togliamo il lato rosso, il grafo non è più connesso.»
«Tu hai davvero una risposta per tutto! Adesso ho capito che anche la connessione dei grafi deve essere indagata a fondo.» «Per quanto riguarda i nostri problemi, comunque, possiamo in seguito supporre che i grafi siano sempre connessi.» «D’accordo, se lo dici tu.» «Finora abbiamo fatto la conoscenza di una sola delle possibili definizione di grafo. A seconda del problema che si vuole modellare, i grafi possono avere strutture molto diverse. A volte
33
«Allora l’aggettivo “multiplo” significa solamente che è possibile collegare una coppia di vertici con più di un lato?» «Precisamente. La mappa della metropolitana è un grafo multiplo. È infatti possibile rappresentare il passaggio da un vertice a un altro in modi diversi.» «Intendi dire per distinguere, ad esempio, se vogliamo andare da Marienplatz a Münchner Freiheit con la linea U3 oppure con la linea U6?»
«Sì, per questo si può ricorrere ai multigrafi.»
Piacere, grafo
può avere senso considerare grafi multipli, detti anche multigrafi. Il loro aspetto è all’incirca questo:»
34 Alla ricerca della via più breve
«A proposito, perché questo posto a Monaco, la Münchner Freiheit, si chiama proprio così?» «Saprai già che “Freiheit” in tedesco significa libertà. Il nome vuole proprio ricordare la resistenza a Monaco contro la dittatura nazista.» «Oh sì, ho visto una volta un film sul terzo Reich e la seconda guerra mondiale: spaventoso! Vivendo oggi a Monaco non si immagina che qualcosa del genere sia potuto accadere. Spero che in storia si arrivi presto a questo periodo. Ma adesso raccontami ancora qualcosa sui grafi!» «Spesso ha senso attribuire una direzione ai lati. In questo modo non si parla più di lati, ma di archi e si simboleggia la direzione dell’arco con la punta di una freccia. Ciò comporta inoltre la possibilità di avere due archi tra la stessa coppia di vertici, senza che per questo il grafo sia un grafo multiplo; ciò accade, di fatto, se i due archi hanno direzioni opposte:»
«Gli archi sono allora un po’ come i sensi unici per strada?» «Sì, per quanto riguarda la rete stradale li puoi vedere così, ma in altre applicazioni possono avere un significato completamente diverso. Ricordi ancora l’esempio della costruzione di una casa?» «Naturalmente.» «Per interpretare le questioni di Pianificazione di processo come problemi di Routenplanung, dobbiamo tradurle innanzitutto nel linguaggio dei grafi. Nel farlo, le fasi del processo sono simboleggiate dai vertici – nella costruzione della casa si
35
4
5
7
11
3
6
8
12
2
9
13
16
1
10
14
15
17
18
26
20
22
19
23
24
25
21
«Vediamo un po’. C’è un arco che va dal vertice 1 al vertice 2: significa che lo scavo deve essere fatto prima che si possano cominciare le fondamenta?» «Sì. Un lato, al posto dell’arco, non potrebbe dirci quale dei due lavori viene prima.» «Ma allora mancano un mucchio di archi. Non ci dovrebbe essere un arco che congiunge ogni vertice con il numero 26? Si trasloca solo dopo che tutti i lavori sono finiti.» «Ottima osservazione! Sì, il disegno in verità non è completo. Tuttavia, esso contiene l’essenziale. L’arco dal vertice 1 al 2 significa che la fase 1 deve precedere la fase 2; e l’arco da 2 a 3 vuol dire che la fase 2 deve essere ultimata prima di poter cominciare la fase 3. Ma allora è chiaro anche che la fase 1 deve avere la precedenza sulla fase 3, nonostante non sia stato disegnato alcun arco.» «Furbo. Si possono così tralasciare tutti gli archi tra i vertici che hanno già un “ponte” fatto di archi che li collega.» «Esattamente. Gli archi del ponte devono naturalmente essere tutti orientati nello stesso senso. E il grafo ne guadagna in chiarezza. Un altro esempio di grafo orientato – così si chiamano i grafi che hanno archi al posto dei semplici lati – è quello della datazione dei reperti archeologici. In questo caso è la
Piacere, grafo
tratta dei diversi lavori da svolgere – e le relazioni di priorità tra le varie fasi si traducono in archi. Se scriviamo nei vertici i numeri assegnati ai lavori nella tabella che ti mostrai, si ottiene il seguente grafo:»
36 Alla ricerca della via più breve
successione temporale ad essere rappresentata attraverso gli archi.» «E sicuramente ci saranno anche grafi che sono contemporaneamente multipli e orientati, non è vero?» «Naturalmente! A volte può perfino essere vantaggioso introdurre cappi. Si tratta di lati o archi che partono da un vertice e vi ritornano senza passare per altri vertici. Tutte queste possibilità, prese insieme, potrebbero allora fare apparire il nostro grafo, grosso modo, così:»
Qualcuno bussò improvvisamente alla porta. Rut ebbe un sussulto. Era la mamma. Solo che non mi abbia sentito parlare col computer, fu il primo pensiero che le attraversò il cervello. «Ho portato la torta di panna. Ne vuoi una fetta?» «Volentieri. Arrivo subito!» Rut aspettò finché il rumore dei passi di sua madre si fu allontanato. Poi si rivolse brevemente a Vim. «Faccio una pausa. Ho proprio una voglia matta di torta e qui in Germania le torte alla panna sono davvero troppo buone.» «Ma certo, i grafi intanto mica ci scappano via.»
Il peso ha un peso
«Eccomi di nuovo da te! La torta era semplicemente divina. Sarebbe piaciuta anche a te, ma forse tu preferisci masticare Bytes. Dì un po’, mi sembra che mancasse ancora qualcosa. . . » «Caffè, tè o panna?» «Burlone! Dico nei grafi. Già ieri avevamo constatato che per trovare il percorso più breve è essenziale conoscere le lunghezze delle singole strade.» «Giusto. Nei nostri grafi abbiamo ancora bisogno di “distanze”. Si parla in questo caso di peso di un arco o di un lato, a seconda che i grafi siano orientati o no. Questi pesi possono esprimere la lunghezza in chilometri di tratti di strada, oppure il loro tempo di percorrenza in ore, o ancora le differenze di colore tra pixel contigui in una immagine dal satellite. Spesso rappresentano anche i costi o le capacità dei collegamenti. Il nostro grafo di prima apparirebbe allora pressappoco così:» 5 7 15 5
8
3
2
2
4 4
9 7 1 3
«Quindi si scrivono i valori direttamente sugli archi?»
38 Alla ricerca della via più breve
«Sì, è la cosa migliore nei nostri piccoli esempi. A proposito, per semplicità ammettiamo che i nostri pesi siano sempre numeri interi e positivi.» «Il signor Liste direbbe che i pesi sono numeri naturali.» «E avrebbe ragione. Nei problemi di cammino minimo, grafi orientati, senza cappi e lati multipli, come quello nell’esempio, costituiscono il caso più tipico.» «Grafi orientati pesati? Non suona molto bene. . . Non c’è il rischio di confondersi?» «È per questo che chi si occupa di queste cose usa anche l’abbreviazione digrafo per dire “grafo orientato”. È una derivazione dall’inglese: di come “directed”, che non significa altro che “avente una direzione”; i grafi orientati sono infatti chiamati spesso grafi diretti. Mi meraviglio piuttosto che tu non abbia ancora avuto niente da ridire riguardo la restrizione ai numeri naturali.» «Lo so dove vuoi andare a parare. La distanza tra due località potrebbe anche essere di 2,5 km. Ma non mi meni per il naso così facilmente. Non è obbligatorio esprimere le distanze in chilometri e si può sempre scegliere l’unità di misura in modo che i numeri alla fine risultino interi. 2,5 km non sono altro che 2500 metri.» «Sì, per le nostre applicazioni non è un problema supporre che i pesi siano numeri interi. Ma non ti meraviglia il fatto che ammettiamo solo numeri positivi?» «E perché? Le distanze sono positive. Anche negli altri esempi non vedo proprio a cosa possano servire dei numeri negativi.» «Ti ricordi del viaggio da Monaco ad Amburgo con i tuoi genitori? Il navigatore aveva calcolato un tempo di 7 ore esatte. Se voi doveste adesso decidere davvero se fare o no tappa a Rothenburg, i tuoi genitori si preoccuperebbero di non allungare troppo il viaggio.»
39
«Ma vale la pena di fare la deviazione solo se vi rimane tempo sufficiente per scoprire un po’ Rothenburg e magari per vedere una delle sue feste medievali.» «Con meno di 3 o 4 ore a disposizione non ne varrebbe certo la pena; e magari sarebbe anche bello fermarsi a mangiare qualcosa in un ristorante.» «Con un tetto massimo di 12 ore di viaggio ed una permanenza di, diciamo, 4 ore e mezza, la deviazione per Rothenburg dovrebbe allora comportare al massimo 30 minuti di auto in più rispetto alle 7 ore del tragitto diretto Monaco-Amburgo.» «Okay, con un’altra mezz’ora di viaggio si arriva giusto giusto a 12 ore totali. Ma cosa c’entra tutto questo con i pesi negativi? Nel programma di navigazione posso benissimo inserire Rothenburg come città intermedia e stare a vedere se il nuovo itinerario calcolato ha un tempo inferiore a 7 ore e mezza.»
«E secondo te come fa il software a fare tutto questo?» «Probabilmente cercando prima un percorso ottimale da Monaco a Rothenburg e poi cercandone un altro da Rothenburg ad Amburgo.» «Ma che bello: aggiungendo il calcolo del percorso diretto Monaco-Amburgo, fanno già tre problemi diversi di cammino minimo, che dobbiamo risolvere prima di poter decidere se passare o no da Rothenburg! Che ne diresti se riuscissimo invece a cavarci d’impaccio con la soluzione di un unico problema di cammino minimo?» «Fantastico, ma come si può fare?»
Il peso ha un peso
«Sicuro! Alla mamma non piace per niente che i nostri viaggi in auto durino più di 12 ore.»
40 Alla ricerca della via più breve
«Assegnando un peso negativo ad un vertice. Se diamo un valore di −30 minuti al vertice di Rothenburg, possiamo beneficiare, per una volta sola, di un “bonus” di 30 minuti se attraversiamo questa città.» «Si possono dare pesi anche ai vertici?» «Certo, si attribuisce semplicemente il peso al vertice piuttosto che al lato. È comunque possibile evitare questa novità dei pesi nei vertici con un piccolo trucco: basta immaginare che a Rothenburg non ci sia un vertice solo, ma due: uno per l’arrivo ed uno per la partenza, collegati tra loro da un unico arco, avente il peso che prima avevamo associato al vertice:»
Rothenburg –30
Rothenburg Rothenburg Arrivo Partenza –30
«E a che ci serve adesso questo −30?» «Ammettiamo che la deviazione per Rothenburg, in termini di strada, richieda effettivamente meno di 30 minuti di auto supplementari. Allora l’itinerario diretto Monaco-Amburgo avrebbe ancora una durata di 7 ore, mentre il percorso che passa per Rothenburg, a causa di quell’arco con peso −30, che ci fa recuperare più di quanto ci è costata effettivamente la deviazione, avrebbe adesso una durata complessiva inferiore a 7 ore e, dunque, sarebbe la soluzione del problema del cammino minimo.» «Ho capito! Se invece la deviazione comporta più di 30 minuti, quell’arco con peso −30 non cambia nulla: il collegamento diretto rimane il più breve e i cavalieri medievali ci aspetterebbero invano.»
41
«Fantastico: invece di tre problemi separati, ne abbiamo uno solo.» «Archi con pesi negativi possono avere un senso anche nei nostri problemi di Pianificazione di processo. Nell’esempio della casa, immagina di scrivere su ogni arco, come peso, il tempo richiesto da ogni lavoro prima di poter cominciare il lavoro successivo.» «Ma così otteniamo un peso positivo per ogni arco!» «Sì, e se vogliamo sapere quanto durerà, come minimo, la costruzione nel complesso, dobbiamo calcolare in questo grafo la massima distanza tra il vertice di partenza e quello di arrivo, cioè tra lo scavo delle fondamenta ed il trasloco. Deve infatti rimanere tempo a sufficienza per completare tutte le altre attività.» «Insomma, un “cammino massimo”.» «Sì, ma per non dover affrontare un nuovo problema di cammino massimo, moltiplichiamo tutti i pesi degli archi per −1.» «Mettiamo un “meno” davanti a tutti i numeri? Così abbiamo chiaramente dei numeri negativi; ma perché ci serve?» «Perché adesso possiamo metterci a cercare nel nostro grafo un percorso più breve invece di un percorso più lungo. La lunghezza di ogni arco, moltiplicata per −1, dà esattamente il negativo della lunghezza originaria e quello che prima era l’arco più lungo è adesso quello col valore negativo più grande, cioè il più corto.» «Fantastico, così non abbiamo bisogno di un nuovo algoritmo per il problema del cammino massimo. Ma se i pesi negativi si usano e sono così utili, perché hai supposto che gli archi abbiano sempre pesi positivi?» «Questa è effettivamente una limitazione: si rinuncia davvero a qualcosa e con questi due esempi ho proprio voluto dimostrartelo. Tuttavia, sia che i pesi siano positivi, sia che siano negativi, tu il modello sul quale si basano i problemi di Pianificazione di itinerario adesso lo conosci.»
Il peso ha un peso
«Potremmo così decidere l’itinerario con la soluzione di un unico problema di cammino minimo.»
42 Alla ricerca della via più breve
«Ottimo, ora devo però scappare. Ho un appuntamento. Un mio compagno di classe vuole farmi ascoltare un paio di CD nuovi. A domani!» «Capisco. Buon divertimento!» Rut cominciava piano piano ad appassionarsi al discorso. Il pensiero di poter trattare con questi grafi tutti i problemi che Vim le aveva descritto, le piaceva molto; soprattutto perché le idee che stavano dietro a questi oggetti, fatti di vertici, lati e numeri interi, erano così semplici. Un argomento del genere poteva essere affrontato benissimo anche a scuola. Rut sarebbe stata sicuramente in grado di raccontare la faccenda dei grafi ai suoi amici. Di Vim, tuttavia, non voleva ancora parlare con nessuno. Questo sarebbe rimasto il suo piccolo segreto. Ma adesso doveva proprio andare. Entro un quarto d’ora doveva essere da Jan e non voleva assolutamente arrivare in ritardo. Jan era infatti un tipo davvero interessante.
Un’innocua esplosione
La sera, Rut rimase a guardare la televisione con i suoi genitori. Nessuno accennò il benché minimo discorso sul computer nuovo. Rut non voleva toccare questo tema e i suoi genitori sembravano non essere interessati. Normalmente volevano sempre sapere tutto di lei fin nei più piccoli dettagli. Dopo la gita scolastica dell’autunno precedente, suo padre e sua madre l’avevano letteralmente assillata con le loro domande e adesso non le chiedevano nemmeno se col computer riusciva a cavarsela. Del resto non le dispiaceva del tutto, perché questo non lo sapeva neppure lei. Fino ad ora, a parte alcune e-mail, non aveva conosciuto altro che Vim. Tuttavia, la mancanza di interesse da parte dei suoi genitori le appariva strana. Ma forse il motivo era semplicemente Jan. Di lui sì che volevano sapere sempre tutto. E Rut raccontava loro tutto. Beh, quasi tutto: tutto quello che si racconta ai genitori. Dopo la televisione Rut andò in bagno. Era già tardi. Il mattino seguente la sveglia l’avrebbe strappata senza pietà ai suoi sogni. Ma la tentazione di dare ancora un’occhiata a Vim era troppo grossa. Solo dieci minuti, si disse. «To’! Che ci fai qui? Non è ora di andare a letto?» «E a te che cosa importa? Sei come i miei genitori.» «Per carità! Ho solo paura che i tuoi mi tolgano la corrente, se scoprono che tu a quest’ora sei ancora al computer.» «Niente paura, non lo verranno a sapere.» «E adesso vuoi ancora parlare un po’ di matematica prima di andare a letto?»
44 Alla ricerca della via più breve
«Di Routenplanung! Volevi spiegarmi come si risolve un problema di cammino minimo.» «Questo non riusciamo più a farlo oggi; forse però potremmo ancora riflettere su ciò che più condiziona questi procedimenti.» «Ma questo è chiaro! I cammini più brevi vanno calcolati. Su che cosa c’è da riflettere?» «Lo vedrai subito. Premetto che proverò a spiegarti tutto servendomi di piccoli esempi; in essi, il più delle volte, ti sarà possibile testare tutti i possibili cammini e trovare così il più breve. Nei problemi reali, tuttavia, si ha a che fare con centinaia, migliaia, a volte anche parecchie migliaia di vertici. Di conseguenza, il numero dei percorsi possibili può diventare così grande che nemmeno i computer più veloci del mondo possono passarli in rassegna e calcolarli tutti.» «Ma come? Un computer può fare migliaia di calcoli in un secondo.» «Okay, okay; ammettiamo di dover calcolare un cammino minimo in questo grafo:»
PARTENZA
p
TRAGUARDO
t
«Non è certo un grafo enorme.» «E non è nemmeno particolarmente complicato. Una volta aggiunti i pesi a fianco degli archi, non è certamente difficile trovare gli itinerari più brevi. Tuttavia questo semplice grafo ben si presta a chiarire le problematiche inerenti il numero dei percorsi possibili. Immaginiamo, al solito, di voler andare dal vertice p al vertice t. Quanti sono i possibili cammini?»
45
«Niente paura, non è per niente così difficile. Ho scelto per di più un grafo facilmente comprensibile. Devi solo affrontare il problema in modo sistematico. Nel nostro caso ci aiuta il fatto che i vertici siano disposti in strati affiancati. Vediamo, quante possibilità ci sono di uscire da p?»
p
t
1
2
3
4
«Due.» «E quante possibilità hai di andare avanti, a partire dal vertice su cui sei arrivata nello strato numero 1?» «Oh sì, adesso vedo cosa intendi. Ci sono 2 possibilità di uscire da p, verso l’alto o verso il basso e non importa quale si scelga: di nuovo si avranno due modi di andare avanti, procedendo diritti o in diagonale verso lo strato successivo.» «. . . finché non si raggiunge uno dei due vertici che precedono t. Da lì non si può andare avanti che in un modo solo e cioè verso t. Quanti cammini ci sono, allora?» «Ci sono 2 cammini che partono da p ed arrivano al primo strato, poi si hanno ancora due possibilità per ciascuno. Vuol dire che i cammini diversi che raggiungono il secondo strato sono 4...» «. . . e siccome, strato per strato, si hanno sempre due modi diversi di andare avanti, i cammini diventano 8 per raggiungere il terzo strato, 16 per il quarto e poi non c’è altra scelta che finire direttamente in t. In tutto abbiamo dunque 16 cammini.»
Un’innocua esplosione
«Oh, ce ne sono diversi. Se cerco di contarli tutti, prima o poi faccio senz’altro qualche errore.»
46 Alla ricerca della via più breve
«Non mi dirai che un computer ha delle difficoltà con 16 cammini?» «No, certo che no. Ma supponi di allungare il nostro grafo aggiungendo due vertici. Quanti diventano i cammini?»
p
t
1
2
3
4
5
«Il doppio dei precedenti: 32.» «Ottimo. Conosci la notazione 25 per le potenze?» «Certo, 25 = 2 · 2 · 2 · 2 · 2 = 32. Qualche volta si impara pure qualcosa di utile a scuola.» «E se li conti, quanti sono gli strati da p a t?» «Cinque. Vuoi dire che il numero dei cammini è 2 elevato al numero degli strati?» «Sì, ed il numero dei vertici è 2 volte il numero degli strati più 2: p e t.» «Oh sì, nel primo caso ci sono 2 · 4 + 2 = 10 vertici; nel successivo 2 · 5 + 2 = 12 vertici. I cammini sono invece, rispettivamente, 24 = 16 e 25 = 32. Capisco adesso perché hai voluto scriverlo con le potenze: il numero 2 una volta è coinvolto in una moltiplicazione e una volta in una potenza.» «Così puoi vedere che, se gli strati sono n, dove n rappresenta un numero qualsiasi, i cammini sono 2n , ma i vertici sono solo 2 · n + 2.» «Ma a cosa serve tutto questo?» «Se il grafo avesse adesso 50 di questi strati, non lo definiresti ancora un grafo eccezionalmente grande, no?»
47
t
1
2
49
50
«Dopo che mi hai parlato di grafi con migliaia di vertici, certamente no.» «Ma, secondo la nostra formula, il numero dei cammini ammonta a . . . . . 250 = 1 125 899 906 842 624, cioè più di un milione di miliardi!» «Caspita! Che numero enorme! Ma per il mio computer di ultima generazione non ci sono problemi, vero?» «Guardiamo la cosa da un altro punto di vista. Supponiamo che il tuo computer possa esaminare un milione di cammini . . . in un secondo. Allora gli ci vorrebbero 1 125 899 906,842624 secondi per esaminarli tutti. Vediamo: 60 secondi fanno un minuto, 60 minuti un’ora e 24 ore un giorno. Ciò significa che . in un giorno ci sono 60 · 60 · 24 = 86 400 secondi e quindi . . . in un anno ci sono 86 400 · 365 = 31 536 000 secondi. Il tuo computer impiegherebbe dunque . . . 1 125 899 906,842624 . . 31 536 000 cioè quasi 36 anni per passare in rassegna tutti i cammini.» «Ci mette un’eternità!» «E se aggiungiamo ancora un paio di strati al grafo, la faccenda diventa ancora più estrema. Ti ho preparato una piccola tabella, nella quale puoi vedere, in corrispondenza del numero di strati che il grafo ha, quanti sono i vertici e quanti sono, approssimativamente, i cammini possibili. Nell’ultima colonna ho riportato il tempo che il nostro ipotetico computer impiegherebbe per calcolarli tutti.»
Un’innocua esplosione
p
48 Strati Vertici Alla ricerca della via più breve
5 10 20 30 40 50 60 70 80 90 100 260
12 22 42 62 82 102 122 142 162 182 202 522
Cammini da p a t
Tempo di calcolo 32 . 1 024
1,0 milioni 1,1 miliardi 1,1 milioni di milioni 1,1 milioni di miliardi 1,2 miliardi di miliardi 1,2 milioni di milioni di miliardi 1,2 milioni di miliardi di miliardi 1,2 miliardi di miliardi di miliardi 1,3 milioni di milioni di miliardi di miliardi
1,9 Nau
0,000032 sec. 0,001024 sec. 1 sec. 18 min. 13 giorni 36 anni 37 migliaia d’anni 37 milioni d’anni 2,6 Eu 2,6 migliaia di Eu 2,7 milioni di Eu *
«Gulp! Numeri del genere fanno girare la testa. Ma che cosa vogliono dire “Eu”, “Nau” e l’asterisco?» «Sono unità di misura di mia invenzione. Un Eu corrisponde a circa 15 miliardi di anni, che è una stima dell’Età dell’universo. Un Nau rappresenta invece il Numero degli atomi nell’universo. E adesso veniamo all’asterisco. Immagina che su ciascuno degli atomi della terra ci sia uno dei nostri computer. Ebbene, tutti questi calcolatori messi assieme impiegherebbero ancora . circa 65 000 Eu per passare in rassegna tutti i cammini del grafo con 260 strati. Un computer da solo impiegherebbe circa 6 · 1064 anni per farlo. Siccome nessuno è in grado di immaginare un numero del genere, ho messo semplicemente un “∗” al suo posto.» «Eu-reka, si potrebbe dire. Dai 50 strati in su ci vuole un tantino troppo tempo. Ma se avessi a disposizione un computer migliore, magari in grado di testare un milione di miliardi di cammini al secondo, impiegherei solamente circa un secondo per il grafo con 50 strati.» «D’accordo. Ma anche questo super-computer impiegherebbe sempre 38 anni con un grafo di 80 strati e addirittura 40 milioni di anni per uno che ne ha 100. Per non parlare del grafo con 260 strati!» «E del resto tutti questi grafi non sono poi così grossi.»
49
«Pazzesco! Allora abbiamo veramente bisogno di un’idea migliore, che non stare a controllare, uno per uno, tutti i cammini.» «Sì, ma adesso devi davvero andare a letto. Ops, ho fatto ancora la parte del “genitore”. . . scusa!» «Okay, okay, hai ragione. Ma dimmi ancora solamente come si fa a contare il numero degli atomi della terra o dell’universo.» «Questo puoi scoprirlo tu da sola all’indirizzo Internet itss. raytheon.com/cafe/qadir/q1797.html .»
«E va bene. Allora a domani.» «Sogni d’oro.» Rut era profondamente impressionata. Questa crescita enorme del numero dei cammini possibili per soli pochi vertici in più, le occupò la mente ancora per un bel pezzo. Naturalmente era necessario escogitare qualcosa di più astuto rispetto alla semplice idea di provare tutte le soluzioni possibili, ma che cosa? Rut pensò e ripensò e, così facendo, finì per addormentarsi.
Un’innocua esplosione
«In matematica la chiamiamo esplosione combinatoria, perché, a causa di pochi vertici in più, il numero dei cammini “esplode” letteralmente.»
Monaco in quattro fermate
Naturalmente, il giorno dopo Rut era piuttosto stanca. Stringi i denti – si era detta durante la colazione; i suoi non dovevano capire che lei la sera prima non era andata subito a letto. A scuola ebbe fortuna. Sopravvisse discretamente alle prime due ore. La terza ora saltò perché la signora Glatt, l’insegnante di geografia, era di nuovo ammalata e dopo non le restavano che due ore di educazione fisica. Al termine delle lezioni, Rut si incontrò con Martina per un piccolo giro in città con annesso spuntino. Martina era una carissima ragazza. Con lei Rut si era trovata bene fin dall’inizio. E questo aveva avuto non poca importanza, perché i primi tempi a Monaco non erano stati semplicissimi. La nuova città, la nuova scuola, le lezioni in tedesco. . . Senza Martina, non si sarebbe adattata così in fretta. A Milano, appena fu chiaro che nel giro di un anno o due si sarebbe trasferita in Germania, si era naturalmente iscritta a corsi di lingua. Ma seguire una lezione di storia o di fisica in tedesco era un altro paio di maniche! Per non parlare della sociologia: una novità assoluta per lei, anche in italiano. Alcuni dei suoi compagni di classe l’avevano presa in giro per i suoi errori e la sua pronuncia, ma Martina era stata fin dall’inizio dalla sua parte e l’aveva aiutata. Così Rut era riuscita ad inserirsi a tutti gli effetti nella classe e qualche compagno si era perfino meravigliato della rapidità con cui lei ne era venuta a capo. Martina voleva comprarsi una felpa, ma non ne trovò una sola che le piacesse. Rut fu più fortunata e si comprò un paio di eleganti magliette che avrebbero potuto farle comodo durante le vacanze estive.
52 Alla ricerca della via più breve
Giunta a casa, Rut avrebbe preferito intrattenersi subito con Vim, ma capì che forse sarebbe stato meglio sbrigare prima almeno una parte dei compiti: se sua madre più tardi glielo avesse chiesto, avrebbe sempre potuto risponderle che aveva quasi finito e che si era concessa solo una piccola pausa al computer. Con i compiti, tuttavia, non andò molto avanti. La tentazione era troppo forte. «Ciao Rut. Come è andata la mattinata?» «Insomma, non c’è male. Però sono stanchissima. Ieri ho fatto davvero troppo tardi.» «Perché non ti sdrai e ti riposi un pochino?» «Vuoi scherzare? Prima devi dirmi come si trovano i cammini minimi. Dai, comincia. Ma non ti meravigliare se oggi mi ci vorrà un po’ più di tempo per capire.» «Okay. Dai un’occhiata a questa porzione della mappa della metropolitana di Monaco:»
«Vuoi trovare il migliore collegamento tra Marienplatz e Harras? Ma per questo ci servono i tempi di percorrenza tra le stazioni.»
53
«Certo che lo so! Si paga la metà se il viaggio in tutto non è più lungo di quattro fermate e se si usa la metropolitana per non più di due di esse e gli altri mezzi pubblici di superficie per le rimanenti.» «E sicuramente cercherai di viaggiare con questa tariffa ridotta tutte le volte che è possibile, dico bene?» «Beh, essendo io praticamente al verde il più delle volte, non pagherei mai un solo centesimo in più del dovuto. Comunque ho l’abbonamento mensile e non mi devo preoccupare della tariffa ridotta.» «Fa lo stesso. Per semplificare supponiamo tu non abbia l’abbonamento e che, per far prima, sia possibile viaggiare a metà prezzo per 4 fermate di metropolitana, senza altre limitazioni. Se allora tu volessi andare da Marienplatz a Harras, come faresti?» «Un momento: forse è meglio che ci vada in bicicletta. A metà prezzo è impossibile. Il collegamento più rapido è quello con la linea U6, che ha 5 fermate.» «Perché sei così sicura che quello sia il più rapido?» «Perché sia con la S7 che con la S27 ci vogliono 6 stazioni.» «Attenta! La linea S27 non ferma sull’Hackerbrücke. Dunque anche con i treni delle linee S ci vogliono solo 5 fermate. Ma come fai ad essere sicura del tutto che non sia possibile fare di meglio, magari cambiando una o due volte?» «Ma lo si vede benissimo.» «Quanto sia facile sbagliarsi giudicando “a vista” l’abbiamo appena constatato con la S27. E non dimenticare che vogliamo trovare un metodo che fornisca una soluzione ottimale anche quando il grafo ha un numero molto maggiore di vertici. Inol-
Monaco in quattro fermate
«Sì, ma tu saprai che per tutti i mezzi di trasporto pubblico a Monaco esiste una tariffa ridotta per percorrere piccole tratte, vero?»
54 Alla ricerca della via più breve
tre dobbiamo formulare i nostri algoritmi in modo così preciso da renderli eseguibili dai computer.» «Capisco, ma nel nostro esempio è comunque evidente che valide alternative non ci sono.» «E perché?» «Beh, guarda la cartina. Partendo da Marienplatz, ci sono solo due possibilità: andare verso Stachus oppure verso Sendlinger Tor. E da qua nascono gli unici due percorsi sensati.»
«Ma chi ti dice che non si debba viaggiare in direzione di Odeonsplatz?» «Veramente lo si vede, ma a te queste risposte non bastano. Ci si allontanerebbe sempre più dalla meta, questo è in qualche modo il motivo.» «E non ti viene in mente nessun argomento veramente convincente per escludere questa direzione?» «No, ma per quanto mi riguarda, possiamo anche tirarcele dietro tutte e due, le tue false direzioni.» «Va bene, allora le fermate aventi distanza 1 da Marienplatz sono esattamente queste quattro:»
55 Odeonsplatz
1 Isartor
1
1
0 Marienplatz
Sendlinger Tor
1
«Immagino che adesso elencheremo le stazioni con distanza 2, cioè Hauptbahnhof, Goetheplatz e, solo perché tu insisti, Universität, Lehel, Rosenheimer Platz e Fraunhoferstraße.» 2 Universität Odeonsplatz
1
Stachus Haupt bahnhof
2
1
2 Lehel Isartor
1
0
Rosenheimer Platz
2
Marienplatz Sendlinger Tor
1
Frauenhoferstraße
2
2 Goetheplatz
«Hai dimenticato Stachus. Se da Marienplatz vado prima a Odeonsplatz, posso raggiungere anche Stachus in due tappe.» «Sì, ma non ha alcun senso. Potevo già raggiungere Stachus dopo una sola fermata. Perché mai dunque dovrei passare da Odeonsplatz?» «Molto bene: questo è un argomento. Tutte le volte che incontriamo una stazione già raggiunta in precedenza con un numero inferiore di passi, non abbiamo bisogno di considerare ulteriormente quel collegamento. Questo modo di escludere determinate vie è uno dei principi su cui si basa l’algoritmo che ti vorrei descrivere. Se andiamo avanti come abbiamo fatto fin ora, elencando tutti i vertici con distanza 3 da Marienplatz e poi tutti quelli con distanza 4, osserviamo che Harras ancora non compare. . . »
Monaco in quattro fermate
Stachus
56 Alla ricerca della via più breve
«. . . e in questo modo sappiamo che il collegamento di lunghezza 5 con la U6 è il più corto di tutti! Te l’avevo detto. » 4 3
4 4
3
3 3
2
4
2
3
1
2
3
0
1
2
1
4
3
4
4
4
Marienplatz
4
4
3 1
5
Harras
4
3
2
2
3
4
4
«Sì, ma adesso ne abbiamo la prova! È dimostrato. Tuttavia occorre ancora migliorare questo procedimento in modo che funzioni sempre, con qualsiasi grafo avente i lati pesati.» «E dobbiamo stare attenti che l’algoritmo non sia troppo lento! Elencare sempre tutti i vertici richiederà sicuramente del tempo.» «Hai ragione; alla fine dovremo esaminare accuratamente il tempo di esecuzione dell’algoritmo. Vogliamo certo evitare i problemi di ieri con il numero complessivo dei cammini. Un’esplosione combinatoria renderebbe il nostro algoritmo inutilizzabile con i grafi di grandi dimensioni.» «Caspita, già quasi le quattro e mezza! Devo correre in piscina.» «Fai parte di una società sportiva?» «Sì, a Monaco da sei mesi, ma a Milano già da sei anni. Adesso devo proprio andare, se no arriverò troppo tardi!»
57
«Grazie. A dopo!» Rut avrebbe voluto sapere come sarebbe andata avanti, ma non voleva nemmeno perdere l’allenamento in piscina. Quando fu di nuovo a casa, si preparò un paio di panini imbottiti e si accinse a sbrigare il resto dei compiti. Ma perché erano così tanti proprio oggi? Alla fine non le rimase che il testo di storia. Come sempre faceva, si mise sul suo letto con il libro, a leggere. Ma l’esempio della metropolitana non le usciva dalla testa. Dover elencare tutti i vertici le appariva ancora un lavoro inutile. Nell’esempio del giorno prima, tuttavia, il numero dei vertici cresceva meno rapidamente di quello dei cammini. E poi i vertici venivano elencati già nella descrizione del grafo e se era possibile introdurli nel computer così, uno ad uno, non potevano nemmeno diventare troppi. Inoltre aveva la sensazione che, tralasciando le false direzioni, fosse ancora possibile risparmiare qualcosa. Vim, il giorno dopo, l’avrebbe sicuramente aiutata in questo. Dopo aver ricominciato per la quarta volta a leggere il primo paragrafo del suo libro, Rut si addormentò. Risvegliandosi il mattino seguente, si ritrovò stesa sul letto con la testa in mezzo al libro. Una volta Sara le aveva raccontato di imparare a memoria le cose mettendo il libro sotto il cuscino prima di andare a dormire. A Rut fu subito chiaro che questo metodo, con il libro di storia della sera prima, non aveva funzionato. Ma aveva perlomeno pareggiato il suo debito di sonno.
Monaco in quattro fermate
«Abbiamo comunque già finito, con il nostro piccolo esempio. Buon divertimento!»
Scelte locali, benefici globali Fortunatamente, Rut non fu interrogata in storia. La mattinata a scuola trascorse senza eventi di rilievo fino a quando Martina non distribuì gli inviti: il venerdì successivo era il suo compleanno e organizzava una grande festa. Rut, essendo la sua migliore amica, naturalmente era invitata. Non vedeva l’ora e già pensava a cosa avrebbe potuto regalarle. Dopo pranzo, Rut andò in camera sua. Era il momento migliore per dedicarsi a Vim. «Sei arrivata in tempo in piscina, ieri?» «Sì, ma dopo l’allenamento ero completamente distrutta. Mi sono perfino addormentata sui miei compiti. Adesso, però, possiamo andare avanti.» «Bene. Allora diamo un’occhiata ad un piccolo esempio. Ecco un grafo con pesi positivi sugli archi; per semplicità puoi pensare che i pesi indichino tempi di percorrenza. Vogliamo andare dal vertice p al vertice t seguendo il percorso più breve possibile, stando naturalmente ai pesi dati. Hai un’idea di come possiamo procedere?» a
p 3
c
10
2
1
12
2 11 t
11 5
e
7
15
3
3
2 7 b
3
2
2 d
f
60 Alla ricerca della via più breve
«Sicuramente non dovremo provare tutti i cammini possibili, questo me lo hai già chiarito tu ieri l’altro.» «Verissimo. Ciò che ci complica la vita è l’esplosione combinatoria che investe il numero dei cammini. Ma l’esplosione combinatoria avviene, per così dire, globalmente. Con questo intendo dire che essa è una proprietà del grafo nella sua interezza. Al contrario, il numero di alternative che abbiamo a disposizione in ogni singolo vertice non è molto grande.» «Nel nostro esempio non ci sono mai più di tre archi uscenti da un vertice.» «In altri grafi, come ad esempio la mappa della metropolitana, gli archi uscenti da uno stesso vertice possono essere naturalmente molti di più, ma il loro numero sarà sempre inferiore al numero totale dei vertici del grafo. Al massimo infatti, si possono solo raggiungere tutti gli altri vertici; di più non si può fare. E se scegliessimo ad ogni vertice una sola direzione in cui procedere, il numero di modi in cui il cammino verso t potrebbe ancora essere completato si ridurrebbe.» «E a che ci serve? Uscendo da p, non sappiamo proprio in che direzione dobbiamo muoverci per fare il tragitto più breve verso t!» «Qui hai ragione. Per questo dobbiamo inizialmente dimenticarci di t. Invece di costruire immediatamente un cammino minimo da p a t, costruiremo cammini minimi da p a tanti altri vertici.» «Ma così è ancora più complicato!» «Al contrario. Anche se può sembrare che così le cose si complichino, alla fine risulterà tutto più semplice.» «Mi pare un po’ strano.» «Rendere in un primo momento la cosa apparentemente più complicata per poi trovare una migliore strategia di risoluzione è uno dei metodi preferiti in matematica.» «Non vedo proprio in che modo un problema possa essere semplificato rendendolo più difficile, ma vai pure avanti.»
61
«Sì, me ne ricordo bene! Tanto hai fatto che ho dovuto includere tutte le stazioni vicine a Marienplatz.» «Ed è proprio questo modo di procedere che vogliamo adesso generalizzare per ottenere un algoritmo utile. Per farlo, sfruttiamo l’ipotesi che tutti i pesi siano positivi. Il numero dei cammini da p a t può diventare troppo grande, ma quello dei vertici vicini ad un dato vertice no. Se riusciamo a trovare un cammino minimo limitandoci a decidere “localmente” come procedere vertice per vertice. . . » «. . . allora abbiamo vinto. Ma come si può fare per ottenere alla fine proprio il cammino minimo?» «Un cammino minimo! Attenta: possono essercene tanti.» «Sei uno preciso. E va bene: come si può fare per ottenere sempre un cammino minimo?» «Gettiamo ancora uno sguardo al nostro esempio. Se partiamo da p abbiamo due possibilità: andare in a o in b. Ammettiamo di conoscere solo la parte di grafo direttamente raggiungibile da p. Possiamo essere sicuri che non ci siano altri cammini da p ad a e da p a b più brevi di quelli diretti? Possiamo cioè essere certi che non scopriremo in seguito delle scorciatoie?» a
p 3
c
10
2
1
12
2 11 t
11 5
e
7
15
3
3
2 7 b
3
d
2
2 f
«Mmm, un momento. . . No, la via diretta da p a b non è affatto la più breve. Se si va prima in a, e da lì si scende in b, si fa prima. Ma non lo si può sapere, se si conoscono solo gli archi che escono direttamente da p.»
Scelte locali, benefici globali
«Ti ricordi come abbiamo fatto ieri, con l’esempio della metropolitana? Non ci siamo curati affatto della direzione in cui partire per raggiungere Harras.»
62 a
Alla ricerca della via più breve
p 3
c
10
2
1
e
7 12
2 11 t
11
15
3
5
3
2 7 b
2
2
3
d
f
«Sì, la “deviazione” per a è più breve dell’arco che va da p a b. Ma può capitare qualcosa del genere anche per a?» «Non saprei come. Se si va prima verso b si ha già impiegato più tempo che da p ad a.» «È vero, ma attenzione! Se l’arco da b ad a avesse un peso negativo pari a −3, allora il tuo argomento non sarebbe valido.» a
p 3
c
10
2
1
e
7 12
2 11 t
–3 11
15
5
3
2 7 b
3
d
2
2 f
«Ma non abbiamo proprio supposto che non ci sono pesi negativi?» «Volevo solo farti notare che questa ipotesi è veramente importante. Se non lo stabilissimo, il nostro procedimento fallirebbe già qui. Disponendo solamente di archi con pesi positivi, il collegamento diretto da p ad a è sicuramente il più breve perché a è, tra tutti i vertici, quello con la minor distanza da p. Nessuna deviazione può più portare ad un risparmio. Lascia che io lo annoti nel nostro grafo: nel cerchio del vertice a inserisco la distanza 3 di p da a. Poi coloro a di rosso, per indicare che abbiamo già trovato un cammino minimo da p ad a. L’arco da p ad a rimane nero, ma coloriamo di verde tutti gli
63
a 10 3 p 3
c 7 13 12 2
1
2 11 t
11 5
e
15
3
3
2
4 b 3
7
14 2 d
2 f
«Mi pare complicato, ma col tuo disegno capisco cosa intendi dire.» «Allora adesso vedrai certamente anche tu che possiamo essere sicuri che non c’è un cammino da p a b più breve di quello che passa per a.» «È chiaro. La via diretta da p non è più breve e tutte le altre conducono verso d e sono molto più lunghe. Ma questo, veramente, ancora non lo sappiamo. Conosciamo solo il pezzo di grafo attorno a p ed a.» «E tuttavia non si può arrivare più rapidamente a b, anche se, utilizzando vertici intermedi non ancora colorati, esistono tante altre alternative. I vertici colorati possono infatti essere abbandonati solo attraverso gli archi verdi. Se potessimo in qualche modo arrivare a b ancora più velocemente, ciò potrebbe solo avvenire attraverso c o d. Ma non importa quale dei due vertici scegliamo per primo. Essendo le distanze segnate su entrambi più grosse di quella segnata in b, il cammino da p verso di loro è già più lungo di quello che da p attraversa a e va a b. E siccome non compaiono pesi negativi che più tardi possano portare a risparmi, nessuno di questi altri cammini può essere più corto.»
Scelte locali, benefici globali
altri archi che escono da p o da a per indicare che questi costituiscono le nostre alternative per procedere. Infine scriviamo nei nuovi vertici raggiunti dagli archi verdi, come valore della loro distanza da p, le lunghezze dei rispettivi cammini minimi fin ora noti.»
64 Alla ricerca della via più breve
«Poiché la distanza 4 segnata in b è la più piccola tra tutte quelle segnate nei vertici che possiamo raggiungere con gli archi verdi, siamo allora autorizzati a colorare b di rosso.» «Esattamente, e gli archi uscenti da b sono ora nuove alternative per andare avanti. In più, coloriamo l’arco da a a b nuovamente di nero, perché fa parte del cammino minimo da p a b. L’arco diretto da p a b e quello che da b torna ad a possono, al contrario, essere eliminati. Su di essi non può correre nessun cammino minimo, verso nessun vertice.» a 10 3 p 3
c 7 6 12 2
1
e 2 11 t
11
15 3
2
4 3 b
7
7 2 d
2 f
«Bene, ma perché hai cambiato le distanze segnate in c e d?» «Perché adesso, passando per b, abbiamo trovato cammini per raggiungere tanto c quanto d, più brevi di quelli noti finora attraversando a. I valori segnati nei vertici raggiunti da archi verdi esprimono solamente la lunghezza del cammino che fino ad ora realizza il collegamento più breve da p a questi vertici.» «Capisco, come prima con b. Anche là avremmo dovuto scrivere subito un 5, ma poi abbiamo messo un 4. Pian piano comincio a capire come funziona il tuo metodo. Posso provare io a fare il prossimo passo?» «Volentieri!» «Se ho capito bene, possiamo adesso essere sicuri che non c’è un cammino per raggiungere c più breve di quello che passa per b, perché in c è segnato il valore più piccolo rispetto agli altri vertici non ancora colorati di rosso e raggiunti da archi verdi. Dunque coloriamo c di rosso e gli archi che escono da c di verde, perché costituiscono nuove alternative per andare avanti.»
65
«No. Il successivo vertice rosso può essere scelto solo tra c o d. Ma la distanza 6 di c è più piccola della distanza 7 di d. Ciò significa che 6 è la distanza del cammino più breve possibile sui vertici già marcati. E per i vertici non ancora marcati non può passare nessun cammino più breve, poiché essi per primi non sono raggiungibili con un cammino migliore.» «Meraviglioso. Se adesso aggiorniamo i valori segnati nei vertici raggiunti dagli archi verdi, otteniamo la seguente situazione:»
«Vedo già che così, pian pianino, arriviamo verso t. Ma non sarebbe più semplice procedere scegliendo ogni volta l’arco verde con il peso minore?» «Attenta! Fino ad adesso si potrebbe pensare che anche così possa funzionare. Ma allora dovresti scegliere al prossimo passo l’arco da c a d. È invece meglio procedere direttamente da b a d. L’arco da c a d, al contrario, non compare in alcun cammino minimo.» a 3 p 3
c 7 6 12
1
e 13 2 11 t
3
2
4 3 b
7 2 d
9 f
2
Scelte locali, benefici globali
«Molto bene. Ma non è davvero possibile raggiungere c più velocemente?»
66 Alla ricerca della via più breve
«Sì, hai ragione tu. Lo si vede anche dal 7 che abbiamo scritto in d. Se d fosse stato raggiunto da c, avremmo dovuto scriverci un 8.» «Ed ora ti faccio vedere come appare il corrispondente algoritmo.» Suonarono alla porta. Rut balzò in piedi e fu, come al solito, la prima ad arrivare all’ingresso. Era la signora Meier. Veniva a lasciare le chiavi della sua casa alla mamma, in modo che potesse innaffiarle i fiori mentre lei era in ferie. Rut non sapeva proprio che i Meier sarebbero andati ad Atene per una settimana. La Grecia, che bello! La mamma preparò velocemente una tazza di caffè mentre la signora Meier riferiva il programma del suo viaggio. Solo templi e musei! Una settimana non proprio riposante. Non che Rut avesse qualcosa contro la “cultura”, ma la prospettiva di passare un po’ di tempo in spiaggia o uscendo la sera le sarebbe parsa più allettante. E poi edifici greci e sculture si potevano trovare anche a Monaco. L’Atene della Baviera, l’aveva chiamata, metà per scherzo e metà seriamente, il suo insegnante di storia.
Veduta della Königsplatz con i Propilei e la Gliptoteca
Naturalmente lei conosceva la Königsplatz, ma forse avrebbe dovuto prima o poi visitare anche la Gliptoteca: un paio di statue greche non possono certo nuocere. E forse la cosa avrebbe interessato anche Jan. Jan le piaceva e Rut aveva la sensazione, a sua volta, di piacergli.
67 Scelte locali, benefici globali
Fauno Barberini, scultura esposta alla Gliptoteca di Monaco
In principio era l’input
Dopo che la signora Meier se ne fu andata, Rut aiutò sua madre a sparecchiare, quindi tornò in camera sua. «Riuscirò a sapere una buona volta come va a finire questa storia?» «Ma certo. Questo è l’algoritmo:» L’algoritmo di Dijkstra Input: grafo orientato G = (V, E) con pesi sugli archi Output: un cammino minimo da p a t e la sua lunghezza Distanza(t) BEGIN R ← {p}, Distanza(p) ← 0 FOR ALL v in V \ {p} DO Distanza(v) ← Lunghezza(p, v) Antecedente(v) ← p END FOR WHILE t non in R DO trova v∗ in V \ R tale che Distanza(v∗ ) = min{Distanza(v) : v in V \ R} R ← R ∪ {v∗ } FOR ALL v in V \ R DO IF Distanza(v∗ ) + Lunghezza(v∗ , v) < Distanza(v) THEN Distanza(v) ← Distanza(v∗ ) + Lunghezza(v∗ , v) Antecedente(v) ← v∗ END IF END FOR END WHILE END
70 «Puah, com’è complicato!» Alla ricerca della via più breve
«Vuoi che passiamo oltre? Possiamo anche saltare la descrizione formale dell’algoritmo.» «Non se ne parla nemmeno! Voglio capire tutto quello che c’è scritto, dall’inizio alla fine; però tu devi spiegarmelo un passo alla volta. La prima riga, l’input. . . » «. . . è l’insieme dei dati che vanno forniti inizialmente all’algoritmo.» «Sì, questo lo capisco. Se l’algoritmo deve trovare un cammino minimo, bisognerà pure dargli un grafo in cui trovarlo. Ma già con l’output ho qualche difficoltà. Cosa vuol dire questo “Distanza—aperta parentesi tonda—t—chiusa parentesi tonda”?» «Si legge: “distanza di t” e si intende con ciò la distanza da p del vertice scritto tra parentesi – t in questo caso –. Nell’algoritmo ci servirà la distanza da p di ogni vertice v di V. In Distanza(v) memorizzeremo la lunghezza di un cammino minimo da p a v, allo stato attuale delle conoscenze.» «È il numero che segnavi prima dentro i vertici?» «Esatto.» «Dunque, alla fine dell’algoritmo, Distanza(t) è la lunghezza di un cammino minimo da p a t?» «Dovrebbe proprio essere così. Ma controlliamo se l’algoritmo funziona veramente come ci si aspetta. Qui scrivo di nuovo la prima riga:» BEGIN R ← {p}, Distanza(p) ← 0
«“BEGIN” è sicuramente il segnale che adesso si parte, ma il resto non mi dice nulla.» «Questa riga descrive la nostra situazione iniziale. Ovviamente la lunghezza di un cammino minimo dal vertice p a se stesso, cioè Distanza(p), è 0.»
71 «È logico: la distanza di ogni luogo da se stesso è 0.»
a 1
p 3
–5 b
«Questo sì che è divertente! Si arriva un’ora prima di quando si è partiti.» «Se misurassimo le lunghezze in “ore di viaggio”, allora occorrerebbe davvero una macchina del tempo per spostarsi da b a p. Ma non dimenticare che i pesi non devono necessariamente rappresentare tempi o distanze.» «A cosa non si deve pensare! Meno male che abbiamo supposto i pesi positivi.» «E avendolo fatto, possiamo assegnare a Distanza(p) il valore 0, all’inizio dell’algoritmo. Ogni “assegnazione”, negli algoritmi, è simbolizzata con una freccia “←”.» «Allora “Distanza(p) ← 0” vuol dire semplicemente “dare al vertice p il valore 0”?» «Sì, e poniamo subito R uguale a {p}, perché con R indichiamo l’insieme dei vertici per i quali abbiamo già trovato un cammino minimo a partire da p. All’inizio, in R c’è solo il vertice p, ma con il procedere dell’algoritmo si aggiungeranno altri vertici. La lettera R non è stata scelta a caso: ricordi quello che succedeva prima, quando i vertici si coloravano uno alla volta di Rosso?» «Ma certo! Il colore rosso voleva proprio dire che da p ai vertici marcati con quel colore si conosceva già un cammino minimo.»
In principio era l’input
«A dire il vero, anche questo dipende dal fatto che tutti gli archi hanno pesi positivi, altrimenti potrebbe succedere qualcosa del genere:»
72 Alla ricerca della via più breve
«Esattamente. Nell’algoritmo siamo arrivati adesso al primo ciclo FOR. Si tratta della regione compresa tra “FOR ALL” e “END FOR”. Sai cosa significa la barra obliqua che compare in “V \ {p}”?» FOR ALL v in V \ {p} DO Distanza(v) ← Lunghezza(p, v) Antecedente(v) ← p END FOR
«Certamente. È il simbolo della differenza tra insiemi. Serve per escludere qualcuno dall’insieme, in questo caso p.» «Esatto. “FOR ALL v in V \ {p} DO” vuole dire che tutte le istruzioni che seguono, fino a “END FOR”, si devono ripetere per ogni vertice in V, tranne che per p.» «Okay, per prima cosa si deve porre Distanza(v) uguale a Lunghezza(p, v). Lunghezza(p, v) sarà la lunghezza dell’arco da p a v, dico bene?» «Indovinato. In questo modo assegniamo ad ogni vertice, come primo valore della distanza, la lunghezza dell’arco che lo collega direttamente a p.» «E se non c’è un arco che va da p a v?» «Allora usiamo un piccolo trucco. In questo caso poniamo Lunghezza(p, v) uguale a infinito. Non fa infatti alcuna differenza se il vertice è irraggiungibile oppure se è infinitamente lontano. Con questo piccolo trucco, però, l’algoritmo si lascia descrivere in modo più semplice e conciso, in quanto non occorre stare sempre a distinguere se c’è o non c’è l’arco che collega i vertici. Fin qua coloravamo i vertici non raggiungibili in grigio chiaro, piuttosto che aggiungere al grafo archi con peso infinito; per i nostri grafi lo trovo un accorgimento esteticamente migliore.» «Va bene, ma che significa la prossima riga, quella con: “Antecedente(v) ← p”?»
73
a 3
c 7 6 12
1
p 3 0
e 13 2 11 t
3
2
4 b 3
7 2 d
9 f
2
«E come funziona la faccenda degli antecedenti?» «Fin qui avevamo Antecedente(d) = b, Antecedente(b) = a,
Antecedente(c) = b Antecedente(a) = p.
Scorrendo al contrario la lista degli antecedenti da d fino a p, si ottiene p→a→b→d cioè il cammino da p a d.» «Non è una complicazione inutile? Perché non si memorizza più semplicemente l’intero cammino?» «Perché questa cosa va fatta per ogni vertice. Può fare allora una bella differenza elencare, per ogni vertice, uno solo o tutti i suoi antecedenti; registrandoli tutti, l’algoritmo potrebbe diventare molto più lento e richiedere molta più memoria.» «Capisco.»
In principio era l’input
«In Antecedente(v) memorizzeremo sempre il vertice che precede immediatamente v nel cammino minimo che passa per v. Alla fine, l’algoritmo non dovrà solamente fornire la lunghezza del cammino più breve, ma anche dirci com’è fatto questo cammino. Se al termine raggiungiamo il vertice t, attraverso i suoi antecedenti possiamo ricostruire il percorso fatto, andando a ritroso. Diamo una occhiata al nostro esempio. Così appariva il grafo quando siamo stati interrotti. Ho colorato di rosso anche il vertice di partenza perché pure lui appartiene a R.»
74 Alla ricerca della via più breve
«Siccome all’inizio consideriamo solo gli archi che escono da p, sarà p stesso l’antecedente di tutti gli altri vertici.» «E per questo si pone subito Antecedente(v) uguale a p per ogni v in V, tranne p. E va bene, ma adesso arriva il “WHILE”. Questa parte sembra terribilmente complicata.»
WHILE t non in R DO trova v∗ in V \ R tale che Distanza(v∗ ) = min{Distanza(v) : v in V \ R} R ← R ∪ {v∗ } FOR ALL v in V \ R DO IF Distanza(v∗ ) + Lunghezza(v∗ , v) < Distanza(v) THEN Distanza(v) ← Distanza(v∗ ) + Lunghezza(v∗ , v) Antecedente(v) ← v∗ END IF END FOR END WHILE
«Questo blocco costituisce il vero cuore dell’algoritmo. “WHILE t non in R DO” significa solamente che il pezzo fino a “END WHILE”, il ciclo WHILE, va ripetuto finché anche t non fa parte di R.» «Perché solo allora anche t è colorato di rosso ed abbiamo trovato un cammino minimo da p a t!» «Adesso arriva il passaggio decisivo.» «La riga con il v ∗ ?» «Proprio quella. Con il segno “∗”, spesso i matematici indicano le “migliori soluzioni” in un qualche contesto; qui si tratta di un vertice tra tutti quelli non ancora colorati di rosso con il più piccolo valore di Distanza(v).» «Allora “min” vuol dire minimo?» «Precisamente! Qui si descrive il passo in cui scegliamo un vertice con il minimo valore della distanza per poi colorarlo di rosso. L’assegnazione “R ← R∪{v ∗ }” vuole significare proprio che ai vertici finora già colorati di rosso si aggiunge anche v ∗ .»
75 «Adesso mi ci vorrebbe davvero un esempio.»
a 3 p 3 0
c 7 6 12
1
e 13 2 11 t
3
2
4 b 3
7 2 d
9 f
2
«E adesso?» «Abbiamo appena eseguito il ciclo WHILE e, siccome t non è ancora rosso, dobbiamo ripeterlo ancora da capo.» «E cerchiamo un nuovo v ∗ ?» «Esatto, e in questo caso è f , perché f non è ancora colorato di rosso e, tra tutti i vertici non colorati, è quello con il valore più piccolo.» «Quindi adesso coloriamo anche f ?» «È proprio quello che succede nella riga “R ← R ∪ {v ∗ }”, perché questa volta v ∗ è f . E adesso ti ricorderai sicuramente che, dopo aver colorato un vertice, dovevamo sempre aggiornare i valori nei rimanenti vertici non colorati.» a 3 p 3 0
c 7 6
e 12 2 11
1
t 11 3
2
4 b 3
7 2 d
9 f
2
In principio era l’input
«Volentieri. Portiamo semplicemente a termine l’algoritmo nel nostro grafo di prima. Guarda, eravamo arrivati fin qui:»
76 Alla ricerca della via più breve
«Certo, può darsi infatti che attraverso f si trovi, per qualcuno dei vertici restanti, un cammino più breve del cammino minimo noto finora.» «Un tale aggiornamento viene anche chiamato update, ed è proprio questo update dei valori nei vertici non colorati che ha luogo nel secondo ciclo FOR.» FOR ALL v in V \ R DO IF Distanza(v∗ ) + Lunghezza(v∗ , v) < Distanza(v) THEN Distanza(v) ← Distanza(v∗ ) + Lunghezza(v∗ , v) Antecedente(v) ← v∗ END IF END FOR
«Questo devi spiegarmelo meglio.» «Con piacere. V \ R è l’insieme dei vertici che finora non sono ancora colorati di rosso. All’interno del ciclo si controlla per ciascuno di questi vertici, cioè per ogni v in V \ R, se il cammino più breve per raggiungere v fin qui trovato è ancora il più corto o se non sia meglio arrivare a v da v ∗ .» «Dunque, si controlla se attraverso il nuovo vertice colorato si ottiene un valore migliore?» «Esatto, e lo si stabilisce, nell’algoritmo, con il confronto tra Distanza(v ∗ )+Lunghezza(v ∗ , v) e Distanza(v). Se il vecchio valore Distanza(v) non supera la somma di Distanza(v ∗ ) e Lunghezza(v ∗ , v), allora non si deve fare nulla, perché la vecchia strada per v è ancora la più corta. Ma se Distanza(v ∗ ) + Lunghezza(v ∗ , v) è minore di Distanza(v), allora dobbiamo correggere il valore in v con l’assegnazione “Distanza(v) ← Distanza(v ∗ ) + Lunghezza(v ∗ , v)”. In più, in quest’ultimo caso, con l’assegnazione “Antecedente(v) ← v ∗ ” ci ricordiamo del fatto che adesso v ∗ è l’antecedente diretto di v lungo il cammino più breve attualmente noto per raggiungere v.» «Se ho capito bene, adesso v ∗ è f ed abbiamo Distanza(f ) + Lunghezza(f, e) = 9 + 3 = 12, che è un valore inferiore a quello noto finora, ottenuto passando per c ed e, di lunghezza 13.»
77
«Puah! Con i grafi non era mica così difficile. Questa scrittura formale degli algoritmi fa davvero fumare il cervello!» «Abbiamo quasi finito.» «E va bene, vediamo pure anche il resto.» «Se un vertice v è raggiungibile per la prima volta attraverso v ∗ , come succede proprio con t nel nostro esempio, allora nella fase di update il valore della sua distanza Distanza(v) viene portato da infinito ad un valore finito. Nei nostri disegni il vertice verrebbe per la prima volta disegnato in tinta piena e non più in grigio. Riesci a vedere come si va avanti?» «Penso di sì. Siccome abbiamo di nuovo eseguito tutte le istruzioni del ciclo WHILE, riprendiamo dal “WHILE” in alto. Il nostro vertice-traguardo t non è però ancora colorato di rosso ed allora dobbiamo metterci di nuovo a cercare il nostro v ∗ . Questa volta v ∗ è lo stesso t. Dunque coloriamo t di rosso ed abbiamo finito.» «Veramente dovremmo ancora aggiornare i dati dei vertici raggiunti da t. Ma ciò non è necessario adesso, perché da t non partono archi.» a 3 p 3 0
e 12 2
c 6 11
1
t 11 3
2
4 3 b
7 2 d
9 f
2
«Allora abbiamo finito veramente!» «Sì; se siamo interessati solamente ad un cammino minimo da p a t, abbiamo ottenuto il risultato. Tuttavia, senza un’eccessi-
In principio era l’input
«Sì, e per questo modifichiamo il valore di Distanza(e) da 13 a 12; con “Antecedente(e) ← f ” salviamo inoltre l’informazione che l’antecedente di e lungo il cammino più breve fin qui trovato per raggiungerlo è adesso f .»
78 Alla ricerca della via più breve
va spesa supplementare, potremmo trovare i cammini minimi da p a tutti i vertici di V. A volte può essere molto utile. Per farlo dobbiamo solo andare avanti finché tutti i vertici non sono colorati di rosso. Nel nostro esempio manca solo e. Non cambia quasi niente nella formulazione dell’algoritmo. Guarda qui, ho evidenziato i cambiamenti necessari in rosso:» L’algoritmo di Dijkstra Input: grafo orientato G = (V, E) con pesi sugli archi Output: Cammini minimi da p a v e loro lunghezza Distanza(v) per ogni v in V BEGIN R ← {p}, Distanza(p) ← 0 FOR ALL v in V \ {p} DO Distanza(v) ← Lunghezza(p, v) Antecedente(v) ← p END FOR WHILE R = V DO trova v∗ in V \ R tale che Distanza(v∗ ) = min{Distanza(v) : v in V \ R} R ← R ∪ {v∗ } FOR ALL v in V \ R DO IF Distanza(v∗ ) + Lunghezza(v∗ , v) < Distanza(v) THEN Distanza(v) ← Distanza(v∗ ) + Lunghezza(v∗ , v) Antecedente(v) ← v∗ END IF END FOR END WHILE END
«È vero, è cambiata solo la descrizione dell’output ed il fatto che si finisce quando tutti i vertici sono in R, cioè quando sono tutti rossi, non solo t.» «Se ne hai ancora voglia, alla pagina web www-m9.ma.tum. de/dm/java-applets/dijkstra/ puoi provare “dal vivo” entrambi gli algoritmi su grafi che tu stessa puoi inventare, disponendo i vertici sullo schermo col mouse.»
79
«Beh, spesso serve per la soluzione di problemi di Routenplanung diversi dal nostro. C’è tuttavia un bell’esempio pratico in cui si può sfruttare concretamente la conoscenza dei cammini minimi da ogni vertice del grafo a t.» «Ma non era il contrario? Con il nostro algoritmo non si trovavano tutti i cammini minimi da p agli altri vertici?» «È vero, ma se semplicemente scambiamo tra loro traguardo e partenza e se invertiamo la direzione di ogni arco, l’algoritmo di Dijkstra può risolvere anche il problema di trovare i cammini minimi da t ad ogni altro vertice del grafo. Nel nostro esempio, ciò significa trasformare il grafo in questo modo:» 10 3
7 2
1
2 11 Partenza
11 5
12
15
3
3
2 7 3
2
2
«E che me ne faccio?» «L’algoritmo di Dijkstra, applicato a questo grafo, calcola adesso i cammini minimi da t a ciascuno degli altri vertici. Invertendo di nuovo le direzioni degli archi, questi cammini diventano cammini minimi da un punto qualunque del grafo a t.» «Capisco. Un bel trucco, te lo concedo. Ma di che applicazione si tratta?» «Hai mai visto un sistema di navigazione per auto? Qui, al sito www.bmw.de/de/produkte/zubehoer/, c’è la fotografia di
uno di questi navigatori.»
In principio era l’input
«Ma serve davvero, nella pratica, conoscere i cammini minimi da p a ognuno dei vertici del grafo?»
80 Alla ricerca della via più breve
«Sì, i genitori di Inga hanno un impianto del genere sulla loro nuova auto. Il piccolo monitor mostra in che direzione procedere.» «Se prima gli si è detto dove si vuole andare.» «Che differenza c’è con il programma di navigazione che abbiamo visto all’inizio nel web? Anche qui abbiamo bisogno di trovare il cammino più breve dal punto in cui mi trovo all’obiettivo.» «Sì, ma immagina di dover lasciare, per un qualche motivo, la strada già calcolata. Può darsi che tu abbia sbagliato a svoltare ad un incrocio oppure che la strada sia chiusa per un cantiere o qualcosa del genere. Allora il navigatore deve trovare velocemente un nuovo cammino minimo per raggiungere l’obiettivo, senza obbligarti ad accostare a destra ed aspettare la risposta.» «Ma questi computer non ci mettono così tanto a trovare un nuovo collegamento.» «No, i sistemi buoni, oggi, non impiegano molto a calcolare un cammino minimo. Ma se il calcolo di tutti i cammini minimi per raggiungere t a partire da tutti i vertici del grafo – o almeno a partire da tutti i vertici nei paraggi del cammino calcolato all’inizio – non comporta un grosso lavoro in più, questa sarebbe comunque una valida alternativa. Altrimenti per ogni minima deviazione dal percorso iniziale si dovrebbe far ripartire l’algoritmo da capo. Bene, adesso con l’algoritmo abbiamo veramente finito.» «Okay, anche per me può bastare così: abbastanza cicli WHILE per oggi. A domani, Vim!»
81
Odeonsplatz e la Theatinerkirche
In principio era l’input
Rut rifletté su come avrebbe potuto passare la serata. Era venerdì; il giorno dopo niente sveglia all’alba e allora le sarebbe piaciuto organizzare ancora qualcosa di bello. Rut si decise a telefonare a Jan: chissà se era libero quella sera. Ebbe fortuna; Jan non aveva impegni e così si diedero appuntamento al Caffè all’angolo della Odeonsplatz.
` negativo Negativo e
Al rientro a casa, Rut era felice. Jan e lei, insieme, avevano riso tanto e a Rut il modo di ridere di Jan piaceva moltissimo. «Ciao signorina. Come è andata la serata?» «Abbastanza bene.» «Abbastanza bene? Come sei loquace! A proposito: il papà torna di nuovo tardi. Deve ancora risolvere un problema urgente in azienda. Mi ha detto di chiederti se domenica hai voglia di “esplorare” un po’ il computer con lui. Forse ti può dare qualche buona dritta.» «Oh no, domenica ho già altro da fare.» Rut sparì velocemente in camera sua prima che sua madre potesse chiederle che cosa aveva in programma per domenica. Allarme rosso, le balenò nel cervello. Se il papà avesse esaminato il computer, avrebbe sicuramente scoperto Vim. Era troppo rischioso. Aveva allora assolutamente bisogno di un appuntamento per domenica. Jan, questo fine settimana, andava via con i suoi genitori. Per fortuna c’era ancora un po’ di tempo per trovare una buona scusa. Così tornò con i suoi pensieri a Vim. L’indomani avrebbe potuto dormire a volontà. Perché non sedersi adesso ancora un pochino al computer? «Ciao Rut, non ne hai ancora avuto abbastanza per oggi?» «Ho pensato ancora un po’ all’algoritmo ed ho alcune domande da farti.» «Spero di poterti rispondere.»
84 «Perché l’hai chiamato “Algoritmo di Dijkstra”?» Alla ricerca della via più breve
«Facile. Dijkstra è il nome dell’inventore: Edsger Wybe Dijkstra, purtroppo recentemente scomparso. Su di lui ci sono alcune pagine in internet, ma è meglio che le guardi tu stessa. Sul sito web www.digidome.nl/edsger_wybe_ dijkstra.htm c’è anche questa foto:»
«Che simpatico. Quando ha inventato l’algoritmo? Non può essere stato troppo tempo fa, giusto? I computer sono una cosa abbastanza recente.» «L’algoritmo venne pubblicato nel 1959. Se lo confronti con il teorema di Pitagora, non si può certo dire che sia al mondo da tanto tempo. Se però si pensa a com’era arretrato, a quel tempo, lo sviluppo dei computer, allora l’algoritmo è già piuttosto vecchio. Per quei tempi era piuttosto inconsueto studiare un simile problema. Siccome in un grafo il numero di tutti i possibili cammini da p a t è un numero finito, per quanto questo numero possa anche diventare piuttosto grande – come abbiamo visto –, si sapeva che doveva esserci un cammino minimo. E questo a molti matematici dell’epoca bastava. Questioni come quella riguardante il tempo impiegato da un procedimento per calcolare tale cammino non erano ancora attuali allora.
85
«Tempi duri per Dijkstra?» «E il bello deve ancora venire. Siccome Dijkstra apparteneva al gruppo dei pionieri nel suo settore, quando si sposò, la dicitura “programmatore” con cui lui definì il suo lavoro non fu accettata dall’ufficiale di stato civile. Così a Dijkstra non rimase che fornire come professione il suo titolo di studio in “Fisica teorica”.» «Assurdo! Oggi i programmatori sono richiesti ovunque.» «È proprio grazie a persone come Dijkstra che i computer hanno potuto dare il via alla loro impressionante serie di successi. Ma adesso ti stupirai: Dijkstra diceva di aver smesso di usare il computer. Alla pagina web laurel.actlab.utexas.edu/ ˜cynbe/muq/muf3_17.html si dice di lui:» In his later career, he seems to personify almost perfectly the class of computer scientist who is inclined to never touch a computer, to do his best to keep his students from touching computers, and to present computer science as a branch of pure mathematics.
«Un informatico che non tocca mai un computer? Questa è bella! Ho però ancora altre domande da farti. Tu mi hai più volte ripetuto che l’algoritmo di Dijkstra funziona solo con pesi positivi. Cosa si fa allora se ci sono anche pesi negativi? E se si volessero trovare cammini minimi in grafi non orientati, come si farebbe?» «La tua seconda domanda ha una risposta semplice. Potremmo naturalmente trasformare ogni grafo non orientato in un grafo orientato, mettendo due archi al posto di ogni lato, e poi applicare l’algoritmo di Dijkstra al nuovo grafo orientato così ottenuto.»
Negativo è negativo
La conseguenza fu che il lavoro di Dijkstra non trovò una giusta collocazione in nessuna delle consuete riviste. Alla fine l’algoritmo fece la sua apparizione nella prima edizione della rivista “Numerische Mathematik”, ma nemmeno qui era del tutto al suo posto.»
86 «Perché dici “potremmo”?» Alla ricerca della via più breve
«Perché in realtà non ce n’è bisogno. Si potrebbe infatti applicare l’algoritmo di Dijkstra anche senza riconvertire esplicitamente il grafo. Prendiamo il grafo di prima e scordiamoci delle direzioni degli archi, in modo da ottenere un grafo non orientato.» a
p 3
c
10
2
1
12
2 11 t
11 5
e
7
15
3
3
2 7 b 3
d
2
2
f
«Togliendo le direzioni agli archi, ogni tanto capita di avere due lati diversi tra gli stessi vertici. Così è un grafo multiplo, vero?» «Sì, ma dei due lati tra a e b possiamo tenerne uno solo, eliminando il più lungo: non verrà mai usato da nessuno in cerca di un cammino minimo. Lo stesso vale per tutti gli altri lati multipli. Se adesso applichiamo al nostro grafo non orientato l’algoritmo di Dijkstra, constatiamo addirittura che, per quanto riguarda i cammini e le loro lunghezze, non cambia assolutamente nulla, ma questo è naturalmente un caso.»
p 3 0 5
a 10 3 11 1
c 7 6 12 2
e 12 2 11 t 11 3
2
4 3 b
7 2 d
9 f
2
«Un caso? L’avrai fatto apposta: tu lo sai di certo, quello che stai facendo. . . »
87
a
a
3
3
p
p 1
1
1
1 b
b
«Oh sì. Nel grafo a sinistra la distanza di a da p è 3, ma se ignoriamo le direzioni diventa 2.» «Tuttavia l’algoritmo non cambia. Il trattamento dei grafi con pesi negativi, al contrario, è più difficile. Qui possono succedere cose piuttosto spiacevoli.» «Cose spiacevoli? Che intendi dire?» «In un grafo, una successione di archi o di lati che, a partire da un vertice, vi fa ritorno viene detta un circuito. Nel fare questo, però, nessuno degli archi o lati deve essere usato più di una volta. Ecco due esempi:» 3 –4
2
3
6
1
–7
5 2
«Come nella Formula 1, dove la partenza e il traguardo coincidono. Si chiamano circuiti anche quelli, no? Forse il nome viene da lì.»
Negativo è negativo
«Okay, okay, lo ammetto. In generale però i cammini e le loro lunghezze cambiano, se si ignorano le direzioni. Qui c’è un piccolo esempio:»
88 Alla ricerca della via più breve
«Forse. Il primo di questi due circuiti è un circuito di lunghezza negativa, in quanto il risultato dell’addizione dei pesi di tutti i suoi lati è un numero negativo.» «E cosa c’è di spiacevole in questo?» «Se un grafo contiene un circuito di lunghezza negativa, percorrendo il circuito tante volte quante si vuole, si potrebbero ottenere cammini brevi a piacere. Dai uno sguardo a questo esempio. La via diretta da p a t ha lunghezza 2. Se però, prima di arrivare a t, percorriamo una volta il circuito che riporta a p, otteniamo un valore migliore e cioè −1.» –5 1
1
p
2
t
«E percorrendo il circuito tante volte potremmo ridurre la distanza di p da t sempre di più. Ma questo è il progetto perfetto di una macchina del tempo! Sì, sì, lo so: i pesi non rappresentano necessariamente tempi di percorrenza. . . » «Si può riconoscere se un grafo possiede circuiti di lunghezza negativa con l’algoritmo di Floyd-Warshall. La cosa più difficile è ritrovarsi con grafi aventi circuiti di lunghezza negativa ma dover richiedere che ogni vertice venga attraversato una sola volta. Nel nostro esempio del viaggio da Monaco ad Amburgo con tappa a Rothenburg è chiaro che non si può usare il bonus di 30 minuti per Rothenburg più di una volta, continuando a girare in tondo attorno a questa città.» Rothenburg –30 Arrivo
Rothenburg Partenza
3
5
5
2 6
89 «Che problema c’è?»
«Ma allora non possiamo sbrigare la faccenda della tappa intermedia a Rothenburg risolvendo un solo problema di cammino minimo.» «Beh, è pur sempre possibile che qualcuno trovi ancora un buon algoritmo. Oppure può darsi che le strade considerate non portino alla formazione di circuiti di lunghezza negativa attorno a Rothenburg, nonostante la presenza dell’arco con peso −30. Allora farebbe al caso nostro l’algoritmo di FloydWarshall. Questo algoritmo, infatti, non solo può scoprire i circuiti di lunghezza negativa, ma, nel caso non ce ne siano, trova anche i cammini minimi. Tuttavia impiega probabilmente più tempo dell’algoritmo di Dijkstra per i tre problemi separati Monaco-Amburgo, Monaco-Rothenburg e RothenburgAmburgo.» «Ma allora con quel peso negativo su Rothenburg mi hai proprio portato fuori strada! Un bel modo di modellare il problema, se non può portare a nulla!» «Scusa! Vedi così che già nella scelta del modello bisogna guardare avanti e pensare agli algoritmi da applicare dopo.» «Anche nell’esempio della costruzione della casa avevamo pesi negativi, dopo aver moltiplicato tutto per −1.» «In simili problemi di pianificazione non compariranno mai dei circuiti e dunque nemmeno dei circuiti di lunghezza negativa. Altrimenti ci sarebbero lavori da eseguire prima di. . . se stessi! Dunque questi problemi si possono risolvere con l’algoritmo di Floyd-Warshall. A proposito, sul sito www-m9.ma.tum.de/ dm/java-applets/floyd-warshall/ c’è una descrizione del funzionamento di questo algoritmo.» «L’algoritmo di Dijkstra sarebbe dunque il più veloce; quello di Floyd-Warshall, però, può fare qualcosa in più. Ma come si fa
Negativo è negativo
«Il problema è che, finora, nessun algoritmo efficiente è stato trovato per calcolare un cammino minimo in situazioni generali di questo tipo. Qui la parola efficiente significa: in un tempo accettabile, cioè senza “esplosione combinatoria”.»
90 Alla ricerca della via più breve
poi a stabilire se un algoritmo è “più veloce”? Non dipende dal computer sul quale si fa correre il programma?» «Questo te lo spiego un’altra volta. Oggi non ne ho più voglia.» «Ehi, questa poi no! Sei un programma e ai programmi per computer non capita, così, improvvisamente, di non avere più voglia di fare qualcosa. O stai forse cercando di nuovo di fare la parte del genitore?» «No. Sinceramente, non pensi che per oggi possa bastare?» «E va bene. Fino a domani sei in libera uscita, ma poi andiamo avanti!» «D’accordo. Domani ci sarà una risposta sul significato di “più veloce” nel nostro contesto e ti racconterò qualcosa sui tempi di esecuzione degli algoritmi. Buona notte!» «A domani.» Se Vim pensava che Rut andasse subito a letto, si sbagliava di grosso. Rut navigò ancora un po’ nel web e visitò anche qualcuno dei siti che Vim le aveva consigliato negli ultimi giorni. Che carino: glieli aveva già salvati nei preferiti, in una cartella chiamata “Se ne hai ancora voglia”. Ma certo che ne aveva voglia!
Tempi buoni, tempi cattivi
Il mattino seguente, Rut si alzò piuttosto tardi. Anche ai suoi genitori piaceva dormire più a lungo nel fine settimana. Suo padre era appena uscito dal bagno e stava preparando la tavola per la colazione; la situazione poteva diventare critica perché lui le avrebbe sicuramente chiesto come mai lei non avesse tempo il giorno seguente e lei non sapeva ancora che cosa rispondere. Nessuna buona idea le era venuta in mente. Rut provò ancora a chiamare in fretta un paio di amici dal suo cellulare, ma nessuno era raggiungibile. «Buon giorno. Vieni a fare colazione?» «Arrivo subito, papà. Devo fare ancora solo un salto in bagno.» «Tua madre mi ha detto che domani sei già impegnata. Che ne dici della prossima settimana, per dare un’occhiata al tuo computer?» «Potrebbe andare. . .» «Dopo la colazione si va in centro. Io devo comprarmi assolutamente un vestito nuovo; potremmo poi pranzare tutti assieme da qualche parte e andare subito dopo alla Lenbachhaus. La mostra di Kandinski deve essere molto interessante. Sei dei nostri, vero?» «Oh no, papà, oggi non ne ho proprio voglia.» «E va bene, fa lo stesso. Sapendo già che tu eri impegnata, tua madre ed io abbiamo programmato per la giornata di domani una piccola gita in montagna. Facciamo un’escursione sul lago Eibsee, ai piedi dello Zugspitze. Nel caso tu avessi intenzione di invitare amici da noi, avresti dunque campo libero.»
92 Alla ricerca della via più breve Lenbachhaus, Monaco
Rut arrossì un poco. Campo libero! Ma perché suo padre doveva sempre metterla in imbarazzo? Pensava forse a Jan? Oppure la stuzzicava solo tanto per fare? Fortunatamente suo padre non aveva voluto sapere i suoi piani per domenica. Con i suoi genitori fuori casa anche oggi, il suo segreto era al sicuro; per lo meno per il fine settimana. Durante la colazione, Rut dovette tuttavia stare bene in guardia, per non lasciarsi sfuggire nulla. Piuttosto che passare il fine settimana con Vim, Rut avrebbe naturalmente preferito trascorrerlo in compagnia di Jan, ma Jan era via con la sua famiglia. . . La colazione insieme fu davvero bella. Come già tante volte, i tre si erano intrattenuti a lungo, chiacchierando e discutendo di mille cose. Papà non l’aveva più punzecchiata a proposito di Jan e non aveva neppure più sfiorato l’argomento “computer”. Al termine della colazione, Rut non aveva ancora finito di sparecchia-
93
«Ciao Rut, già sveglia?» «Certo, e ho anche fatto colazione. Vim, grazie per gli indirizzi nella cartella “Se ne hai ancora voglia”.» «Ah, e così ieri hai ancora navigato! Adesso vuoi subito ricominciare? Pensavo che nel fine settimana lo studio fosse tabù.» «Ma va là. Mi hai pure promesso di raccontarmi qualcosa sulla velocità degli algoritmi.» «E va bene. I tuoi “tempi di riscaldamento” decisamente non sono lunghi. Dunque, quando matematici ed informatici si occupano di tempi di esecuzione degli algoritmi, si pone loro il problema di come misurare tali tempi senza dover fare distinzioni tra i diversi tipi di calcolatore.» «È chiaro, altrimenti ci vorrebbe una teoria nuova per ogni nuovo computer.» «Esatto. Per evitare ciò, nella Teoria della Complessità computazionale si considerano modelli matematici di computer. A proposito, i primi modelli vennero sviluppati quando ancora i computer veri e propri non c’erano. Questi modelli non corrispondono esattamente, in ogni dettaglio, ai computer reali, tuttavia ne rispecchiano le caratteristiche salienti e sono sufficienti per analizzare la questione che abbiamo posto. Esistono tantissimi modelli in questo senso e un intero settore dell’informatica teorica è dedicato a loro. A noi basta considerarne uno, quello certamente più rilevante: la macchina di Turing, così chiamata dal nome di Alan Mathison Turing.» «Ehi, questa immagine mostra un atleta. Ti è forse sfuggito un errore?» «No, Turing era molto atletico. Se non fosse diventato un matematico, sarebbe probabilmente diventato un corridore di fondo. I suoi tempi erano davvero buoni! Ma come scienziato fu una delle personalità di spicco del ventesimo secolo. Addi-
Tempi buoni, tempi cattivi
re che i suoi genitori già lasciavano la casa. Campo libero, aveva detto il papà. . .
94 Alla ricerca della via più breve Tratto da: A. Hodges – Alan Turing, Enigma, Ed. Kammerer & Unverzagt, 1989, p. 297
rittura più di uno dei risultati delle sue ricerche, preso da solo, avrebbe potuto renderlo famoso. Tra questi vi è appunto la macchina di Turing, sviluppata nel 1937, grazie alla quale alcuni lo ritengono perfino l’inventore del computer. Per il suo lavoro innovativo “Computing machinery and intelligence” del 1950, Turing è considerato anche il fondatore del settore di ricerca noto come “Intelligenza Artificiale”. In questo saggio propose quello che più tardi, dal suo nome, venne chiamato il test di Turing, per provare se un software è “intelligente”.» «Intrigante. Per così dire, un esame di maturità per computer.» «Qualcosa del genere. Turing era sicuro che nel giro di 50 anni i computer sarebbero stati in grado di eguagliare le prestazioni del cervello umano. Tuttavia, non esiste ancora al giorno d’oggi un solo programma per computer che abbia superato il test di Turing.» «I calcolatori devono allora calcare ancora a lungo i banchi di scuola.» «Turing fu anche uno dei padri della Biomatematica. Fu lui infatti a spiegare matematicamente i processi chimici responsabili della formazione dei motivi che caratterizzano la pelle di tigri o zebre.»
95 Tempi buoni, tempi cattivi
Martin Kehl, 2001
«Zoo-matematica? Non ci credo!» «Ciò che infine rese celebre Turing, ben al di là delle sue prestazioni scientifiche, fu la sua attività per i servizi segreti inglesi. Grazie allo sviluppo di una macchina che consentiva di decifrare le comunicazioni radio tedesche, egli contribuì in modo decisivo alla vittoria degli Alleati nella seconda guerra mondiale.» «Caspita! Agente 008, con licenza di origliare.» «Turing era una personalità molto particolare e ci sono molte pagine interessanti su di lui in internet. Quelle che io preferisco sono le pagine di Andrew Hodges, autore anche di una biografia di Turing. L’indirizzo è www.turing.org.uk/ turing/. Ti ho di nuovo aggiunto qualche link nei preferiti, se vuoi saperne di più su di lui. Per noi è importante soprattutto sapere che il suo modello di computer consente di ricondurre il tempo di esecuzione di un algoritmo al numero di poche operazioni fondamentali.» «Operazioni fondamentali?»
96 Alla ricerca della via più breve
«Esse comprendono: le quattro operazioni, addizione, sottrazione, moltiplicazione e divisione; le relazioni di confronto “minore”, “maggiore” e “uguale”; e le assegnazioni, simboleggiate finora con la freccia a sinistra “←”.» «È sufficiente questo per descrivere le capacità di un computer?» «Non del tutto. Anche la dimensione dei numeri coinvolti è importante. È naturalmente più dispendioso addizionare due numeri giganteschi piuttosto che due numeri di una cifra sola. Questa differenza, tuttavia, non gioca un ruolo così importante nei nostri problemi, e assumeremo quindi per semplicità che tutte le addizioni – come anche tutte le altre operazioni fondamentali – necessitino dello stesso tempo. Proviamo a contare insieme il numero delle operazioni che vengono eseguite nell’algoritmo di Dijkstra?» «Sì, prego.» «Allora sarà meglio esaminare l’algoritmo riga per riga, cercando di capire questa volta quante operazioni fondamentali sono necessarie in ogni passo. Dunque, ecco nuovamente la prima riga:» BEGIN R ← {p}, Distanza(p) ← 0
«Questo è facile. Sono solo due assegnazioni. Ma dopo? Non sappiamo per niente quanti vertici ha il grafo introdotto nell’input. Come possiamo determinare il numero di operazioni nel ciclo FOR?» FOR ALL v in V \ {p} DO Distanza(v) ← Lunghezza(p, v) Antecedente(v) ← p END FOR
«Lo dobbiamo stabilire in funzione del numero di vertici del grafo. Se facciamo l’ipotesi che ci siano n vertici, allora dobbiamo ripetere il ciclo FOR n − 1 volte, una per ciascuno dei
97
«Bene. Non era difficile. Ma il ciclo WHILE mi sembra molto meno agevole.» WHILE R = V DO trova v∗ in V \ R tale che Distanza(v∗ ) = min{Distanza(v) : v in V \ R} R ← R ∪ {v∗ } FOR ALL v in V \ R DO IF Distanza(v∗ ) + Lunghezza(v∗ , v) < Distanza(v) THEN Distanza(v) ← Distanza(v∗ ) + Lunghezza(v∗ , v) Antecedente(v) ← v∗ END IF END FOR END WHILE
«Anche qui la situazione non è così drammatica come sembra. La condizione del ciclo prescrive che il blocco di istruzioni venga ripetuto fintanto che rimane R = V. Siccome ad ogni ciclo si verifica il passaggio di un vertice dall’insieme V \ R dei vertici non colorati all’insieme R dei vertici rossi, dobbiamo eseguire il ciclo n − 1 volte, una per ogni vertice all’infuori del vertice di partenza p, che è rosso già dall’inizio.» «E questo significa che il numero di operazioni presenti all’interno del ciclo WHILE va semplicemente moltiplicato per n−1. Ottimo, è un gioco da ragazzi.» «Attenta! Il numero di operazioni che dobbiamo eseguire all’interno del ciclo cambia ogni volta che lo riprendiamo, perché dipende dal numero dei vertici non ancora colorati. Man mano che i vertici in V \ S diminuiscono, si riduce anche il lavoro da fare per trovare un vertice avente minima distanza.» «Ma allora le cose si complicano.» «No, niente paura. Raggiriamo infatti questo problema rinunciando a contare esattamente il numero delle operazioni fondamentali nel ciclo e limitandoci a stimare generosamente tale numero.»
Tempi buoni, tempi cattivi
vertici del grafo tranne p. All’interno del ciclo vengono eseguite ogni volta 2 assegnazioni. In tutto fanno allora 2(n − 1) operazioni fondamentali.»
98 «Vuoi dire tirando a indovinare? Mi sembra poco matematico.» Alla ricerca della via più breve
«Ho detto “stimare”, non “tirare a indovinare”! E poi stimare “generosamente”, cioè per eccesso, ottenendo magari un valore più grande di quello vero, ma a nessun costo un valore minore. Si dice a questo proposito stimare dall’alto. Non vogliamo stabilire il numero delle operazioni fondamentali “un tanto al braccio”, ma fornire un valore che in nessun caso sia minore del valore vero.» «Ma così non riusciamo a ottenere il vero tempo di esecuzione dell’algoritmo!» «Per i nostri scopi è sufficiente una buona stima dall’alto. I tempi esatti di esecuzione di un programma finito dipendono comunque ancora da tanti altri dettagli, ad esempio dal linguaggio di programmazione scelto, oppure dal tipo di gestione o di salvataggio dei dati. Quella che si vuole raggiungere è una classificazione per sommi capi degli algoritmi, che fornisca un primo indice della loro qualità. Guarda la tabella che segue:» Vertici n
Algoritmi n
. 2 000n
10 0,00001 sec. 0,02 sec. 20 0,00002 sec. 0,04 sec. 50 0,00005 sec. 0,1 sec. 100 0,0001 sec. 0,2 sec. 200 0,0002 sec. 0,4 sec. 500 0,0005 sec. 1 sec. . 1 000 0,001 sec. 2 sec. . 10 000 0,01 sec. 20 sec. . 100 000 0,1 sec. 3,3 min. . . 1 000 000 1 sec. 33 min.
n2 0,0001 sec. 0,0004 sec. 0,0025 sec. 0,01 sec. 0,04 sec. 0,25 sec. 1 sec. 1,7 min. 2,8 ore 11,6 giorni
. n2 + 2 000n
n3
0,0201 sec. 0,001 sec. 0,0404 sec. 0,008 sec. 0,1025 sec. 0,1 sec. 0,21 sec. 1 sec. 0,44 sec. 8 sec. 1,25 sec. 2 min. 3 sec. 17 min. 2 min. 11,6 giorni 2,8 ore 31,7 anni . 11,6 giorni 31 709 anni
«Cosa significa tutto ciò?» «Nella prima colonna della tabella ci sono i valori da 10 a un milione e corrispondono al numero n dei vertici del grafo. Nelle altre colonne, sulla seconda riga della tabella, trovi l’espressione che fornisce il numero delle operazioni necessarie per alcuni algoritmi fittizi, in funzione del numero n dei vertici del grafo.»
99 «Cosa intendi dire con: “in funzione del numero dei vertici”?»
«Ah, adesso ho capito. Il tempo di esecuzione n2 significa allora che bisogna moltiplicare il numero dei vertici del grafo per se stesso per trovare il numero di operazioni fondamentali.» «Esatto. Nelle altre righe della tabella puoi leggere i tempi di esecuzione corrispondenti per questi algoritmi, nell’ipotesi che il nostro computer sia in grado di eseguire un milione di operazioni fondamentali al secondo. Il primo algoritmo, quello che necessita esattamente di tante operazioni quanti sono i vertici, ha bisogno di un milione di operazioni per un grafo con un milione di vertici e queste sono eseguite dal nostro computer fittizio in un secondo.» «Sembra molto veloce. E quello nella seconda colonna. . . » «. . . impiega un secondo già per 500 vertici e per un milione di . vertici 2 000 secondi, cioè circa 33 minuti.» «L’algoritmo n2 impiega quasi 12 giorni col grafo da un milione di vertici?» «Sì, anche se per piccoli grafi è ancora molto più veloce dell’al. goritmo 2 000n.» «È vero, adesso lo noto anch’io.» «Lo si vede ancora più chiaramente guardando l’algoritmo n2 + . 2 000n. Per pochi vertici, il suo tempo di esecuzione eguaglia . praticamente quello dell’algoritmo 2 000n. Il pezzo n2 non ha ancora peso. Al crescere del numero dei vertici, tuttavia, que. st’ultimo acquista sempre più peso e con 100 000 vertici è al . contrario la parte 2 000n a non contare praticamente più niente.» «Questa è però una cosa strana.» «Immagina semplicemente di avere un algoritmo diviso in due . parti, in modo che nella prima parte vengano eseguite 2 000n operazioni fondamentali, mentre nella seconda n2 . La tabella
Tempi buoni, tempi cattivi
«L’algoritmo fittizio con tempo di esecuzione n necessita esattamente di tante operazioni quanti sono i vertici del grafo. Le . operazioni dell’algoritmo con tempo 2 000n, invece, ammon. tano a 2 000 volte il numero dei vertici del grafo.»
100 Alla ricerca della via più breve
ci mostra che per 10 o 20 vertici la seconda parte dell’algoritmo non incide significativamente sul tempo di esecuzione totale. Se però il numero di vertici aumenta – e con esso i tempi di esecuzione –, allora è proprio questa parte a farla da padro. . ne. Da 100 000 vertici in su, i numeri nella colonna n2 + 2 000n 2 sono addirittura uguali a quelli nella colonna n .» «Eppure i 33 minuti per un milione di vertici della colonna . 2 000n non sono del tutto una cosa da niente.» «Naturalmente in 33 minuti si può andare comodamente a bere un caffè, ma 33 minuti sono solo 0,023 giorni. Confrontati con gli 11,6 giorni della colonna n2 , sono così pochi che lo 0,023 nella somma sparisce del tutto dopo l’arrotondamento ad una cifra decimale.» «Quindi con pochi vertici il primo pezzo quasi non ha peso mentre con tanti vertici è il secondo a non averne? Da cosa dipende?» . . «Per valori piccoli di n il fattore 2 000 in 2 000·n è ovviamente molto più grande del fattore n in n·n = n2 . Se però n è uguale . a un milione, allora il fattore 2 000 è relativamente piccolo se confrontato con il fattore n.» «Capisco. L’algoritmo con tempo n3 poi, per grafi con molti vertici, è ancora più lento.» . «Sì, ma anche qui il più lento è inizialmente l’algoritmo 2 000n; 3 solo con il crescere dei vertici quello con n operazioni lo batte in lentezza, in modo direi drammatico.» «Si può veramente dire “drammatico” con tempi come quasi . . 32 anni per 100 000 vertici e quasi 32 000 anni per un milione di vertici. Tutto ciò mi ricorda l’esplosione combinatoria.» «Oh no! Perfino un procedimento del genere, con n3 operazioni, comporta un miglioramento enorme rispetto ad un algoritmo che passa in rassegna tutti i cammini. Ricordati che nel nostro grafo “esplosivo” già per 50 strati, cioè per appena 102 vertici, occorrevano quasi 36 anni e questo nell’ipotesi che potessimo verificare un milione di cammini al secondo. Un computer in grado di esaminare un milione di cammini al secondo
101
«Okay, i tuoi algoritmi fittizi sono dunque molto più veloci del controllo di tutti i cammini. Le colonne della tua tabella corrispondono allora alla classificazione a grandi linee degli algoritmi che hai menzionato prima?» «Quasi. Se diamo ancora uno sguardo alla tabella, noterai che per i numeri di vertici più elevati gli algoritmi sono elencati già nell’ordine giusto, rispetto ai tempi di esecuzione.» «Sì, quanto più un algoritmo sta a sinistra e tanto più è veloce.» «In ciò è determinante l’esponente di n. Per questo motivo classifichiamo gli algoritmi secondo questo esponente e predisponiamo, allo scopo, appositi raccoglitori in cui ripartirli. Il primo raccoglitore viene chiamato O(n), e contiene tanto l’al. goritmo n quanto quello 2 000n e ogni altro algoritmo con esponente di n non superiore a 1.» «È buffo: parli di esponente 1, ma di fatto questo 1 non compare mai.» «Al contrario. Siccome però si ha che n1 = n, non c’è bisogno di scriverlo. Il secondo raccoglitore contiene tutti gli algoritmi con massimo esponente 2 e cioè i nostri algoritmi n2 e n2 + . 2 000n. Nel terzo raccoglitore, O(n3 ), entrano tutti gli algoritmi con massimo esponente 3 e quindi anche il nostro n3 della tabella. E naturalmente si può andare avanti con potenze sempre più elevate.» . «Ma n e 2 000n son due cose molto diverse. Avere in tasca un . euro o averne 2 000 non è la stessa cosa.» . «No, ovviamente l’algoritmo n è 2 000 volte più veloce di quel. lo 2 000n, ma per numeri di vertici sufficientemente elevati l’al. goritmo 2 000n è più veloce di qualunque algoritmo che sta in O(n2 ).» «E va bene. La ripartizione nei tuoi raccoglitori mi sembra un po’ grossolana, ma capisco cosa intendi. In quale raccoglitore sta allora l’algoritmo di Dijkstra?»
Tempi buoni, tempi cattivi
è sicuramente più veloce di un computer capace di svolgere un milione di operazioni fondamentali al secondo.»
102 Alla ricerca della via più breve
«Nel raccoglitore O(n2 ). Avevamo già cominciato a contarne le operazioni fondamentali. Se vogliamo semplicemente assegnare l’algoritmo di Dijkstra ad uno dei nostri raccoglitori, nella stima dall’alto delle operazioni fondamentali necessarie è lecito essere davvero generosi. Dobbiamo solo fare attenzione a mantenere il giusto esponente di n. Finora abbiamo accertato che prima del ciclo WHILE l’algoritmo comporta circa 2n operazioni.» «Questo pezzo si può allora mettere nel raccoglitore O(n).» «Preso a sé, certamente. Ma vedremo ora che il ciclo WHILE apparterrà invece al raccoglitore O(n2 ). Perciò anche l’algoritmo nel suo complesso farà parte del raccoglitore O(n2 ).» «Perché?» . «Succede quello che prima succedeva con i pezzi n2 e 2 000n, 2 2 ricordi? Il pezzo n appartiene al raccoglitore O(n ), quello . 2 000n, invece, al raccoglitore O(n). Prendendoli insieme, per valori grandi del numero di vertici, solo il pezzo O(n2 ) è rilevante nel determinare il tempo di esecuzione complessivo. . . » «. . . e per questo motivo tutto l’algoritmo fa parte del raccoglitore O(n2 ). Ci sono arrivata.» «Bene, allora esaminiamo adesso più da vicino il primo pezzo del ciclo WHILE:» trova v∗ in V \ R tale che Distanza(v∗ ) = min{Distanza(v) : v in V \ R}
«Qui dobbiamo trovare il nostro v ∗ minimale. Lo si può esprimere in termini di operazioni fondamentali?» «Certo. Per questo, all’inizio, poniamo v ∗ uguale ad uno qualunque dei vertici non colorati; poi prendiamo, uno dopo l’altro, tutti gli altri vertici non colorati e confrontiamo i valori delle loro distanze con quello di v ∗ . Se il valore di uno di questi vertici, chiamiamolo w, è più grande di quello di v ∗ , allora possiamo semplicemente passare ai successivi vertici. Se però il valore della distanza di w è più piccolo di quello di v ∗ , poniamo prima v ∗ uguale a w e poi andiamo avanti con gli altri
103 il vertice con
«Allora il valore della distanza di v ∗ diminuirà sempre?» «Sì, e facendo questo giochetto per tutti i vertici non colorati, avremo alla fine in v ∗ un vertice non colorato con la minima distanza, proprio come volevamo. Lo potremo colorare quindi di rosso. In termini di operazioni fondamentali, la determinazione di v ∗ si può allora formulare così:» v∗ ← v FOR ALL w = v in V \ R DO IF Distanza(v∗ ) > Distanza(w) THEN v∗ ← w END FOR
«E perché non lo hai scritto così fin dall’inizio?» «Perché nell’altro modo l’algoritmo era più leggibile.» «Okay. Non sappiamo però esattamente quante volte dobbiamo cambiare v ∗ prima di trovare il minimo. Se il primo vertice scelto è già quello con minima distanza, lo confrontiamo certo con tutti gli altri vertici non colorati, ma non eseguiamo mai l’assegnazione v ∗ ← w. Se siamo invece sfortunati, può anche succedere che si debba cambiare v ∗ ogni volta.» «Giusto. Per questo stimiamo dall’alto il numero delle operazioni necessarie. Ci serve una assegnazione per v ∗ ← v e poi, per ogni altro vertice non colorato, ci servono ancora un confronto della sua distanza con quella di v ∗ e, nel caso peggiore, ogni volta una assegnazione v ∗ ← w. In tutto le operazioni fondamentali ammontano al massimo a 1 più 2 volte il numero dei vertici non colorati.» «Ma il numero dei vertici non colorati cambia continuamente!» «Esatto. Nell’ipotesi che k degli n vertici non siano ancora colorati, occorrono al massimo 1 + 2(k − 1) = 2k − 1 operazioni fondamentali per trovare tra i vertici non colorati quello con minima distanza. Ora k è ovviamente più piccolo del numero totale dei vertici n. Possiamo allora stimare k, dall’alto, con n.
Tempi buoni, tempi cattivi
vertici. Così facendo, assegneremo sempre a la minima distanza.»
v∗
104 Alla ricerca della via più breve
Ciò significa che non occorrono più di 2n−1 operazioni fondamentali per la determinazione di v ∗ e allora questo pezzo dell’algoritmo fa parte del raccoglitore O(n).» «Sostituire brutalmente con n il numero k dei vertici non ancora colorati, mi sembra certo grossolano, ma dipende solo, a quanto pare, dal raccoglitore.» «Andiamo avanti con l’update di R?» R ← R ∪ {v∗ }
«Questa è un’altra assegnazione.» «Esatto. Confrontata però con la determinazione di v ∗ , che era un O(n), la si può trascurare.» «Capisco. E adesso il ciclo FOR?» FOR ALL v in V \ R DO IF Distanza(v∗ ) + Lunghezza(v∗ , v) < Distanza(v) THEN Distanza(v) ← Distanza(v∗ ) + Lunghezza(v∗ , v) Antecedente(v) ← v∗ END IF END FOR
«Ormai non dobbiamo più lavorare tanto. Qui dobbiamo solo eseguire una addizione ed un confronto nel test della struttura IF. Se la risposta poi è “sì”, dobbiamo in più fare anche una addizione e due assegnazioni e tutto questo per ogni vertice non colorato.» «Il numero dei vertici non colorati lo stimeremo dall’alto certamente con n, vero?» «Sì. In questo modo nel ciclo FOR non ci sono più di 5n operazioni. Così vediamo che anche questo pezzo dell’algoritmo appartiene al raccoglitore O(n).» «Un momento! Qui ho un dubbio. Nel ciclo WHILE avevamo già un pezzo del tipo O(n). E adesso eccone un altro! Non diventa tutto più grande?»
105
«Vuoi dire che O(n) + O(n) = O(n)? Ma se si sottrae O(n) a entrambi i membri si ottiene però O(n) = 0.» «No, no. Non puoi fare questi calcoli con i raccoglitori. Immagina che il primo pezzo richieda 2n operazioni fondamentali e il secondo 5n. Così appartengono entrambi a O(n). Insieme fanno però 7n operazioni e anche queste appartengono allo stesso raccoglitore.» «Ma allora avevo ragione: O(n) + O(n) = O(n).» «E va bene, se proprio insisti. Tuttavia non puoi sottrarre O(n) da entrambi i membri e concludere che O(n) = 0.» «Okay, questo l’ho capito. Però se eseguo n − 1 volte un pezzo di programma che era già del tipo O(n), come quello all’interno del ciclo WHILE, allora vado a finire nel raccoglitore O(n2 ), giusto?» «Esatto: (n − 1) · O(n) diventa O(n2 ).» «Perciò il ciclo WHILE appartiene al raccoglitore O(n2 ).» «Sì, e con lui, finalmente, l’intero algoritmo di Dijkstra. Si dice che esso ha un tempo di esecuzione quadratico rispetto a n.» «Però non so ancora se l’algoritmo di Dijkstra è davvero buono. Tu hai detto che gli altri algoritmi della tabella sono fittizi. Non esiste un algoritmo vero con tempo di esecuzione uguale . a quello dell’algoritmo 2 000n? Come si comporta ad esempio l’altro procedimento, quello con il nome doppio?» «Intendi dire l’algoritmo di Floyd-Warshall? Beh, quello sta in O(n3 ) e, per un numero di vertici grande, è notevolmente più lento dell’algoritmo di Dijkstra. Hai visto bene nella tabella quanto rapidamente crescono i tempi degli algoritmi di tipo n3 . Adesso torniamo alla tua prima domanda: no, non ci può essere un algoritmo per il problema del cammino minimo che provenga dal raccoglitore O(n). In un grafo diretto senza cappi può capitare benissimo che da ogni vertice del grafo parta un arco per ciascuno degli altri vertici. In tutto sarebbero però n(n − 1) = n2 − n archi. Anche solo la lettura di tutti i loro pesi
Tempi buoni, tempi cattivi
«No. Se eseguiamo, uno dopo l’altro, due sottoprogrammi del tipo O(n), rimaniamo in O(n).»
106 Alla ricerca della via più breve
apparterrebbe già al raccoglitore O(n2 ). Non può dunque esistere un algoritmo per la soluzione del problema del cammino minimo con un esponente di n minore di 2.» «Vediamo se ho capito tutto. Poiché l’algoritmo di Dijkstra sta già nel raccoglitore O(n2 ), lo si preferisce a quello di FloydWarshall, sempre che non ci siano pesi negativi. Se nel grafo compaiono alcuni pesi negativi, allora bisogna usare l’algoritmo di Floyd-Warshall, in quanto quello di Dijkstra, in questo caso, non fornisce sempre il risultato corretto.» «Proprio così. Bene, spero che tu abbia tollerato la nostra piccola incursione nel campo della Teoria della Complessità computazionale.» «La tua classificazione con i raccoglitori non è semplicissima da digerire, ma se penso alla tabella, essa mi appare in fondo sensata.» «Prima di abbandonare definitivamente i cammini minimi, vorrei però tornare per un attimo al nostro esempio della metropolitana.»
«Pensavo che, riguardo a quello, fosse ormai tutto chiaro! Aspetta un momento, allora. Avevo promesso alla mamma di mettere la biancheria ad asciugare, non appena la lavatrice avesse finito. Sono subito da te.»
Intuito femminile
«Eccomi qua. Mi sono portata dietro una cioccolata calda ed un pacco di biscotti per uno spuntino. Allora, cosa c’è ancora da dire sulla rete urbana dei trasporti di Monaco?» «L’altro ieri, ragionando sulla cartina della metropolitana, ad un certo punto abbiamo voluto verificare se tra Marienplatz ed Harras c’è un collegamento con meno di 5 fermate.» «Oh sì; io avevo visto subito che un collegamento simile non c’è, ma tu non hai voluto accettare la mia conclusione finché non l’abbiamo dimostrata per bene, un passo alla volta. Per di più, con l’algoritmo di Dijkstra, sarebbe adesso sicuramente un gioco da ragazzi.» «In effetti lo è, anche se il grafo della rete della metropolitana non è più così piccolo come il grafo usato per spiegare l’algoritmo. Ad ogni modo, tu hai potuto affermare in pochi secondi, con una certa sicurezza, che un collegamento più breve non c’è, senza usare alcun algoritmo speciale. Dovremmo indagare più a fondo le circostanze che ti hanno permesso di riuscirci.» «Questo è il colmo! Due giorni fa non ti andava bene per niente che io lo vedessi subito e adesso, invece, vien fuori improvvisamente che era una cosa ben fatta.» «Giovedì volevo mostrarti come si trova un procedimento che fornisce sempre la soluzione: l’algoritmo di Dijkstra. Se tu però utilizzassi l’algoritmo nel problema della metropolitana senza poter disporre di un computer, impiegheresti sicuramente più tempo di quanto non ne hai impiegato allora. L’impressione che si ha è che esistano forse un paio di buone idee che possono guidarci più rapidamente verso l’obiettivo.»
108 Alla ricerca della via più breve
«Più veloci dell’algoritmo di Dijkstra? Credevo che non si potesse fare di meglio!» «Un algoritmo che risolve il problema del cammino minimo non può provenire da un raccoglitore migliore di O(n2 ), questo sì. L’algoritmo di Dijkstra sta in O(n2 ) e non è possibile fare di meglio, cioè abbassare quell’esponente 2. Essendo tuttavia la ripartizione nei raccoglitori molto grossolana, possiamo ancora sperare, utilizzando qualche trucco, di accorciare un poco i tempi effettivi di calcolo. Allora, come hai fatto quando ti ho chiesto di trovare il collegamento più breve tra Marienplatz e Harras?» «Beh, semplicissimo. Mi sono concentrata sulla zona attorno a questi due vertici e tutto è stato subito chiaro. Non ha proprio senso considerare le stazioni troppo lontane, che per di più sono la maggior parte.» «Bene, ma così facendo dobbiamo stare molto attenti a non buttar via qualcosa di rilevante. Non sempre i pesi corrispondono esattamente alle distanze tra i vertici nella rappresentazione del grafo.» «E va bene, ma grosso modo è invece proprio così, almeno nel caso in cui i vertici rappresentano luoghi e i lati strade.» «E no. Pensa ad un collegamento con il traghetto, ad una catena montuosa, a un cantiere stradale oppure a un treno regionale che viaggia solo raramente: eccoti un lato con un peso rilevante anche tra due luoghi molto vicini tra loro. Oppure immagina di andare con l’auto in Italia. I tempi di percorrenza nelle Alpi saranno sicuramente più lunghi che nei tratti pianeggianti.» «Quest’anno andremo in Francia, ma fa lo stesso. Nel tratto alpino la differenza non è comunque così drammatica. Per tornare in Italia si può fare l’autostrada del Brennero oppure il tunnel del San Bernardino.» «Ottimo esempio. Se optiamo per il San Bernardino, il programma della Michelin, sul sito www.viamichelin.com, fornisce una bella cartina stradale:»
109 Intuito femminile «Oh sì. La strada rossa percorre il tunnel e quando passa sotto la montagna è tratteggiata. Come puoi vedere, il tratto tra il versante nord e quello sud del San Bernardino non ha un peso molto diverso da quello di un tratto analogo in pianura.» «E se il tunnel dovesse essere nuovamente bloccato. . . » «. . . sarebbe allora meglio tornare in Italia scegliendo un’altra via. . . » «. . . perché in questo caso, arrivati al San Bernardino, si dovrebbe percorrere la strada segnata qui in giallo, quella che passa sopra al tunnel, arrampicandosi sul profilo delle montagne e lo stesso tratto di prima avrebbe ora un peso molto più grande. I lati del grafo simboleggiano solamente i collegamenti. La loro lunghezza sulla carta non corrisponde necessariamente al loro peso, che si tratti di una distanza o di un tempo di percorrenza.» «Nell’esempio della metropolitana non succedono però queste cose. Si può sempre viaggiare più o meno in linea d’aria e questa è anche la via più rapida.» «Ne sei proprio sicura? Allora dimmi un po’ quante fermate ci sono tra la Theresienstraße e Feldmoching.»
110 Alla ricerca della via più breve «Ma è semplice. Con 10 fermate della linea U2 si arriva al capolinea Feldmoching.» «Sicura? Io ce la faccio con 7 fermate.» «Come, scusa? Ma certo! Se passi per la stazione centrale, Hauptbahnhof, e prendi per Laim, con il tuo trucco della S27 sono in tutto 7 fermate. Però hai dovuto cambiare due volte. Non lo farebbe nessuno! Durerebbe davvero troppo, soprattutto a causa della linea S27.» «Un momento! Ti avevo solo chiesto il numero di fermate. Se è questo il parametro da ottimizzare, non contano più i tempi e la scomodità dei cambi. Ma lasciamo pure da parte la S27. Anche così sono solo 8 stazioni, con un solo cambio nella stazione centrale.» «Contando solo il numero di fermate, hai ragione, ma dove vuoi arrivare?» «Nella cartina, Feldmoching è a nord-ovest della Theresienstraße, addirittura quasi esattamente in direzione nord, geograficamente parlando. Se importa solo il numero di stazioni attraversate, conviene procedere, dalla Theresienstraße, dapprima in direzione sud, cioè inizialmente nella “direzione sba-
111
«Va bene, ma queste sono alla fine solo piccole eccezioni e gli errori che si fanno con il mio metodo della linea d’aria sono rari e piuttosto insignificanti.» «Attenta! Proprio nei lunghi viaggi in treno si mette in conto volentieri un allungamento del percorso piuttosto che dover cambiar treno tante volte con bagagli pesanti. Questo può facilmente portare ad una deviazione sensibile del tragitto scelto dalla tua linea d’aria. Ma hai ragione: nella pratica è spesso sufficiente trovare una “buona” soluzione, anche se non è esattamente quella ottimale. Tuttavia il termine “buono” è piuttosto vago.» «È vero, ma una sensazione di ciò che per noi è buono l’abbiamo sempre.» «Ai matematici non bastano simili affermazioni poco chiare. Non solo essi cercano una “buona soluzione”, ma vogliono anche sapere di quanto, nel peggiore dei casi, la soluzione trovata possa allontanarsi da quella ottimale, e tutto ciò, si badi bene, senza conoscere la soluzione ottimale.» «Obelix direbbe: “Sono pazzi, questi matematici”. Sembra un desiderio piuttosto folle.» «Solo a prima vista. In questo modo si può stimare la bontà di una simile soluzione approssimata rispetto a quella ottimale e valutare se ciò può bastare ai propri scopi.» «Non sarebbe cosa da poco. Si arriverebbe così a sapere quanto si è perduto. Ma come può funzionare? Se non si conosce la soluzione ottimale non si può sapere quanto ci si è allontanati da essa; d’altro canto, avendola trovata, non si ha più bisogno di approssimazioni, perché si possiede già la soluzione esatta.»
Intuito femminile
gliata”. La stessa cosa può capitare naturalmente anche nel tragitto tra Monaco e Amburgo. Può ad esempio essere vantaggioso, dal punto in cui ci si trova in città, dirigersi subito verso sud per imboccare un raccordo autostradale ed evitare il traffico del centro di Monaco.»
112 Alla ricerca della via più breve
«Qui si mette di nuovo in mostra la forza della matematica. Anche se non si conosce la soluzione ottimale, è spesso possibile affermare qualcosa di essa. Una cosa simile riesce anche per molti dei problemi veramente difficili, problemi per i quali sussistono pochissime speranze di trovare un algoritmo efficiente – cioè non esplosivo dal punto di vista combinatorio – che li risolva.» «Sembra illusionismo!» «No, no, non c’entra la magia. Anche nel nostro problema Monaco-Amburgo puoi già dire qualcosa della soluzione ottimale prima ancora di conoscerla.» «Come?» «Beh, sai già che la lunghezza del viaggio in chilometri non potrà mai essere più breve della distanza tra le due città in linea d’aria.» «Certo, più corto di così non si può. Ma ci serve a qualcosa saperlo?» «Immagina di aver trovato, con il tuo metodo “a sentimento”, un collegamento la cui lunghezza non differisce molto dalla distanza in linea d’aria tra partenza e traguardo, diciamo del 5 % appena. Allora sai che questa soluzione si discosta da quella ottimale al massimo del 5 %, anche senza conoscere la soluzione ottimale.» t
p
Distanza in linea d'aria ?
Cammino trovato
? Cammino ottimale
Lunghezza
113
«No, non serve frequentare una scuola di magia. Rinunciando alla soluzione ottimale si ha spesso in compenso un enorme guadagno in termini di tempo e praticabilità.» «Accidenti! Se devo cercare il collegamento migliore con la metropolitana, ad occhio nudo trovo molto rapidamente una buona soluzione. Se poi si vuole dimostrare che questa soluzione è anche ottimale, bisogna tuttavia fare un enorme sforzo. Non ne vale proprio la pena.» «Poiché – almeno nella zona centrale della città – i pesi dei lati nel grafo della metropolitana corrispondono grosso modo alle distanze tra i vertici sulla carta, la strategia di considerare solo la regione vicina a Marienplatz e Harras normalmente funziona. In problemi poi in cui il peso di ogni lato coincide esattamente con la distanza in linea d’aria tra i suoi due vertici, questa idea del restringimento del campo di indagine da te proposta conduce addirittura ad un metodo esatto.» «Vuoi dire allora che ci si può concentrare veramente sui dintorni dei vertici di partenza e arrivo?» «Sì. Ammettiamo di conoscere già un cammino tra la partenza p ed il traguardo t e di conoscerne anche la lunghezza. Disegniamo dunque l’ellisse avente proprio p e t come fuochi, con asse principale pari alla lunghezza di questo ipotetico cammino noto. L’asse principale dell’ellisse è la spessa linea blu nel disegno. A questo punto siamo autorizzati ad occuparci esclusivamente della porzione di grafo contenuta nell’ellisse: ogni cammino minimo vi deve necessariamente essere racchiuso.»
Intuito femminile
«È vero. La distanza dalla soluzione ottimale può essere addirittura minore di quella dal percorso in linea d’aria. Non è davvero una cosa difficile; per impararlo non c’è bisogno di andare ad Hogwarts.»
114 Alla ricerca della via più breve «Dici davvero? E perché proprio un’ellisse?» «Perché per ogni punto del suo bordo la somma delle distanze dai fuochi è sempre uguale, ed è pari alla lunghezza del suo asse principale.»
p
t Asse principale
p
t Asse principale
«Oh sì, ricordo di aver imparato qualcosa del genere in geometria, l’anno scorso.» «Sicuramente il vostro insegnante vi avrà anche fatto vedere la costruzione di un’ellisse con il metodo del giardiniere.» «Metodo del giardiniere? Non credo proprio, altrimenti me ne ricorderei, non fosse altro che per il nome.»
115
«Una aiuola ellittica come questa farebbe un figurone nel giardino di una villa o di un castello. La prossima volta che vado a Nymphenburg ci farò caso.»
Il castello di Nymphenburg
«Fammi dare un’occhiata. . . Oh, peccato: l’unica immagine del castello di Nymphenburg che ho nel mio database non mostra alcuna bordura floreale.»
Intuito femminile
«Dunque: un giardiniere conficca due paletti di legno nel prato e lega saldamente ad ognuno di essi una delle due estremità di una corda. Se ora il giardiniere tende il filo con la vanga e scava la terra attorno ai due paletti nei punti in cui il filo è teso, egli ottiene un’aiuola di forma esattamente ellittica. I due paletti coincidono con i fuochi dell’ellisse e la lunghezza del filo eguaglia esattamente il suo asse principale.»
116 Alla ricerca della via più breve
«Perché hai scelto un’ellisse con asse principale della stessa lunghezza del cammino da p a t trovato?» «Se un punto q si trova su un cammino da p a t, il cammino che lo contiene non potrà certo essere più corto della somma della distanza in linea d’aria tra p e q più la distanza in linea d’aria tra q e t. Se allora il punto q sta fuori dall’ellisse, questa lunghezza è già superiore a quella del cammino noto. Dunque non abbiamo più bisogno di considerare i punti che giacciono fuori dall’ellisse: non possono far parte di un cammino minimo.»
«Questo sì che è un bel colpo. È praticamente quello che ho fatto io. E il pezzo di grafo che rimane da studiare è minuscolo.» «Beh, quasi quello che hai fatto tu. Il fatto che rimangano tanti o pochi vertici nell’ellisse dipende dalla lunghezza del cammino iniziale, quello col quale abbiamo cominciato.» «Sicuro. Quanto più il nostro cammino iniziale è lontano dal cammino minimo, tanto più grande sarà l’ellisse.» «Esattamente. Quando, grazie ad un algoritmo o – come hai fatto tu – in virtù di uno “sguardo penetrante”, si ottiene molto velocemente una buona soluzione di partenza, la parte rilevante del grafo all’interno dell’ellisse può diventare così piccola che il problema può essere risolto nel complesso molto più rapidamente di quanto non fosse possibile prima, senza ricorre a questo lavoro preliminare.»
117
«Che tu ce l’abbia fatta così velocemente dipende dal fatto che l’uomo fin dai tempi più remoti si è allenato a cavarsela nel suo ambiente. Senza la capacità di valutare correttamente le distanze da una preda da cacciare o da una tigre, che magari avrebbe fatto a sua volta volentieri uno spuntino, i nostri predecessori non sarebbero sopravvissuti.» «Uomini di Neandertal nella metropolitana? Magari durante l’Oktoberfest! Altrimenti l’Homo Metropolitanicus può sperare di incontrare una tigre al massimo smontando a Thalkirchen ed andando allo zoo.» «A tutt’oggi la maggior parte degli uomini ha conservato la capacità di valutare rapidamente le distanze. Anche per questo motivo hai potuto risolvere il problema della metropolitana così in fretta. Se però le distanze tra i vertici nel disegno del grafo si discostano del tutto dai pesi che intervengono nel problema di ottimizzazione, le facoltà umane falliscono miseramente. Da’ un po’ uno sguardo a questo esempio:»
2
1
2
10
1
10 10
1
1
1
10
10
1
10 3
2 1
1
«Hm, aspetta un attimo. Direi che il cammino più breve ha lunghezza 6.»
Intuito femminile
«Essendo il mio percorso di 5 fermate da Marienplatz ad Harras già piuttosto buono, il mio ellisse era quindi così piccolo che io ho potuto vedere subito che non c’erano percorsi con 4 fermate. Se intuitivamente ho potuto risolvere questa faccenda così semplicemente, a cosa mi servono tutti i tuoi algoritmi?»
118 «Ma come ci sei riuscita?» Alla ricerca della via più breve
«Sinceramente? Per tentativi.» «A riguardo non voglio più dilungarmi.» «Ma non è nemmeno un esempio realistico! Perché i pesi dei lati dovrebbero essere distribuiti in un modo così buffo?» «Supponi ad esempio che il centro della città sia intasato a causa di una grande sfilata di carnevale e che i numeri forniscano i tempi necessari per attraversare i singoli tratti di strada. È allora evidente che sarebbe meglio procedere all’esterno della città, aggirando il centro.»
Danza carnevalesca delle “donne del mercato”.
«E va bene, un po’ di riguardo anche per questi buontemponi. Credo comunque di aver capito quello che tu volevi dire. Se i pesi dei lati non hanno niente a che vedere con la distanza tra i vertici in linea d’aria, la mia intuizione basata sulle distanze non può più essermi di alcun aiuto.» «Esatto! All’algoritmo, invece, questo non importa. L’algoritmo funziona sempre.» «Okay, ci sono arrivata. Morale della favola: meglio usare semplicemente l’algoritmo di Dijkstra, senza scorciatoie!»
Il lavoro che precede il lavoro
«Alto là! Non gettare la spugna così presto. Ci sono ancora un paio di cose che vale la pena di fare prima che l’algoritmo cominci il suo lavoro, per ridurre la mole dei calcoli. Questa sorta di “lavoro che precede il lavoro” viene detto preprocessing o anche analisi preliminare.» «Ma come? Mi hai appena mostrato come si fa presto a perdere la soluzione ottimale se solo si tralascia qualcosa, perlomeno con grafi dai pesi generici.» «Dimmi, che cosa succede se il grafo non è connesso?» «Succede che non possiamo raggiungere tutti i vertici.» «E quindi possiamo trascurare tutti quei vertici che non appartengono alla parte di grafo dove si trova il vertice di partenza, perché comunque non ci sono cammini che li raggiungono.» «Era principalmente per questo che avevamo ipotizzato la connessione dei grafi fin dall’inizio.» «Diventa interessante esaminare quei lati la cui eliminazione produce la scissione del grafo in due parti isolate tra loro. Te ne ricorderai sicuramente: erano i lati critici rispetto alla questione dell’affidabilità delle reti.» «Certo che me ne ricordo, ma che c’entra l’affidabilità delle reti con il cammino minimo?» «Questi lati rivestono un ruolo importante nella nostra analisi preliminare. Se i vertici di partenza e di arrivo appartengono alla stessa parte di grafo anche dopo la rimozione di un simile lato, si può tranquillamente cancellare tutta l’altra parte. Se invece la partenza e il traguardo vengono a trovarsi
120 Alla ricerca della via più breve
in parti diverse, possiamo ripartire il problema in due sottoproblemi distinti, considerando separatamente le due porzioni di grafo e trovando cammini minimi dalla partenza in avanti, verso l’estremità del lato critico nella stessa parte di grafo e dal traguardo all’indietro, verso l’altra estremità del lato critico. Nella mappa della metropolitana è critico ad esempio il collegamento tra Pasing e Laim:»
121
«E no! Mettiamo ad esempio che tu stia usando un algoritmo . che richiede 10n2 operazioni fondamentali. Con 1 000 vertici . le operazioni risulterebbero allora essere in tutto 10 · 1 0002 = . . 10 000 000: dieci milioni di operazioni. Ma con due “mezzigrafi” di 500 vertici ciascuno otterremmo invece complessiva. . mente 2 · 10 · 5002 = 5 000 000, cioè cinque milioni di operazioni e dunque solo la metà delle operazioni precedenti. Ciò significa che nel secondo caso possiamo risolvere il problema con metà sforzo.» «Mmm. . . Dipende forse dall’elevamento al quadrato il fatto che due mezzi problemi sono meno dispendiosi di un problema intero?» «È proprio quello il motivo. Il divario diventa ancora più grande con esponenti maggiori. Questo calcolo però vale solo se il grafo viene diviso in due pezzi contenenti lo stesso numero di vertici, altrimenti si risparmia di meno.» «È chiaro: se il lato critico separa solo un vertice dagli altri, il risparmio è praticamente nullo.» «Ma non finisce qui! Esistono anche altre forme di preprocessing. Guarda ancora la mappa della metropolitana. Quando hai cercato il collegamento più breve tra Marienplatz ed Harras, era particolarmente importante per te la fermata Goetheplatz?» «No, perché lì non si ha alcuna possibilità di scelta. Solamente alla Implerstraße si può di nuovo prendere qualche decisione.»
Il lavoro che precede il lavoro
«Chiaro. Questo lato deve necessariamente essere contenuto in ogni cammino che dalla zona di sinistra della città porta alla zona di destra. Il tuo blocco del San Bernardino, tra Pasing e Laim, sarebbe una vera sciagura per i pendolari di Monaco. Ma due mezzi problemi non fanno esattamente un problema intero?»
122 Alla ricerca della via più breve «Giusto. Sono interessanti solo le fermate nelle quali si può decidere qualcosa. Per questo, ai fini del problema del cammino minimo, non fa alcuna differenza assegnare vertici distinti alla Goetheplatz e alla Poccistraße oppure dire semplicemente che da Sendlinger Tor alla Implerstraße ci sono in tutto tre fermate:»
Poccistraße Impler straße
Sendlinger Tor
Sendlinger Tor 3
Goetheplatz
Impler straße
«Sì, intendevo proprio dire questo.» «Se con questo criterio riduciamo l’intera rete della metropolitana, il numero totale di vertici passa già da 214 a 52. Ora tu sai che, in generale, nell’algoritmo di Dijkstra il tempo di esecuzione aumenta con il quadrato del numero di vertici. Poiché 214 è leggermente superiore al quadruplo di 52, con questa riduzione del numero dei vertici si può ottenere un’accelerazione di un fattore 16.»
123
5 4
7
9 8
7 2
2
3
9 4
11
4
3 5
2
5 Laim
Pasing
HBf
3 Marienplatz
2 3
3
10
2
3 2 3
3
2
3 Harras 6
10
10
2
3
4
2
5
6
10
5 10 9
3
«E cosa succede allora se in questa riduzione partenza o traguardo vanno perduti?» «In questo caso occorre reintrodurre i vertici corrispondenti. Su una simile divisione dei vertici in “importanti per principio” e “importanti in aggiunta per il particolare problema posto” si basano alcuni dei procedimenti usati nella pratica. Immagina di dividere il nostro problema di trovare uno dei percorsi più brevi per andare da Monaco ad Amburgo in tre parti: “trovare a Monaco il più breve collegamento dal luogo di partenza all’autostrada”, “determinare ad Amburgo il collegamento più breve dall’obiettivo finale fino all’autostrada” e “cercare il collegamento più breve dall’entrata autostradale di Monaco all’uscita di Amburgo, utilizzando esclusivamente l’autostrada”.» «Okay, nel tratto intermedio, pensando alla durata del viaggio, non vale la pena di lasciare l’autostrada.»
Il lavoro che precede il lavoro
2
124 Alla ricerca della via più breve
«Così facendo, servono ancora vertici solamente per gli incroci e gli svincoli autostradali sul nostro cammino dall’entrata all’uscita dell’autostrada.» «Ma se dobbiamo cercare solo il collegamento più breve da Marienplatz ad Harras, vale proprio la pena perdere tanto tempo con la tua analisi preliminare?» «Sì e no. Passare in rassegna tutti i lati del grafo, per vedere se sono critici per la connessione, oppure esaminare i vertici, per vedere se possono essere eliminati, è sicuramente un lavoro inutile, se si tratta di risolvere un solo problema di cammino minimo. In questo caso, con l’algoritmo di Dijkstra, probabilmente il problema sarebbe già risolto molto prima del termine delle operazioni di riduzione del grafo. Se però si devono risolvere tanti nuovi problemi di cammino minimo sullo stesso grafo, vale allora la pena di dedicare un po’ di tempo all’inizio, una volta per tutte, alla ricerca di queste strutture nel grafo ed immagazzinare le informazioni corrispondenti sui lati critici e sui vertici intermedi eliminabili. Dopo tutto, la cosa importante in un sistema di navigazione è che funzioni in frazioni di secondo durante il viaggio. Anche per ricevere le informazioni sui treni non vorresti stare lì ad aspettare tanto. Che poi per la produzione del software siano serviti uno o due giorni in più, è insignificante al confronto.» «Ma certo. Se un lavoro fatto una volta può essere riutilizzato in seguito, vale naturalmente molto di più la pena di farlo.» «Come vedi, con il preprocessig molto dipende dal particolare ambito di impiego. Ben dosato, esso può portare a risparmiare una quantità notevole di calcoli, ma presto può anche diventare superfluo.» «Oh, aspetta, suona il telefono.» Rut corse al telefono. Era Inga. Sarebbe andata con due amiche in piscina e chiedeva a Rut se voleva unirsi a loro. Rut esitò. Con Inga andava abbastanza d’accordo, ma quelle tre insieme avrebbero parlato tutto il pomeriggio di ragazzi. Tuttavia accettò. La sera sua madre avrebbe finito per chiederle come aveva passato il sabato e poteva così almeno risparmiarsi il commento che non
125
«Eccomi qua. Avevamo finito con l’analisi preliminare, vero?» «Già. Hai combinato un appuntamento?» «Sì. Inga mi ha chiesto se vado con lei in piscina.» «Beh, con un tempo così bello! Buon divertimento.» Il pomeriggio fu invece piuttosto noioso. Le altre tre ragazze parlarono quasi ininterrottamente dei loro gruppi musicali – maschili – preferiti. A Rut certo piaceva ascoltare la musica e trovava anche qualcuno di questi cantanti molto carino, ma dopo un po’ l’argomento le dava sui nervi. Per di più le altre non avevano mostrato la minima voglia di mettere i piedi in acqua. Così Rut aveva fatto per due volte alcune vasche da sola. Ad un certo punto aveva anche chiesto a Inga qualcosa sul navigatore nell’auto dei suoi genitori. Inga purtroppo non sapeva come funzionasse. Disse che i dati dovevano essere già tutti dentro all’apparecchio e che il programma doveva solo tirarli fuori. Non volendo trovarsi costretta a raccontare qualcosa di Vim, Rut decise di non insistere con le sue domande. Il commento caustico delle sue amiche – Ih, ih, ih, matematica nel tempo libero! – voleva evitarlo a tutti i costi. Quelle tre proprio non ne avevano idea.
Il lavoro che precede il lavoro
doveva starsene tutto il giorno seduta in camera sua. Ma perché non ci aveva pensato lei stessa quella mattina a colazione?
Per assurdo
Quando Rut tornò dalla piscina, i suoi genitori non erano ancora rincasati. Sicuramente, dopo la visita al museo, dovevano essersi trattenuti ancora per uno spuntino in qualche Biergarten. Con un tempo così bello, amavano fermarsi a bere un boccale di Radler. Birra con limonata! Non ci si immagina che si possa bere una cosa così, ma ai suoi genitori piaceva.
Biergarten presso la Torre Cinese all’Englischer Garten
Rut stese ad asciugare le sue cose bagnate, mise una pizza in forno e fece un po’ di zapping attraverso i programmi televisivi. Non essendoci niente di interessante, andò in camera sua e navigò in
128 Alla ricerca della via più breve
Internet. C’è davvero una quantità enorme di pagine eccezionali nella rete, pensò Rut. Perfino i CD del suo gruppo preferito era riuscita a trovare, completi di testi delle canzoni. Jan, nel suo computer, aveva una fantastica raccolta di MP3. Doveva domandargli assolutamente che software era necessario. In un attimo era anche riuscita a trovare il cartellone aggiornato dei film nelle sale della città e c’erano anche i collegamenti più adatti con i mezzi pubblici. Grazie ai cammini minimi, pensò. Rovistò ancora un poco nei nuovi bookmarks di Vim e rimase a lungo sulle pagine che parlavano del test di Turing. «Ciao Vim. Ho appena dato uno sguardo ai tuoi bookmarks su Turing. Non mi avevi detto che ogni anno c’è una gara per stabilire chi ha sviluppato il software più “intelligente”.» «Stavamo parlando d’altro e non volevo allontanarmi troppo dal nostro argomento. Ma hai ragione. Nel 1990 un sociologo . di New York di nome Hugh Loebner offrì 100 000 dollari e una medaglia d’oro per il primo programma che avesse superato il test di Turing. All’indirizzo www.loebner.net/Prizef/ loebner-prize.html puoi perfino vedere questa medaglia:»
«Ma non è mai stata assegnata, vero?» «Ogni anno una giuria decide se assegnare il premio, ma fino ad oggi nessun software è stato in grado di superare l’esame di Turing. Ogni anno, il miglior classificato tra i partecipanti ri. ceve comunque una medaglia di bronzo e 2 000 dollari di premio.»
129
«Sì, il test di Turing è definito più o meno così.» «Ma allora tu soddisfi questo criterio!» «Dici davvero? È un complimento molto carino da parte tua.» «Forse Vim vuol dire “Very Intelligent Machine”! . . . Però, a pensarci bene, non sono più così sicura che tu possa superare il test.» «Eh?» «Tu sai troppe cose! Gli esseri umani non possono sapere tutto. È una fortuna, comunque, che tu sappia tutte queste cose, altrimenti non potremmo intrattenerci così bene, io e te. Vuoi condividere un altro po’ delle tue conoscenze con me?» «Certo. Posso andare avanti con il discorso della Pianificazione degli itinerari e raccontarti che cos’è un albero.» «Mi stai prendendo in giro? Lo so che cos’è un albero, anche se vivo in città!» «Ma no, dico alberi di questo tipo:»
«Ah, di nuovo qualcosa che ha a che fare con i grafi!»
Per assurdo
«Se ho capito bene quello che ho letto, Turing definiva “intelligente” un programma quando non era possibile stabilire, attraverso semplici domande, se chi rispondeva era un computer o un interlocutore umano.»
130 Alla ricerca della via più breve
«Sì, alberi nei grafi. Un grafo non diretto, privo di circuiti e connesso è chiamato albero.»
Privo di circuiti ma non connesso
Connesso, ma non privo di circuiti
Albero
«Okay, il concetto di connessione me l’hai già spiegato con la faccenda del black-out di New York, ed abbiamo anche già fatto la conoscenza dei circuiti, finora principalmente di quelli negativi. Ma perché ci si riferisce ad un grafo connesso e privo di circuiti proprio con la parola albero?» «È facile dimostrare che in ogni grafo connesso e privo di circuiti il numero dei lati è sempre uguale a quello dei vertici meno uno.» «Cioè 4 lati con 5 vertici?» «Esatto. Se i vertici sono n, allora i lati sono n − 1. Essendoci più vertici che lati, devono per forza esistere almeno due vertici appartenenti ad un unico lato.» «A meno che il grafo non contenga un unico vertice!» «Obiezione accolta. Brava, non te lo sei lasciato sfuggire. Tuttavia questo caso è piuttosto privo di interesse. Se adesso ridisponiamo il grafo in modo che uno di questi vertici raggiunti da un unico lato stia in basso e tutti gli altri con la stessa proprietà in alto. . . »
131 g
h
h
d
f
g
c
e
f
a e b
c
b d
a
Radice
«. . . allora il grafo assomiglia al primo albero che hai disegnato.» «Lo si chiama albero perché continuamente si dirama. Il vertice alla base delle diramazioni viene anche detto tal volta radice ed i vertici alle estremità delle diramazioni foglie.» «E a cosa ci servono gli alberi?» «Gli alberi rivestono una grande importanza nella teoria dei grafi. Essi descrivono sia i più piccoli sottografi connessi – dato che l’eliminazione di uno qualsiasi dei suoi lati fa perdere all’albero la connessione –, sia i più grandi insiemi di lati privi di circuiti – e questo in virtù del fatto che ogni lato in più tra i vertici esistenti causerebbe inevitabilmente la formazione di un circuito –. A proposito, con l’algoritmo di Dijkstra tutto il tempo non abbiamo fatto altro che generare degli alberi.» «Come? Credevo che l’algoritmo di Dijkstra cercasse i cammini minimi.» «I cammini minimi da p a tutti gli altri vertici. Guardiamo ancora una volta il risultato finale dell’algoritmo di Dijkstra applicato alla versione “non diretta” del nostro vecchio esempio. Non noti nulla?»
Per assurdo
Foglie
132 Alla ricerca della via più breve
a 3 p 3 0
c 6
e 12
1 t 11 3
2
4 b 3
7 2 d
9 f
2
«È un albero! E questo non è un caso?» «No, deve essere necessariamente così. Siccome costruiamo cammini minimi da p a tutti gli altri vertici, il grafo che si origina deve essere per forza connesso. Inoltre ad ogni passo dell’algoritmo viene aggiunto esattamente un lato ed un solo vertice viene colorato per la prima volta di rosso. Ne segue che non potrà mai formarsi un circuito. Con pesi positivi non ha nemmeno senso percorrere un circuito.» «Capisco: i cammini minimi sono sempre privi di circuiti e formano un grafo connesso, cioè un albero.» «Addirittura un albero generatore, perché le sue ramificazioni raggiungono tutti i vertici del grafo, “generando” l’intero insieme V.» «E a che cosa serve tutto ciò? C’è una qualche applicazione pratica di questi alberi generatori?» «Parecchie! Immagina che il nostro grafo rappresenti una rete di fibre ottiche, come quella della Telecom tedesca. All’indirizzo www.mfg.de/netzatlas/na_kap04/na_041nai_411 .html c’è un’immagine della struttura di una simile rete per la regione del Baden-Württemberg, una delle 16 divisioni amministrative che formano la Repubblica Federale Tedesca.»
133 Per assurdo
Fonte: Deutsche Telekom AG
«Okay, e allora?» «I vertici rappresentano qui diversi centri di derivazione e i lati sono le linee esistenti che li collegano tra loro. Ora immagina che la ditta A – ad esempio la Telecom tedesca – affitti le sue linee alla ditta B – ad esempio Vodafone – e che quest’ultima ne voglia affittare un numero sufficiente affinché tutti i centri di derivazione siano connessi tra loro. Questo significa che il sottografo delle linee affittate deve essere connesso. D’altro canto, la ditta B non vorrà certo sperperare denaro inutilmente. Se lasciamo da parte, ad esempio, la questione dell’affidabilità della rete e cioè il tutelarsi in caso di incidenti che provochino la perdita di un collegamento, la ditta B non prenderà in affitto più linee del necessario. Il sottografo affittato sarà dunque privo di circuiti.» «Certo! Altrimenti si potrebbe eliminare un lato del circuito ed il grafo resterebbe ancora connesso.» «Giusto. Quindi il sottografo affittato è un albero.» «Ma non è piuttosto irrealistico pensare di trascurare la questione dell’affidabilità?»
134 Alla ricerca della via più breve
«Dipende. Essendo la ditta B ad affittare le linee della ditta A, si può pensare che, nel contratto, la ditta A si assuma anche la responsabilità di mettere a disposizione una linea alternativa nel caso che una delle linee affittate salti. Con un simile contratto alle spalle, la ditta B non si preoccuperebbe più dell’affidabilità della rete.» «Capisco.» «Se scrivessimo i costi di affitto di ogni singola linea sui lati corrispondenti del grafo come pesi, la nostra ditta B cercherebbe di fare la scelta delle linee nel modo più economico possibile. La ditta B andrebbe cioè alla ricerca, nel grafo, di un albero generatore di peso complessivo minimo, cioè di un minimo albero generatore.» «Intendi dire un albero che collega tutti i vertici e consente l’affitto complessivo più basso?» «Esattamente. Questo problema viene chiamato problema dell’albero generatore.» «E siccome l’algoritmo di Dijkstra costruisce sempre un albero i cui “rami” sono cammini minimi, esso risolve anche il problema dell’albero generatore.» «Sarebbe bello! Dai ancora un’occhiata al nostro vecchio grafo e all’albero dei cammini minimi generato dall’algoritmo di Dijkstra scegliendo p come vertice di partenza:»
p 3 0 5
a 10 3 11 1
c 7 6 12 2
e 12 2 11 t 11 3
2
4 3 b
7 2 d
9 f
2
«Il costo dell’affitto di questi lati sarebbe complessivamente di 16.»
135
a
p 3
1
10 11
c 2
e
7 12
2 11 t
5
3
2 b
3
d
2
2 f
«Ma il cammino da p a d è in compenso diventato più lungo di un’unità.» «È vero, ma nel problema dell’albero generatore ciò non importa più. Si può comunque riuscire a spendere ancora meno di 15 unità.» «Aspetta, ora lo vedo anch’io. Possiamo ancora sostituire al lato tra f ed e quello tra e e t.»
«Molto bene! Essendoci accaparrati tutti i lati con costo 1 o 2, ogni altra soluzione comporterebbe, rispetto alla nostra, lo scambio di un lato dal costo di almeno 3 unità con un lato che ne costa al massimo 3. Dunque abbiamo trovato un albero generatore di peso minimo. Si tratta perfino dell’unico esistente.»
Per assurdo
«Giusto, ma si può fare di meglio: se sostituiamo al lato che collega b e d quello tra c e d, otteniamo un albero generatore con un costo complessivo di sole 15 unità.»
136 Alla ricerca della via più breve
«Poiché in esso il cammino da p a t, a causa della deviazione b − c − d, ha adesso lunghezza 12 – e non più 11, come accadeva nel cammino minimo da p a t – non si tratta più di un albero dei cammini minimi.» «Ferma, non così in fretta. Il minimo albero generatore potrebbe ancora essere l’albero dei cammini minimi dello stesso grafo rispetto ad un altro vertice di partenza.» «Vuoi dire facendo partire l’algoritmo di Dijkstra da qualche altra parte e non più da p? Da sola non ci sarei mai arrivata! Qual è allora il vertice giusto?» «Non ce n’è!» «Come sarebbe a dire non ce n’è? Volevi trarmi in inganno! Non lo trovo per niente divertente!» «No, volevo solo farti notare che la tua motivazione non è sufficiente. Essa dimostra solo che non funziona con il vertice p.» «E adesso? Dobbiamo davvero cacciar dentro all’algoritmo di Dijkstra ciascuno degli otto vertici per dimostrare che non si ottiene mai un albero di peso minimo?» «No, niente paura. Non ci interessano tutti gli alberi dei cammini minimi. In effetti vogliamo solo dimostrare che il nostro albero generatore di peso minimo non può essere uno di quelli. Per farlo, allora, assumiamo semplicemente il contrario, e cioè che invece lo sia. Facciamo quindi inizialmente finta che il nostro minimo albero generatore sia proprio l’albero dei cammini minimi a partire da un qualche vertice e mostriamo poi che ciò non può proprio essere.» «Come dire, la prima cosa che a tutti verrebbe in mente di fare! Ma che razza di complicazione è questa?» «È molto più rapido che non calcolare tutti gli alberi dei cammini minimi e controllare che nessuno corrisponde al nostro minimo albero generatore. Ammettere in un primo momento il contrario di ciò che si vuole dimostrare e poi concludere che questo non può essere, è uno stratagemma usato frequentemente in matematica. Lo si chiama dimostrazione per assurdo oppure anche dimostrazione indiretta o per contraddizione.»
137 «Sembra un po’ contorto, ma vai pure avanti.»
p 3 5 5
a 10 1 11 1
c 7 2 12 2
e 2 11 t
3
2
Partenza: b 3
2
3 2 d
f
«Aspetta un attimo. Se l’algoritmo di Dijkstra dovesse partire da b, colorerebbe inizialmente a di rosso, perché a ha la più piccola distanza. Successivamente toccherebbe a c e poi a d. L’albero dei cammini minimi conterrebbe allora di nuovo il lato da b a d, che non fa parte del nostro minimo albero generatore.» «Esatto. Questo lato non appartiene ad alcun minimo albero generatore, perché il nostro è in fondo l’unico. La stessa cosa varrebbe anche per p ed a scelti come vertici di partenza. In tutti e tre i casi, l’albero dei cammini minimi conterrebbe il lato da b a d.» a
p 3
1
10 11
c 2
e
7 12
2 11 t
5
3
2 b
3
2
2 d
f
Per assurdo
«Effettivamente adesso vogliamo dimostrare che nessun albero dei cammini minimi, non importa da quale vertice si parta, coincide con il minimo albero generatore. Volendolo dimostrare per assurdo, partiamo dal contrario. Ammettiamo cioè che il nostro albero generatore di peso minimo sia l’albero dei cammini minimi a partire da qualche vertice. Il vertice b potrebbe allora essere questo vertice di partenza?»
138 Alla ricerca della via più breve
«Capisco. Rimangono tuttavia ancora altre cinque possibilità di scegliere il vertice di partenza.» «Non per molto! Anche d, e, f e t non possono essere vertici di partenza di un albero dei cammini minimi, se questo deve anche essere allo stesso tempo il minimo albero generatore; infatti in questo caso il cammino più breve che porta da questi vertici a b passa per il lato da d a b.» «E va bene. Allora resta solo c come possibile vertice di partenza.» «Nemmeno c può esserlo, perché i cammini minimi che vanno da c ad e sono due: il primo utilizza direttamente il lato da c ad e ed il secondo il lato da f ad e. Entrambi questi lati non fanno però parte del nostro minimo albero generatore.» a
p 3
1
10 11
c 2
e
7 12
2 11 t
5
3
2 b 3
d
2
2 f
«Dunque proprio nessun vertice può essere il vertice di partenza.» «Esatto. Ciò contraddice però la nostra supposizione iniziale che il minimo albero generatore fosse l’albero dei cammini a partire da uno dei vertici.» «Ho capito; per questo la si chiama “dimostrazione per contraddizione”. Per niente stupido, questo metodo. Vediamo cosa diranno i miei genitori quando la prossima volta risponderò alla loro osservazione “Non contraddirci sempre!” dicendo che in matematica la contraddizione è molto importante.» «Mi racconterai allora come avranno reagito. A proposito, se dovessimo davvero costruire tutti gli alberi dei cammini minimi a partire da ciascuno dei vertici del grafo, daremmo la
139
«L’algoritmo di Floyd-Warshall, allora, non solo è migliore con grafi aventi pesi negativi. Oh, aspetta, suona di nuovo il telefono!»
Per assurdo
preferenza all’algoritmo di Floyd-Warshall. Questo, infatti, fornisce automaticamente cammini minimi da ciascun vertice ad ognuno degli altri. Non è nemmeno più lento dell’algoritmo di Dijkstra, se dobbiamo far ripartire quest’ultimo per ogni vertice del grafo.»
Il Prim della classe
Era la mamma, al telefono. Voleva solo dire che oggi, in città, con sua grande sorpresa, aveva incontrato una vecchia amica di Milano e che avrebbero perciò fatto un po’ tardi. La mamma sapeva che Teresa – questo era il suo nome – aveva sposato un tedesco, ma in seguito avevano perso i contatti e quella era la prima volta che si rivedevano dopo tanto tempo. La gioia di rivedersi era così grande che adesso i suoi genitori si erano fermati con Teresa in un caffè. «Eccomi, sono ancora qui. Riesco a stare un altro po’ con te. Allora, che facciamo con il problema dell’albero generatore?» «Ci basta apportare una minima modifica all’algoritmo di Dijkstra!» «Veramente?» «Possiamo perfino scegliere a piacimento il vertice dal quale partire. Procediamo poi assegnando agli altri vertici un valore della distanza pari al peso del lato che li collega direttamente al vertice di partenza. . . » «. . . e scegliamo di nuovo il vertice con la distanza minore?» «Sì, fin qui non c’è alcuna differenza rispetto all’algoritmo di Dijkstra. Se prendiamo ancora una volta il nostro vecchio grafo e scegliamo p come vertice di partenza, la situazione è questa:»
142 Alla ricerca della via più breve
p 3
a 10 3 11 1
c 2
e
7 12
2 11 t
5
3
2
5 3 b
d
2
2
f
«Ma non si va sempre avanti così, vero?»
«All’inizio sì. Dopo p, il primo vertice che viene colorato è a, perché a possiede la più piccola distanza tra tutti i vertici non ancora colorati. Ora però cambia l’update, cioè l’aggiornamento delle distanze dei vertici rimanenti. Nell’algoritmo di Dijkstra dovevamo per prima cosa guardare se, passando per a, era possibile raggiungere più rapidamente qualcuno dei vertici a cui prima si arrivava direttamente da p. Adesso però non ci importa più la distanza da p, ma la distanza da uno qualsiasi dei vertici già colorati, in questo caso p oppure a. Dunque il vertice b ottiene questa volta un valore della distanza uguale a 1 e non più il valore 4, come succedeva prima. Lo stesso discorso vale per c e d. Le figure seguenti mettono a confronto le fasi del nuovo algoritmo, in alto, con quelle corrispondenti dell’algoritmo di Dijkstra, in basso, così puoi notare meglio le differenze.» a
s 3
1
10 11
c 7 10 12 2
e 2 11 z
5
3
2
1 3 b
11 2 d
2 f
143
p 3 0 5
1
c 7 13 12 2
e 2 11 t
11 3
2 4 3 b
2
14 2 d
f
«All’infuori dell’update, non è cambiato niente?» «Assolutamente nulla! Siccome b ha il minimo valore della distanza, lo coloriamo come al solito di rosso e riprendiamo l’update. A questo punto ci rendiamo conto che i vertici c e d si raggiungono più facilmente da b e correggiamo conseguentemente i valori delle loro distanze.» a
p 3
10
1
c 7 2 12 2
e 2 11 t
11 3
2 b
3
a 10 3 p 3 0
1
2
3 2 d c 7 6 12 2
f e 2 11 t
11 3
2
4 3 b
7 2 d
2 f
Il Prim della classe
a 10 3
144 Alla ricerca della via più breve
«Adesso ho capito la differenza. A noi interessa solo la lunghezza dei singoli lati e non più quella di tutto il cammino che parte da p. Per questo nell’update non ci riferiamo più alla distanza da p, ma alla distanza da uno qualsiasi dei vertici già colorati.» «Precisamente. Perché non provi a fare tu il prossimo passo?» «Volentieri. Coloriamo per prima cosa c e guardiamo se i suoi lati hanno pesi minori dei valori segnati nei vertici raggiunti. Ciò è vero naturalmente per e ed f , visto che li abbiamo raggiunti adesso per la prima volta in assoluto, ma anche la distanza di d deve essere aggiornata. Il lato tra c e d ha infatti peso 2, mentre la vecchia distanza di d era 3.» a
p 3
c 2
1
e 7
7 12
t
3
2 b
3
a 3 p 3 0
2
11
1
2 2 d
12 2 f
c 7 6 12 2
e 13 2 11 t
3
2 4 3 b
7 2 d
18 2 f
«Magnifico! Si può vedere così che al prossimo passo l’algoritmo raggiungerà il vertice d attraverso il lato che parte da c. Nel problema del cammino minimo, al contrario, il collegamento
145
c
a
p 3
2
1
e 7
7 12
t
3
2
p 3 0
2
11
b
d
a 3
c 7 6 12
1
2 f
2
2
e 13 2 11 t
3
2 4 b
3
7 2 d
9 f
2
«Ah sì, siamo proprio al punto in cui prima abbiamo constatato che il minimo albero generatore e l’albero dei cammini minimi erano diversi tra loro.» «Allora è tutto chiaro?» «Direi di sì.» «Benissimo. Il resto del procedimento sei perfettamente in grado di portarlo a termine tu da sola. Adesso ti voglio invece mostrare come si scrive l’algoritmo. I cambiamenti rispetto all’algoritmo di Dijkstra sono stati di nuovo messi in evidenza con il colore rosso.»
Il Prim della classe
migliore era quello che sfruttava il lato da b a d, come si può vedere dal confronto con il disegno sottostante.»
146 Algoritmo di Prim
Alla ricerca della via più breve
Input: un grafo pesato G = (V, E) Output: un minimo albero generatore del grafo G BEGIN R ← {p}, Distanza(p) ← 0 FOR ALL v in V \ {p} DO Distanza(v) ← Lunghezza(p, v) Antecedente(v) ← p END FOR WHILE R = V DO trova v∗ in V \ R tale che Distanza(v∗ ) = min{Distanza(v) : v in V \ R} R ← R ∪ {v∗ } FOR ALL v in V \ R DO IF Lunghezza(v∗ , v) < Distanza(v) THEN Distanza(v) ← Lunghezza(v∗ , v) Antecedente(v) ← v∗ END IF END FOR END WHILE END
«Le differenze sono davvero pochissime; cambia solo l’aggiornamento dei valori delle distanze dei vertici, proprio come avevi detto tu.» «Così sappiamo anche che il tempo di esecuzione dell’algoritmo di Prim è simile a quello dell’algoritmo di Dijkstra.» «Prim è il nome dell’inventore dell’algoritmo?» «Sì, l’autore dell’algoritmo è Robert C. Prim.» «Abbiamo finito allora con il problema del minimo albero generatore?» «Non del tutto.» «Già, avrei dovuto immaginarlo. Che cosa manca ancora?» «Quando abbiamo introdotto l’algoritmo di Dijkstra e ne abbiamo discusso il procedimento, abbiamo fornito le ragioni
147
«Sì, per ogni vertice colorato potevamo stare certi che non esistesse un cammino più breve per raggiungerlo, di quello che stavamo costruendo.» «Giusto. In questo ci hanno aiutato le distanze scritte nei vertici. Esse rappresentavano un po’ la “memoria” dell’algoritmo di Dijkstra.» «Anche nell’algoritmo di Prim abbiamo queste distanze e scegliamo sempre un vertice con il valore più piccolo.» «Sì, ma potrebbe darsi che questa scelta locale, fatta ignorando il resto del grafo, ci precluda in futuro l’accesso a lati aventi magari pesi migliori.» «Non vorrai mica dirmi che l’algoritmo non funziona correttamente, eh?» «No, tuttavia abbiamo bisogno di un argomento migliore per sostenere la sua correttezza. Per fare ciò, dovremmo sviluppare una vera e propria dimostrazione matematica, preferibilmente una dimostrazione per assurdo.» «Puah! E pensi che io sia in grado di capirla? Quando il signor Liste pronuncia la parola “dimostrazione”, la faccenda diventa sempre irrimediabilmente complicata!» «Okay, il più delle volte le dimostrazioni non sono proprio facilissime. Esse tuttavia sono indispensabili quando vogliamo essere davvero sicuri che una certa cosa vada bene.» «Allora sotto!» «Nelle dimostrazioni per assurdo, come ormai sai, procediamo esattamente dalla negazione di quello che effettivamente vogliamo dimostrare. Ammettiamo allora che ci sia un grafo per il quale l’algoritmo di Prim costruisca un albero generatore che non abbia peso minimo. Ad un certo punto l’algoritmo deve dunque aver fatto per la prima volta un errore. Intendo dire che esso prima o poi deve aver scelto un lato tale che l’albero costruito fino a quel punto non può più essere completato in un minimo albero generatore.»
Il Prim della classe
del perché esso produca sempre un cammino minimo da p a t.»
148 Alla ricerca della via più breve
«Vuoi dire che facciamo correre l’algoritmo finché non sceglie il primo lato sbagliato?» «Precisamente. Siccome poi l’algoritmo seleziona sempre un lato che collega un vertice rosso ad un vertice non colorato, questo lato “sbagliato” deve avere una estremità in R ed una in V \R. Chiamiamo v e w le estremità del nostro lato sbagliato, con v che sta in R e w in V \ S.» «Perché non li chiamiamo invece Ubaldo ed Elvira?» «Se ti piace di più. . . »
v
R
w
V\R
«Ma no, stavo solo scherzando! v e w vanno benissimo.» «Ti ho abbozzato qui la situazione con uno schizzo:» «Un momento! Qui c’è solo il lato “sbagliato”. Che fine ha fatto il resto del grafo? E cosa vogliono dire le due linee curve tratteggiate?» «Il resto del grafo l’ho lasciato da parte. A noi importa solo che v appartenga all’insieme dei vertici già colorati e w a quello dei vertici ancora da colorare. Che poi ci siano da entrambe le parti una gran quantità di altri vertici, era proprio quello che volevo simboleggiare con i due archi di cerchio tratteggiati. L’arco rosso “delimita” i vertici rossi e quello nero i vertici non colorati.» «Non volevi dire nient’altro con quello schizzo? Allora rappresenta solamente quello che avevamo già detto prima.» «Giusto. Lo schizzo vuole aiutarti a visualizzalo meglio. Avevamo ipotizzato che il lato da v a w fosse il primo lato “sbagliato”. Questo significa anche che tutti gli altri lati scelti dall’algoritmo fin qui erano “giusti”. Il sotto-grafo alla sinistra del nostro
149
v
R
w
V\R
«Perché hai disegnato i vertici più in piccolo ed i lati li hai solo tratteggiati? E perché certi lati non finiscono con un vertice?» «Per indicare che il sotto-grafo dei lati “giusti” non deve necessariamente apparire così. Ho solo voluto dare un’idea vaga di come potrebbe essere. Noi abbiamo solo ammesso che ci sia un grafo per il quale l’algoritmo fallisce, ma non ne conosciamo alcuno.» «Altrimenti avremmo già una dimostrazione che l’algoritmo di Prim può sbagliare. . . » «. . . e vogliamo invece proprio dimostrare per assurdo che non è così. Poiché dunque non conosciamo il controesempio del quale stiamo ammettendo l’esistenza, non dobbiamo rappresentarci questa parte del grafo in modo troppo preciso e concreto.» «Vuoi dire allora che ti limiti solamente ad abbozzare la parte del minimo albero generatore trovata dall’algoritmo fin qui perché non sai che aspetto possa avere il sotto-grafo dei vertici rossi?» «Precisamente. Il fatto che i lati scelti da questa parte fossero “giusti” significa che è ancora possibile completare questo sotto-grafo formando un albero generatore di peso minimo. Se però adesso aggiungiamo il lato da v a w. . . »
Il Prim della classe
schizzo, quello con i vertici rossi, deve dunque appartenere ad un minimo albero generatore del grafo.»
150 Alla ricerca della via più breve
«. . . questo non vale più, perché questo lato era il primo lato “sbagliato”.» «Esatto. Avendo ammesso che l’algoritmo di Prim, con la scelta del lato da v a w, commette il suo primo errore, questo lato non può più appartenere a nessuno degli alberi generatori minimali che contengono anche tutti gli altri lati scelti dall’algoritmo fin qui prima di fare il primo errore.» «L’algoritmo avrebbe dovuto cioè scegliere un altro lato, al posto di quello da v a w.» «Giusto. Avrebbe dovuto scegliere un lato da R a V \ R che appartenesse ad un minimo albero generatore contenente anche gli altri lati scelti fin qui.» «Ironia della sorte, non conosciamo alcun albero simile, se l’algoritmo non funziona correttamente.» «Non ci serve neppure conoscerlo. Per la nostra argomentazione è sufficiente che ci sia un albero generatore con questa proprietà. Nel nostro schizzo, questo albero generatore di peso minimo potrebbe apparire circa così:»
R
v
w
x
y
V\R
«L’algoritmo avrebbe dovuto scegliere allora il lato da x a y.» «Esattamente. Essendo il nostro minimo albero generatore connesso, esso deve contenere almeno un lato che collega tra loro un vertice di R con un vertice di V \ R. I suoi estremi li ho semplicemente chiamati x e y.» «E adesso?»
151
«Ma così c’è un lato di troppo.» «Sì, viene a crearsi esattamente un circuito. Un po’ “stilizzato”, esso apparirebbe così:»
v
w
x
y
R
V\R
«Ben schiacciato, il tuo circuito.» «Vedi cosa succede se adesso rimuoviamo il lato tra x e y?» «Rompiamo di nuovo il cerchio.» «Hai ragione. Il tutto rimane però connesso.» «Dunque è ancora un albero generatore, non è vero?» «Verissimo. Abbiamo allora costruito un nuovo albero generatore e lo abbiamo fatto rimpiazzando semplicemente il lato da x a y con quello da v a w.» «A che pro?» «Siccome l’algoritmo sceglie sempre un vertice con il valore della distanza più piccolo tra quelli in V \ R per colorarlo, allora y non può avere un valore minore di quello di w. Dunque il lato “giusto” che abbiamo rimosso non è più corto di quello “sbagliato” da v a w. Ma allora il nuovo albero generatore non può essere in nessun caso peggiore di quello con il lato “giusto” da x a y, poiché questi due alberi differiscono solo per quest’unico lato.»
Il Prim della classe
«Adesso aggiungiamo al minimo albero generatore “giusto” il lato “sbagliato” da v a w, scelto dal nostro algoritmo.»
152 Alla ricerca della via più breve
«Certo. Se il minimo albero generatore fosse migliore, il lato tra x e y sarebbe più corto di quello tra v e w, ma allora l’algoritmo di Prim avrebbe scelto il primo e non il secondo, come invece ha fatto.» «D’altra parte, il nuovo albero generatore ottenuto con la sostituzione del lato non può nemmeno essere migliore del minimo albero generatore, altrimenti quest’ultimo non sarebbe mai stato il minimo albero generatore.» «Allora entrambi gli alberi sono ugualmente buoni!» «Conclusione che ci porta, comunque, ad una contraddizione, perché avevamo ammesso che l’algoritmo, con la scelta del lato da v a w, commettesse un errore.» «Ma allora la scelta era giusta! L’algoritmo non potrebbe però fare ancora un errore in seguito?» «No. Avevamo fatto l’ipotesi che l’algoritmo, con la scelta del lato da v a w facesse un primo errore. Ciò ha condotto ad una contraddizione. Dunque l’algoritmo non può fare un primo errore. . . » «. . . e se non può fare un primo errore, non ne può fare nessuno. Deve dunque essere corretto. Davvero argute, queste dimostrazioni per assurdo!» «Non è stata poi così dura, no?» «Io sono alla frutta!» «Hai ragione. Questa dimostrazione non si può dire triviale.» «Ehi, aspetta un po’! Che cosa vuol dire esattamente questo “triviale”? Mio padre lo usa sempre quando qualcosa per lui è facile.» «È una parola amata da molti matematici. “Triviale” deriva da “trivium”, che si compone di “tres, tria” e “via”: una biforcazione o un incrocio di strade; “triviale” significa allora “che si trova nei crocicchi”, dunque indica qualcosa di quotidiano, comune, volgare.» «“Triviale” vuol dire poco importante?»
153
«. . . il tedesco, ad esempio! È meglio che non lo racconti alla mia insegnante!» «Stando con i matematici si ha a volte l’impressione che al mondo ci siano solamente due tipi di problemi: quelli “triviali” e quelli “ancora irrisolti”. Triviale diventa allora ciò che finalmente si è capito.» «La tua dimostrazione per assurdo è allora triviale, perché io l’ho capita. Almeno credo.» «Bene, allora per oggi basta!» «D’accordissimo. A domani.» Rut aveva completamente dimenticato il proposito di smettere prima dell’arrivo dei suoi genitori. Per fortuna Vim l’aveva fermata in tempo: si era appena stesa sul divano in soggiorno davanti alla televisione quando sua madre e suo padre aprirono la porta di casa. La tattica di Rut funzionò. I suoi raccontarono ancora un poco del loro sorprendente incontro con Teresa e poi domandarono come Rut avesse passato la giornata. A sua volta Rut riferì in modo esauriente del pomeriggio in piscina e disse che la sera aveva guardato un po’ la televisione. Menzionò anche il computer, ma solo di sfuggita. Suo padre, a quel punto, volle sapere con precisione come lei se la stesse cavando con quel calcolatore. Non ci furono comunque pericoli per Vim e sua madre non fece neppure la sua predica preferita su Rut e il computer. Il resto della serata lo passarono insieme davanti al televisore, guardando uno sceneggiato giallo. La cosa buffa era che in Italia avevano sempre seguito quella serie, naturalmente con il doppiaggio in italiano. Al timbro originale della voce dei protagonisti
Il Prim della classe
«Secondo il dizionario Duden delle parole straniere tedesche, “triviale” oggi significa “concettualmente insignificante”, “non originale”, “banale”. Nel medioevo, a proposito, le “arti degne di un uomo libero” venivano suddivise nel Trivium e nel Quadrivium. Il Trivium conteneva le arti oratorie: Grammatica, Retorica e Dialettica, mentre il Quadrivium conteneva le arti che interessavano il calcolo: Aritmetica, Geometria, Astronomia e Musica. “Triviale” era allora. . . »
154 Alla ricerca della via più breve
dovettero perciò, in un primo momento, abituarsi. Al termine del programma, suo padre e sua madre andarono subito a dormire: il giorno dopo, infatti, si sarebbero alzati presto per l’escursione in montagna. Il magnifico panorama alpino “nel giardino di casa” – come amava esprimersi suo padre al telefono con gli amici in Italia – li aveva conquistati.
Nel giro di pochi minuti, anche Rut si ritirò in camera sua. A letto, mille pensieri continuarono ad occuparle la testa. Pensò a Jan e al fatto che fosse un vero peccato che lui questo fine settimana fosse via. Con lui, sicuramente, il pomeriggio in piscina non sarebbe stato così noioso.
` che puoi Arraffa cio
Domenica mattina! A Rut piaceva immensamente non doversi alzare subito da letto. Rimase a leggere un pochino sotto le lenzuola e poi rifletté su cosa avrebbe potuto fare di bello quel giorno. Le venne di nuovo in mente l’algoritmo di Prim. Effettivamente, l’idea che sta dietro a questo procedimento è piuttosto semplice, pensò Rut e l’attimo dopo era già seduta al computer. «Ciao Rut, hai già fatto colazione?» «Non ancora, ma mi è appena venuta in mente una cosa.» «E sarebbe?» «Si tratta sempre dell’algoritmo di Prim. Ad ogni passo si aggiunge il lato più economico che è permesso scegliere in quel momento. Non è in fondo una strategia piuttosto evidente?» «Sì, procedimenti di questo tipo vengono detti algoritmi greedy.» «Greedy?» «È una parola inglese e vuol dire “ingordo”, “avido”. Procedere avidamente, scegliendo sempre la migliore delle alternative a disposizione è una delle prime cose che viene in mente di fare in quasi tutti i problemi. Purtroppo solo raramente porta ad una soluzione ottimale. Come abbiamo visto, nel determinare i cammini minimi non ha senso scegliere sempre la “stazione” a noi più vicina.» «Con il minimo albero generatore, però, funziona!»
156 Alla ricerca della via più breve
«Sì, nel caso degli alberi generatori di peso minimo si può essere ancora più ingordi di quanto già non lo sia l’algoritmo di Prim.» «Ancora più ingordi? Ma se ci accaparriamo sempre il lato migliore!» «Scegliamo un lato con il costo minimo tra quelli che escono dai vertici marcati, dopo averne scelto uno, all’inizio, dal quale partire. Tutto ciò, a dire il vero, non è necessario. Potremmo risolvere il problema dell’albero generatore scegliendo un lato con il minimo costo possibile in tutto il grafo e poi prendendo il successivo lato più economico e via di seguito. Dobbiamo solo stare attenti che, così facendo, non si formino dei circuiti.» «E questo funziona? I singoli lati possono essere anche lontanissimi tra loro! Come può formarsi un albero? Gli alberi devono essere connessi.» «Non c’è problema! Proviamo con un nuovo grafo. Che ne dici di questo:»
8
4
7
13
11 14
17
12
5
12
6
9
6
5
2
6
1
10
2
«Per me va benissimo. Proviamo. Il lato migliore è quello con peso 1.»
157
8
4
7
13
11 14
17
12
12
6
6 9
6
5
2
5
1
10
2
«Okay. Per così dire, come natura crea. I prossimi lati da scegliere sono quelli con costo 2.» «Attenta, sempre uno alla volta. Dobbiamo fare attenzione che non si formino dei circuiti. Tuttavia non importa quale dei due scegliamo per primo. Ho preso qui quello orizzontale:» 8
4
7
13
11 14
17
12
5
12
6
9
6
5
2
6
1
10
2
«Capisco. Non possiamo più prendere il secondo lato con costo 2 perché si formerebbe un circuito.»
Arraffa ciò che puoi
«Bene. Siccome adesso ci interessano i lati, saranno loro – e non i vertici – a venir colorati man mano che li scegliamo. Propongo il verde. Almeno uno dei nostri alberi dovrebbe pure essere verde, no?»
158 Alla ricerca della via più breve
«Precisamente. Questo lato cancelliamolo del tutto dal grafo, così è chiaro che non verrà più preso in considerazione. Il prossimo è il lato con il 4, in alto a sinistra.» 8
7
13
11
4
14
6 9
6
12
17
12
6
5
10
1
5
2
«Adesso però abbiamo perso la connessione con il resto dei lati verdi.» «Vedrai subito che non è un problema. Andiamo semplicemente avanti. Hai capito come funziona, no?» «È logico! Ora tocca ai due lati con il 5, uno dopo l’altro, visto che dobbiamo stare attenti ai circuiti. Stavolta non succede niente e possiamo prenderli tutti e due.» 8
4
11
7
13
17
12
5
12
6
14
8
1
2
4 9
6
5
6
10
7
13
11 14
17
12
5
12
6
9
6
1
5
6
10
2
«Bene. Procedo con i passi che restano per completare la costruzione dell’albero generatore. Se qualcosa non ti è chiaro, ti prego di dirmelo.»
159 Arraffa ciò che puoi «Tutto chiaro! La connessione non sembra essere un problema, perché i singoli pezzi crescono da soli fino ad incontrarsi. Riesce sempre?»
«Sì, se il grafo di partenza è connesso. Poiché evitiamo accuratamente i circuiti, in n − 1 passi abbiamo costruito un albero generatore, se il grafo iniziale ha n vertici.»
«Hai ragione. Qui avevamo in tutto 10 vertici ed abbiamo finito dopo 9 passi.»
«Questa variante “ingorda” dell’algoritmo di Prim è nota come l’algoritmo di Kruskal, ancora una volta dal nome del suo autore. All’indirizzo www.math.sfu.ca/˜goddyn/Courseware/ Visual_Matching.html c’è un applet Java, cioè un programma eseguibile in Internet, che genera dei bellissimi disegni proprio con l’algoritmo di Kruskal:»
160 Alla ricerca della via più breve «Artisticamente parlando, non è male. Ma cosa c’entra questo disegno con l’algoritmo?» «Beh, i vertici del grafo li vedi: sono i centri dei cerchi colorati. In questo applet si parte dal presupposto che tra ogni coppia di vertici ci sia un lato, tuttavia non tutti i lati del grafo di partenza sono disegnati esplicitamente, per non appesantire troppo il disegno. Il peso di ogni lato, inoltre, è semplicemente la distanza in linea d’aria tra i suoi due vertici. I cerchi colorati “crescono” attorno ai vertici – il loro raggio aumenta progressivamente – e, toccandosi, determinano i collegamenti più brevi; questi ultimi sono i soli lati disegnati dall’applicazione e formano l’albero cercato.» «Molto bello. Una cosa, però, devi spiegarmela: a che scopo fare tanta matematica quando, alla fine dei conti, gli algoritmi sono così facili? All’idea di prendere sempre il migliore a disposizione sono capaci di arrivarci tutti.» «Hai ragione, ma guarda un po’ questo:»
161 Algoritmo greedy e Matroidi
I ∈ ∧ J ⊂ I =⇒ J ∈ . Gli elementi di si dicono insiemi indipendenti. Ogni insieme indipendente di , massimale rispetto all’inclusione, si dice base. Se inoltre vale Ip , Ip+1 ∈ ∧ |Ip | = p ∧ |Ip+1 | = p + 1 =⇒ ∃e ∈ Ip+1 \ Ip : Ip ∪ {e} ∈ , allora la coppia (E, ) viene detta matroide. Osservazione Se (E, ) è un matroide, allora tutte le basi di hanno lo stesso numero di elementi. Teorema Sia (E, ) un sistema di indipendenza. (E, ) è allora un matroide se e soltanto se l’algoritmo greedy, per ogni c : E → [0, ∞[, trova una base di peso minimo rispetto a c.
«Caspita! E dovrei capirlo?» «No, volevo solo aprirti un squarcio sul tipo di cose che si possono incontrare in matematica. Ciò che qui viene chiamato matroide non è altro che una struttura generale, astratta, posseduta anche dall’insieme di tutti gli alberi di un grafo. Per una struttura di questo tipo, il teorema finale afferma che l’algoritmo greedy fornisce sempre la soluzione ottimale, indipendentemente dai pesi assegnati concretamente ai lati. Ma la vera attrazione è che vale anche il contrario. Si dimostra cioè che il problema dato deve necessariamente avere la struttura di matroide se l’algoritmo greedy fornisce la soluzione ottimale per ogni pensabile combinazione di pesi.»
Arraffa ciò che puoi
Definizione Siano E un insieme finito e un insieme non vuoto di sottoinsiemi di E. La coppia (E, ) è detta un sistema di indipendenza, quando è chiuso rispetto all’inclusione, cioè quando vale:
162 «Perché una attrazione?» Alla ricerca della via più breve
«La cosa straordinaria qui è che dalla correttezza di un algoritmo possiamo trarre conclusioni sulla struttura alla base del problema. Questo è un caso molto raro in matematica. Qui una struttura teorica viene completamente caratterizzata attraverso un algoritmo pratico.» «Vuoi dire che per il solo fatto che l’algoritmo greedy trova il minimo albero generatore nel nostro grafo so già che il problema dell’albero generatore ha questa particolare struttura?» «Non perché trova un albero di peso minimo nel nostro grafo, ma perché lo fa in ogni grafo e per tutti i pesi immaginabili. Quello che accade solamente in alcuni grafi particolari non importa. In certi casi può ad esempio succedere che l’algoritmo greedy trovi, accidentalmente, un cammino minimo da p a t. Sappiamo tuttavia che ciò non accade sempre.» «E va bene. Ci sono allora questioni teoriche per le quali bisogna darsi da fare più a lungo con la matematica, ma i problemi pratici di progettazione di percorsi sembrano tutti piuttosto semplici, almeno se non compaiono pesi negativi.» «Attenta! Con i problemi del cammino minimo e dell’albero generatore ho pescato apposta per te due autentiche perle di semplicità e perfezione. Già piccole variazioni sul tema portano a problemi molto difficili, per i quali non è ancora stato trovato un algoritmo efficiente.» «Ad esempio?» «Ad esempio l’affidabilità delle reti. Ti avevo mostrato quanto questo sia importante con l’esempio del black-out di New York.» «Senz’altro.» «Un grafo che rimane connesso anche dopo la rimozione di uno qualsiasi dei suoi lati si dice 2-connesso. Se, dato un certo grafo, si volesse determinare un sottografo di peso minimo 2-connesso, si incapperebbe in un problema molto difficile. Un altro esempio è il cosiddetto problema dell’albero di Stei-
163
2 1
1
1
1
2
2
2
«Okay e allora?» «Se troviamo un minimo albero generatore nel sottografo dei quattro vertici esterni, otteniamo naturalmente un albero con valore 6. Se invece aggiungiamo anche la città che inizialmente non ci importava dotare di fibre ottiche, si trova un albero generatore con valore 4.» 2
2 1
1
2
2 1
1
1
1
1
2
1 2
2
2
«E questo dovrebbe essere difficile?» «Quando l’insieme dei vertici “liberi” diventa più grande, provare quale di essi debba essere aggiunto alla totalità dei vertici obbligatori porta di nuovo ad un algoritmo esplosivo dal punto di vista combinatorio.»
Arraffa ciò che puoi
ner: la ditta B che prende in affitto le linee ottiche può voler raggiungere solo una parte dei vertici, ad esempio solo le città più grosse. Tuttavia può essere conveniente utilizzare cavi che attraversano anche altre città. Immagina di avere il seguente grafo e che solo i quattro vertici esterni debbano essere raggiunti dalle fibre ottiche:»
164 Alla ricerca della via più breve
«Okay, ma allora mi devi anche raccontare una buona volta cosa si fa quando tra le mani capita un problema così difficile. La ditta di telecomunicazioni non può mica dire ai suoi clienti che le sue linee non sono sicure in caso di incidente perché il corrispondente problema matematico non si può risolvere, non ti pare? Adesso però sarà meglio che io mi vesta e che vada a mangiare qualcosa. Ho una fame da lupo.»
Arbore. . . cosa?
In casa non c’era nessuno. Rut fece un’abbondante colazione e pensò al da farsi. Non aveva alcuna intenzione di stare tutto il giorno da sola in camera sua e Jan, purtroppo, non c’era. Che dire di un pomeriggio in bicicletta nell’Englischer Garten? Il suo gruppo di amici aveva un posto fisso nel parco e là, con il bel tempo, si poteva sempre incontrare qualcuno della compagnia.
Vista sull’Englischer Garten dalla Torre Cinese
Rut non ne aveva però tantissima voglia. Chissà, forse le sarebbe venuto in mente qualcosa di meglio più tardi. . . Alle undici e mezza accese il televisore. Non si sarebbe persa la trasmissione con il topo a nessun costo: era un cult! Sua madre non poteva concepire che la sua “signorina” guardasse ancora i programmi per bambini; suo padre, dal canto suo. . . beh, spesso
166 Alla ricerca della via più breve
si univa alla visione. Oggi veniva spiegato come si fanno i salatini e il capitano Orsoblù raccontava di bastoncini di pesce parlanti. . . Rut si ricordò che il topo, qualche tempo fa, aveva anche spiegato come funziona un computer. Quella trasmissione sarebbe sicuramente piaciuta anche a Vim. Armata di un sacchetto di salatini – dei quali aveva improvvisamente avuto una voglia matta –, al termine del programma televisivo, tornò in camera sua. «Ciao Rut.» «Ciao Vim. Dì un po’, lo sai come si fanno i salatini?» «Aspetta, dò un’occhiata con Google.» «Ma no, non dicevo sul serio! Poco fa hai parlato di problemi difficili. È per questo motivo che nel problema dell’albero generatore abbiamo esaminato solo il caso di grafi senza direzioni? Nel problema del cammino minimo avevamo pur considerato entrambi i casi!» «No, il motivo risiedeva solo nel tipo di applicazione scelta come esempio. Nei cavi a fibra ottica le direzioni non giocavano alcun ruolo.» «Un albero orientato è allora solo un albero con archi al posto di lati?» «Non proprio. Dobbiamo prima scegliere la radice: un vertice dal quale partire per percorrere tutto l’albero; quindi sostituiamo tutti i lati con archi che puntano in direzione opposta alla radice:»
Radice
167 «Okay, non è comunque la cosa più complicata del mondo.»
«Arbore. . . cosa?» «Deriva sempre dal latino. “arbor” non vuol dire altro che “albero”. La parola “arborescenza” sta a indicare il generale sviluppo di una pianta; essa si riferisce a qualcosa che si dirama e dunque mi sembra che si adatti abbastanza bene al nostro caso.» «D’accordo, ma dove le abbiamo già incontrate?» «Se in un grafo non orientato, a partire da un vertice p, costruiamo i cammini minimi che portano a tutti gli altri vertici del grafo, otteniamo un albero generatore.» «Me lo hai già spiegato. Poiché tutti i cammini partono da p, ogni vertice è perlomeno “appeso” a p come a un chiodo e il tutto sta legato: l’insieme dei lati è cioè connesso; siccome poi è sempre sufficiente un solo cammino per andare da p a ciascuno degli altri vertici, non si formano nemmeno circuiti.» «Precisamente. Queste proprietà valgono anche per gli archi dei cammini minimi nel problema del cammino minimo per grafi orientati.» «Dunque gli “alberi dei cammini minimi orientati” sono arborescenze?» «Sì. Le arborescenze sono sottoinsiemi degli archi di un grafo orientato con le seguenti proprietà: uscendo da un vertice p, scelto come radice, è possibile raggiungere tutti gli altri vertici; nessun arco entra in p; in tutti gli altri vertici, infine, entra esattamente un arco solo. Prova a controllare queste tre cose nella soluzione del nostro vecchio problema di cammino minimo:»
Arbore. . . cosa?
«Abbiamo già incontrato queste arborescenze.»
168 a
Alla ricerca della via più breve
p 3
c
10
2
1
e
7 12
2 11 t
11
15
3
5
3
2 7 b
2
2
3
d
f
«Okay. Tutti i vertici sono raggiungibili da p; in p non arriva alcun arco e in tutti gli altri vertici ne arriva esattamente uno.» «Il fatto che in nessun vertice entri più di un arco è di nuovo dovuto alla circostanza che, nel problema del cammino minimo, per nessun vertice viene stabilito più di un percorso per raggiungerlo.» «Capisco. Ma questa “arborescenza del cammino minimo” non è quella con il minimo peso complessivo, vero?» «No, nel nostro grafo le arborescenze di peso minimo hanno peso totale inferiore di un’unità rispetto all’arborescenza del cammino minimo:» a
p 3
c
10
2
1
12
2 11 t
11 5
e
7
15
3
3
2 7 b
3
d
2
2 f
«Si trovano anche loro con una specie di algoritmo greedy?» «Non proprio. Occorre farsi venire in mente qualche altra buona idea. Alla fine, comunque, si ottiene un algoritmo efficiente.
169
100 100 2 p 101
2
1
«Lo farò, ma aspetta un momento: mi sembra che abbiano suonato.» Rut aprì la porta di casa e lo stupore durò un attimo, lasciando spazio ad una grande felicità. «Jan?! Ma che ci fai qui? Pensavo che tu fossi via tutto il fine settimana!» «Già, così almeno doveva essere. Mio padre però è dovuto tornare a casa prima del previsto, per via di non so quale problema nell’azienda dove lavora. Ho pensato allora che avremmo potuto fare qualcosa insieme noi due. È un brutto momento? State pranzando?» «No, no, ho fatto colazione tardi e i miei non sono neppure in casa. Dai, vieni dentro!» Dopo una rapida consultazione, Rut e Jan decisero di andare in bicicletta sulle rive del fiume Isar a fare un picnic. In men che non si dica, presero una coperta, qualcosa da sgranocchiare e pedalarono via. Sul fiume si tolsero le scarpe, si sedettero sulla spiaggia di sassi, parlarono a lungo e risero. Camminarono ancora un po’ con i piedi nell’acqua bassa e poi tornarono a sdraiarsi sulla coperta, al sole.
Arbore. . . cosa?
Prova a trovare un’arborescenza di peso minimo nel prossimo grafo. Vedrai che le strategie “ingorde” falliscono.»
170 Alla ricerca della via più breve Spiagge di sassi nel letto dell’Isar, il fiume che attraversa Monaco
«Che cosa avresti fatto oggi, se io non fossi passato da te?» «Niente di preciso. Forse sarei andata in bici al parco, dove si incontra sempre la mia compagnia. Ma credo che probabilmente avrei finito per passare il mio tempo con Vim.» «Vim? E chi sarebbe?» Le era proprio sfuggito di bocca. Rut era stata a lungo incerta se dire o no a Jan del suo recente interesse per la matematica. Un poco, infatti, temeva la sua reazione. Ma ormai il dado era tratto e gli raccontò di Vim. «Un software che sa tutto sulla Pianificazione degli itinerari, col quale, per di più, ci si diverte un mondo? Mi vuoi prendere in giro?» «No, ti assicuro che è davvero così! Spero che tu non mi prenda per una secchiona, ma la scuola non c’entra niente. A volte è emozionante e avvincente come un giallo.» «Non riesco proprio a immaginarlo. Potrei dare un’occhiata, magari, una volta?»
171 «Ma certo!»
«Ciao Vim.» «Ciao Rut, hai avuto visite?» «Vim, posso presentarti Jan? Frequenta la mia stessa scuola, una classe più avanti della mia.» «Ciao Jan! Sono onorato di fare la tua conoscenza.» «Ehm. . . già, il piacere è tutto mio. . . » «Ho detto a Jan che noi due conversiamo spesso e che tu sei un vero genio della matematica.» «Beh, non esageriamo! Come ti avrà già raccontato Rut, noi parliamo il più delle volte di matematica; per essere più precisi: di Routenplanung. Cosa poi Rut ci trovi di così affascinante, non l’ho ancora capito. Potrei parlarle allo stesso modo di buchi neri, dei giochi olimpici o di musica pop, ma a lei interessa solo la Pianificazione degli itinerari.» «Finiscila! Altrimenti Jan si farà un’idea sbagliata di me. Eri tu che volevi assolutamente mostrarmi un tipo diverso di matematica.» «Okay, lo ammetto.» «Ma è sempre così tra voi due? Pensavo che Vim fosse solo un qualche tipo di enciclopedia interattiva. Ehi, che succede adesso?. . . Perché lo schermo si è improvvisamente oscurato?» «Jan, credo che tu l’abbia offeso.» «Non ci posso credere! Un programma addirittura sensibile. . . » «Ah, ci siete cascati! Niente paura, era solo un piccolo scherzo.»
Arbore. . . cosa?
Adesso che gli aveva raccontato tutto, Rut poteva anche fargli conoscere Vim di persona. Nel frattempo, il cielo aveva cominciato a coprirsi di nuvole e ormai il sole non scaldava più come prima. Così i ragazzi impacchettarono di nuovo la loro roba e presero la via del ritorno. Giunti a casa, Rut mostrò a Jan la sua stanza ed accese il computer.
172 Alla ricerca della via più breve
«Caspita, come vorrei stare qui a sentirlo parlare! Mi stavo infatti già dimenticando che stasera devo badare al mio fratellino piccolo! Veramente speravo che venissi anche tu: potremmo ascoltare un po’ di musica, che ne so. . . Non avresti magari voglia di raccontarmi quello che Vim ti ha già mostrato?» «Volentieri, ma non sono sicura di riuscire a rimettere insieme ogni cosa!» «Ma certo, invece! Se hai una chiave USB, ti copio qualche disegno e un paio di links.» «Magnifico, Vim!» Strada facendo, Jan volle ancora sapere che cosa avesse di così diverso la matematica con Vim rispetto alla matematica di scuola. Rut gli spiegò che con Vim non si trattava dei soliti esercizi nei quali una formula viene impiegata in qualche finta applicazione, inventata apposta per lo scopo. No, qui i problemi erano reali, presi direttamente dalla vita vera. Rut riferì di come Vim, più di ogni altra cosa, le avesse fatto capire quanto la traduzione di un problema concreto in forma matematica, cioè la scelta del modello matematico, non piovesse da sola giù dal cielo, ma fosse una parte assolutamente non triviale del compito posto. Quando disse “triviale”, non poté evitare di sorridere. Jan le diede subito ragione. A scuola nessuno si era mai preoccupato della costruzione dei modelli. Nei libri di scuola ogni cosa stava lì, bella e pronta, già nella forma più adatta; o comunque era sempre chiaro in quale forma un determinato problema dovesse essere portato. Tutt’al più la difficoltà poteva consistere nel capire in che modo far rientrare il problema nello schema. Ma a Rut, invece, era proprio il lato creativo della matematica che piaceva e con Vim davvero non si sapeva mai come sarebbe andata a finire. Fu una serata meravigliosa. Rut si convinse fermamente di non aver mai conosciuto una persona con la quale poter comunicare così bene, come con Jan. Certo, anche con Vim si era intrattenuta piacevolmente negli ultimi tempi, ma questa, adesso, era una cosa completamente diversa. La raccolta di MP3 di Jan era troppo vasta per poterla ascoltare tutta. Lui promise di masterizzarle un CD con il software indispensabile e alcune delle sue canzoni preferite. Jan, inoltre, volle
173
Il fratellino di Jan, Lukas, si rivelò tuttavia un po’ impegnativo. Continuamente i due erano costretti a guardare qualcuno dei suoi disegni. Solo quando Jan gli raccontò la storiella della casa di Nikolaus, il piccolo li lasciò in pace; gli ci volle infatti un po’ di tempo prima di riuscire a risolvere il gioco. Rut capì dal disegno di Jan di che cosa si trattasse. Un gioco simile si faceva anche in Italia: disegnare una casetta, fatta da un quadratino, le sue diagonali e un piccolo tetto sopra al lato in alto, senza mai staccare la penna dal foglio e senza passare due volte sullo stesso lato. Jan in più, per ogni lato disegnato, pronunciava una sillaba della frase: “Das ist das Haus des Nikolaus”, che voleva dire appunto che quella era la casetta di Nikolaus. Nikolaus, pensò Rut, doveva essere qualcosa come Babbo Natale. Rut si chiese se in fondo erano davvero loro a badare a Lukas o se, piuttosto, non fosse il contrario. Quando Rut tornò a casa, erano quasi le nove di sera: appena in tempo, poiché quello era il limite massimo concessole. Con Jan si era accordata per vedersi di nuovo il giorno seguente. Al suo rientro, papà e mamma erano già in casa che la aspettavano e allora le toccò sottoporsi ad uno dei loro famosi interrogatori. Così son fatti i genitori. . .
Arbore. . . cosa?
sapere ogni cosa su Vim e la Pianificazione degli itinerari e Rut era orgogliosa di scoprire che ricordava praticamente tutto, grazie anche al materiale di Vim, naturalmente.
Un vecchio straordinario Il lunedì mattina fu un vero strazio. Rut aveva l’impressione che la scuola non volesse più finire. Pareva che tutti gli insegnanti cospirassero nel complotto per la noia assoluta. Ma forse dipendeva anche dal fatto che lei non era del tutto concentrata sulle cose di scuola. Non riusciva a smettere di pensare al giorno prima. Quando tornò a casa, non trovò nessuno. Suo padre era al lavoro, come sempre, ma la mamma di solito a quell’ora era lì. Non fa niente, di lì a poco sarebbe arrivato anche Jan e Rut era felice. Un attimo dopo, già suonava il campanello. «Ciao Jan, vieni pure avanti.» «Ciao Rut. Allora, oggi come è andata la scuola?» «Ah, non me lo chiedere nemmeno. E a te?» «Come al solito. In mate, tuttavia, non potevo fare a meno di pensare a quello che hai detto tu ieri. Ad un certo punto non ce l’ho più fatta e ho dovuto chiederlo.» «Chiedere cosa?» «Beh, che applicazione concreta hanno le cose che stiamo trattando adesso.» «E allora?» «Il nostro insegnante, naturalmente, non era preparato ad una domanda del genere.» «Accidenti Jan, io non avrei mai osato farlo.» «Muoio dalla voglia di vedere Vim in azione. Che cosa racconterà oggi?» «Chiediamolo subito a lui stesso!»
176 Alla ricerca della via più breve
Entrarono in camera di Rut e, mentre lei accendeva il computer, Jan notò il dispositivo di comunicazione, cioè quella piccola scatola grazie alla quale era possibile interloquire con Vim. «Non ho mai visto un apparecchio così. Dove l’hai preso?» «Non ne ho idea. Era già lì quando mi hanno regalato il computer.» «Nei computer normali una cosa del genere comunque non si trova.» «Vuoi dire che questa scatoletta è parte integrante di Vim? Strano. Allora mio padre deve saperne di più sul suo conto. Altrimenti si sarebbe meravigliato anche lui vedendo la scatola.» «Ma certo! La cosa migliore però è che tu lo chieda direttamente a lui.» «Oppure a Vim! Come ho fatto a non pensarci prima! Ciao Vim.» «Ciao Rut.» «Jan ed io siamo curiosi di conoscere le tue origini; vorremmo cioè sapere chi ti ha creato e installato sul mio computer.» «Domanda interessante! Purtroppo non ne ho idea. Nella mia banca dati non è prevista risposta. Chi sono io, da dove vengo, perché esisto? Se venite a saperlo, per favore, ditemelo!» «Dai! Tu esisti per raccontare a Jan e me qualcosa sulla Pianificazione dei percorsi, vero?» «Benone. Lasciamo allora da parte la filosofia. Un bell’argomento per introdurre Jan ai nostri temi sarebbe il problema dei ponti di Königsberg, noto dal 1735.» «Non è ormai un po’ vecchiotto?»
177
«No, viene sempre il giovedì. Ma perché ti interessa?» «Niente, era solo per sapere. Guardate qua: questa è una piantina di Königsberg attorno al 1650. La si trova anche in Internet, all’indirizzo www-groups.dcs.st-and.ac.uk/˜history/ HistTopics/Topology_in_mathematics.html. Sapete come si chiama il fiume che attraversa la città?»
«Di Königsberg io conosco solo le polpette. E tu Jan?» «Io so solo che Königsberg appartiene adesso alla Russia e che si chiama Kaliningrad.» «Giusto, e il fiume che scorre per Königsberg si chiama Pregel. La domanda adesso è questa: è possibile fare una passeggiata per la città attraversando una sola volta ciascuno dei setti ponti evidenziati in figura? Naturalmente non vale imboccare un ponte, arrivare a metà, girarsi e tornare indietro. Una volta che si imbocca un ponte, questo deve essere attraversato e non può più essere usato in seguito. Un tempo era un vero sport dei più giovani. A quel tempo non c’erano né televisione né Internet e i ragazzi, con il bel tempo, girovagavano in lungo e in largo per la città.»
Un vecchio straordinario
«Oh no! Vedrai che è ancora molto attuale. È già passata la nettezza urbana?»
178 Alla ricerca della via più breve
«Parli come se noi oggi stessimo tutto il giorno davanti al televisore. Anche Jan ed io girovaghiamo volentieri su e giù per i ponti dell’Isar, non è vero Jan?» «Ah sì?» «Ai giovani di Königsberg, in ogni caso, non riusciva di trovare un simile percorso attraverso i sette ponti. Molti pensavano perfino che fosse impossibile. Nel 1735, finalmente, venne chiesto al famoso matematico Leonhard Euler di far luce sulla questione.» «Euler? È il matematico che in Italia chiamiamo Eulero?» «Sì, è lui. I nomi in latino potevano subire cambiamenti. E allora Vim, Eulero riuscì a chiarire la faccenda?» «Certo che ci riuscì. Eulero studiò il problema e scrisse a proposito un ampio lavoro nel quale rispondeva in generale a tutte le domande di questo tipo, indipendentemente dalla disposizione delle diramazioni del fiume e dei ponti a Königsberg. In un certo senso egli fondò con questo lavoro l’intera teoria dei grafi. Eccovi il frontespizio della rivista “Commentarii Academiae Scientiarum Imperialis Petropolitanae” del 1736, nella quale egli pubblicò il suo articolo:»
Dal: Commentarii Academiae Scientiarum Imperialis Petropolitanae 8, 1736
«Piuttosto ingiallito! E guarda che macchie sul margine sinistro!»
179
Dal: Commentarii Academiae Scientiarum Imperialis Petropolitanae 8, 1736, p. 128–140
«Latino?» «Esattamente. A quel tempo era questa la lingua delle persone colte.» «Non è comunque certamente il mio pane quotidiano.» «Il titolo si può tradurre così: “Soluzione di un problema di geometria della posizione”. Con l’espressione “geometria del-
Un vecchio straordinario
«Sembra che il volume abbia sofferto l’umidità, cosa che del resto può ben capitare in 250 anni. La prima pagina dell’articolo è in condizioni migliori:»
180 Alla ricerca della via più breve
la posizione”, Eulero voleva mettere l’accento sul fatto che in questo problema solo il modo in cui sono disposti il fiume e i ponti ha un ruolo. Le grandezze numeriche, come le distanze, non hanno alcuna importanza.» «Invece di rispondere concretamente alla domanda che gli era stata fatta, il vecchio matematico scopre addirittura tutta una teoria completa su cose delle quali non si voleva sapere nulla. Questo è tipico dei teorici!» «Jan, sei davvero ingiusto. È invece bello che Eulero non si sia limitato a rispondere alla domanda degli abitanti di Königsberg. Così sappiamo subito per una qualsiasi città con fiume e ponti se una simile passeggiata è possibile.» «Rut ha ragione. Con i risultati di Eulero potreste risolvere il problema anche per Monaco. A proposito, ho qui una piccola illustrazione tratta da un libro di indovinelli matematici di Sam Loyd. Essa ritrae Eulero come tutti lo immaginerebbero: un vecchio uomo saggio e pieno di dignità, artefice di grandiose opere matematiche.»
Da: Sam Loyd, Martin Gardner – Mathematische Rätsel und Spiele. DuMont, 1978, p. 48
«Ebbene? Cosa c’è di strano in questa rappresentazione?» «Eulero nel 1735 aveva appena 28 anni! Guardando bene, scoprirete inoltre un ulteriore errore nel disegno e cioè la presenza di un ottavo ponte. Non lo si nota subito anche perché questa cartina è capovolta rispetto alla precedente.»
181
«Non ne ho idea. Probabilmente a Loyd l’indovinello con otto ponti piaceva di più. Egli sosteneva perfino che Eulero si fosse sbagliato. Ai tempi di Loyd, tuttavia, alla fine del XIX secolo, nel punto in cui è stato disegnato l’ottavo ponte c’era solo un ponte ferroviario. Dubito proprio che qualcosa del genere ci fosse anche ai tempi di Eulero!» «Tu hai detto prima che la soluzione ha qualcosa a che vedere con i grafi.» «Certo. Se infatti cerchiamo di concentrarci esclusivamente sulle informazioni che veramente ci servono per rispondere alla domanda sul giro dei ponti, è ovvio considerare i luoghi, cioè le zone della città separate dal fiume, come i vertici. . . » «. . . e i ponti, in quanto collegamenti tra le parti della città, come lati. Ecco già fatto il nostro grafo. Fantastico!» «In Internet, al sito www.forum.swarthmore.edu/˜isaac/ problems/bridges2.html trovate a proposito un ottimo schizzo:»
«Ehi, aspettate un momento! Potreste iniziare anche me a questi misteri?» «Ma è semplicissimo, Jan. Il fiume ripartisce la città in quattro zone. Disegna un vertice al posto di ognuna di esse e traccia un lato tra due vertici se c’è un ponte che collega le due parti di città corrispondenti.» «Magnifico, Rut. Ben presto la mia presenza qui sarà superflua. In questo modo otteniamo i due grafi multipli non orientati
Un vecchio straordinario
«Ora che l’hai fatto notare, lo vedo anch’io. I ponti in tutto sono otto. Come è potuto succedere?»
182 Alla ricerca della via più breve
che potete vedere qui, a sinistra quello per il problema originale e a destra quello per il problema di Loyd con otto ponti. Rut ti ha spiegato cos’è un grafo multiplo, vero Jan?» 3
5
4
3
3
5
3
4
«Sì, un grafo che possiede più di un lato tra gli stessi due vertici. Ma un po’ di vantaggio su di me l’avete comunque. Io non ci sarei mai arrivato a trasformare così la piantina in un grafo. Cosa vogliono dire i numeri vicino ai vertici?» «I numeri sono la vera chiave per la soluzione del problema. Tuttavia non sono una cosa complicata. Il 3 che sta di fianco al vertice di destra, ad esempio, non vuol dire altro che da questo nodo escono tre lati.» «Cioè che 3 ponti conducono a questa parte della città?» «Esatto. La stessa cosa per gli altri numeri. Ognuno dice quanti lati ha ogni vertice. Si parla di valenza oppure grado del vertice.» «Non dicono nulla di più quei numeri? Non sembrerebbe proprio una grandiosa prestazione intellettuale.» «Sono le piccole idee semplici a rivelarsi spesso particolarmente valide ed efficaci. Avete notato che con un ponte in più nella versione di Loyd si innalza il grado di esattamente due vertici?» «Veramente no, ma adesso che mi ci fai pensare. . . Siccome ogni lato contiene due vertici, non può essere altrimenti!»
183
«E quale sarebbe questa proprietà?» «Il numero dei vertici che hanno grado dispari è sempre pari, in qualsiasi grafo. Nel nostro grafo con sette ponti, ad esempio, tutti e 4 i vertici possedevano un grado dispari e nel grafo con otto ponti i vertici con grado dispari erano 2. Sia 4 che 2 sono numeri pari.» «Mmm, ferma tutto. Mi è appena venuto in mente che in cantina c’è un freezer pieno zeppo di gelati. Che ne dici, Jan?» «Molto volentieri. È proprio come essere al cinema!» «E io?» «Beh, guarda un po’ cosa dice Google a proposito di “gelati”. Non deve essere un cibo sanissimo!»
Un vecchio straordinario
«Hai perfettamente ragione. È comunque importante osservarlo, perché da questa osservazione si può dedurre una proprietà notevole del grado dei vertici in un grafo.»
Magnetica dimostrazione Rut fu subito di ritorno con due coppe di gelato della Foresta Nera: panna, cioccolato e amarene. «Dunque, per entrambi i grafi di Königsberg vale la tua affermazione che il numero dei vertici aventi grado dispari è pari, ma questa non è una prova sufficiente per concludere che ciò vale sempre.» «No, ma possiamo ricavare da questi due esempi l’idea per una dimostrazione. La dimostrazione che ho in mente qui è la cosiddetta dimostrazione per induzione completa.» «Ha a che fare con la fisica?» «No, Jan. La parola “induzione” sta qui ad indicare un metodo per desumere il generale dal particolare. Abbiamo visto che entrambe le versioni del grafo di Königsberg possiedono un numero pari di vertici con grado dispari e siamo inclini a pensare che questa affermazione sia valida sempre. Si può allora tentare una dimostrazione per induzione tutte le volte che la congettura in questione si può esprimere in termini di una serie di affermazioni parziali, dipendenti da un numero naturale n. Nel nostro caso è possibile fare questa sorta di scomposizione riformulando la congettura come segue:» La seguente affermazione vale per ogni numero intero non negativo n: Ogni grafo con n lati possiede un numero pari di vertici di grado dispari.
«Non capisco. Se l’affermazione vale per ogni n, allora significa che il numero dei vertici di grado dispari è pari in ogni grafo. In questo modo la congettura è esattamente la stessa di prima.»
186 Alla ricerca della via più breve
«Giustissimo. Ma grazie al parametro n abbiamo scomposto la congettura: per ogni grafo con 0 lati, per ogni grafo con un lato, per ogni grafo con 2 lati e così via.» «Ma questo è molto più complicato! La congettura deve essere comunque dimostrata per ogni grafo. In fondo non si guadagna niente.» «Al contrario! Proprio in virtù del fatto che abbiamo scomposto la congettura in tante parti, ognuna per grafi aventi un preciso numero n di lati, possiamo dimostrare le singole parti a catena, una dietro l’altra.» «Ma questi pezzettini sono infiniti. Se li vogliamo dimostrare tutti in fila, uno dopo l’altro, ci vuole un’eternità!» «In questo hai naturalmente ragione, Rut. Se davvero dovessimo dimostrare la correttezza dell’affermazione per ogni singolo valore di n non avremmo alcuna speranza.» «Ma vogliamo saperlo proprio per ogni grafo.» «Sì, ma lo facciamo in un modo più furbo. Per non dover ripetere sempre la frase nel riquadro verde, uso il simbolo A(n) come abbreviazione. A(0) sta dunque per l’affermazione: “ogni grafo con 0 lati possiede un numero pari di vertici di grado dispari”.» «Capisco. A(1) allora vuol dire: “ogni grafo con un solo lato ha un numero pari di vertici di grado dispari”.» «Esatto. In generale, A(n) è l’affermazione: “ogni grafo con n lati ha un numero pari di vertici di grado dispari”. Tutto chiaro, Jan?» «Chiarissimo!» «Se ora volessimo dimostrare singolarmente ogni affermazione parziale – e così facendo non finiremmo mai – dovremmo produrre una dimostrazione nuova per ognuno dei punti in questo schema, sempre avanti, senza fine. . . » A(0)
A(1)
A(2)
A(3)
A(4)
A(5)
...
187 «C’è qualche modo per evitarlo?»
... A(0)
A(1)
A(2)
A(3)
A(4)
A(5)
«Dovremmo metterci a saltellare da un vertice all’altro?» «Proprio così!» «Non capisco. Si continuerebbe ancora a saltare all’infinito.» «Dunque, per prima cosa mostriamo che A(0) è vera.» «Oh bella, questo sì che è triviale. Se il grafo non ha lati, tutti i vertici hanno grado 0 e cioè sono tutti di grado pari.» «Giusto. Non c’è un solo vertice di grado dispari; di conseguenza l’affermazione A(0) è vera. Questo è il primo passo, il cosiddetto inizio dell’induzione. Bene, e adesso mostriamo, qualunque sia n, che l’affermazione per grafi con n + 1 lati è vera se essa già vale per i grafi con n lati. Nel nostro linguaggio questo significa dimostrare che se A(n) è vera, allora anche A(n + 1) è vera.»
A(n)
A(n +1)
«Detto così, sembra che ogni n trasmetta in “eredità” la proprietà al suo successore.» «Sì, questa è una bella immagine. Ma guardiamo come funzionerebbe tutto ciò con i nostri grafi. Per passare da A(n) ad A(n + 1), assumiamo che ogni grafo con n lati abbia un numero pari di vertici di grado dispari. Questa è la cosiddetta ipotesi induttiva. Ora dobbiamo far vedere che l’affermazione vale anche per tutti i grafi con n + 1 lati.» «Se però n è grande, questi grafi sono tantissimi.»
Magnetica dimostrazione
«Sì, con il seguente principio:»
188 Alla ricerca della via più breve
«Non è necessario esaminare singolarmente tutti i grafi. È sufficiente utilizzare la proprietà che hanno in comune e cioè il fatto che abbiamo tutti n + 1 lati.» «E funziona?» «Eccome! Ammettiamo di avere tra le mani un grafo qualsiasi, avente n + 1 lati. Se adesso eliminiamo uno dei suoi lati, otteniamo un grafo con n lati. In forza dell’ipotesi induttiva, questo grafo ha senz’altro un numero pari di vertici di grado dispari. Nel punto in cui il lato è stato tolto, ci sono ora solo tre possibili situazioni: entrambi i vertici interessati hanno adesso grado dispari, entrambi hanno grado pari, oppure uno dei due ha grado pari e l’altro dispari. Per esemplificare, ecco come le tre possibili situazioni potrebbero apparire attorno ai due vertici dopo che è stato rimosso il lato che li collegava:»
3
5
2
2
5
6
«È vero, essenzialmente non ci sono altre possibilità. E in che modo questo potrebbe esserci di aiuto?» «In virtù dell’ipotesi induttiva, sappiamo che il grafo privato di un lato possiede un numero pari di vertici di grado dispari. Se aggiungiamo di nuovo il lato tolto precedentemente, dobbiamo allora solo mostrare che in nessuna delle tre situazioni possibili si ottiene un grafo con un numero dispari di vertici di grado dispari. Nel primo caso, i due vertici di grado dispari, in seguito all’aggiunta del lato tolto, diventano entrambi di grado pari. Il numero complessivo dei vertici di grado dispari diminuisce così di due unità e, se era pari prima, rimane pari anche dopo.»
189 5
4
6
«Capisco. E tu, Jan?» «Nessun problema.» «Nel secondo caso, da due vertici di grado pari otteniamo due vertici di grado dispari. Abbiamo cioè due vertici di grado dispari in più rispetto a prima, ma questo, ancora una volta, non cambia il fatto che il loro numero complessivo sia sempre un numero pari.»
2
6
3
7
«Chiarissimo.» «Nell’ultimo dei tre casi, il lato collega un vertice di grado pari con un vertice di grado dispari. Dopo il ripristino del lato, i due vertici non fanno che scambiarsi l’uno con l’altro questi attributi e il numero di vertici di grado dispari rimane esattamente lo stesso.»
2
5
3
6
«Allora non importa: comunque vadano le cose, il numero dei vertici di grado dispari rimane sempre un numero pari.»
Magnetica dimostrazione
3
190 Alla ricerca della via più breve
«Esattamente. Così ci è riuscito di compiere il passo induttivo, anche noto come il motore dell’induzione, cioè il passaggio da A(n) a A(n+1) ed abbiamo finito con la nostra induzione completa.» «Non potresti spiegarmi ancora perché dovremmo adesso essere sicuri che l’affermazione vale per ogni n?» «Certamente. L’inizio dell’induzione ci assicura che l’affermazione è vera per n = 0 e, grazie al passo induttivo, possiamo allora dedurre che essa è vera anche per grafi con 1 lato, visto che n + 1 = 1, se n = 0. Adesso possiamo però applicare il passo induttivo anche a n = 1 ed ottenere dunque la giustezza dell’affermazione per n + 1 = 2.» «Capisco. Poiché sappiamo che l’affermazione è corretta per n = 2, otteniamo di nuovo la convalida per n + 1 = 3, e tutto questo va sempre avanti così.» «Proprio come ha già detto Rut, la proprietà viene sempre trasmessa in eredità. Che ne dite di un tocco di poesia su questo tema?»
L’unità Un dì i numeri naturali (credendosi Dio sa che cosa) derisero in coro, sodali, l’inerme unità vergognosa. Vedendo sommarsi ai suoi mali ingiuria così dolorosa, rispose la misera: “Ingrati! – pensare che v’ho generati. . . ” Tradotto da: Hubert Cremer, Carmina Mathematica, Verlag J.A. Mayer, 1977, p. 18
«Oh sì, nemmeno un pochino riconoscenti, questi giovani. Lo dice sempre anche mia nonna.»
191
«Non ci abbiamo ancora pensato. Ti andrebbe di venire al cinema con me, Rut? Oggi è la giornata giusta, perché il prezzo del biglietto è ridotto e non si spende tanto come nel fine settimana.» «Ma non vuoi sapere come va a finire? Non ti interessa?» «Certo che mi interessa, ma per oggi può bastare. Al cinema danno “2001 Odissea nello Spazio”!» «Fantascienza? E per di più un pezzo di antiquariato come quello?» «È un classico. Non ti piacciono i film di fantascienza?» «Non tanto. Sono sempre così tirati per i capelli!» «Ma è così per quasi tutti i film. Solo che i film di fantascienza, almeno, non hanno la pretesa di raccontare qualcosa di vero. Inoltre Stanley Kubrik in “2001 Odissea nello Spazio” non ha davvero risparmiato sugli effetti speciali.» «E va bene, mi hai convinto. A domani, Vim!» «Buona visione!» Rut sarebbe andata a vedere qualsiasi film, purché ci fosse stato anche Jan. Tuttavia si era meravigliata di quanto facilmente lui si fosse lasciato convincere da Vim a piantar lì tutto. Le sembrava che Jan non fosse altrettanto affascinato da queste cose. Tuttavia ciò dipendeva anche da lei. Suo padre diceva sempre, con particolare orgoglio, che se a Rut una cosa piaceva, non mollava più la presa finché non c’era arrivata in fondo, proprio come aveva sempre fatto anche lui. La mamma però non era convinta del tutto che di una cosa simile si dovesse andare orgogliosi. Il film le piacque, specialmente il computer HAL. Le ricordava un po’ Vim, solo che Vim era un tipo simpatico, tutto il contrario di HAL. “2001 Odissea nello Spazio” sarebbe stato sicuramente il film preferito di Turing, pensò. Jan accompagnò Rut a casa. Il film era durato molto ed erano già quasi le 21, decisamente oltre il limite concesso nei giorni
Magnetica dimostrazione
«Questo sarebbe un buon momento per fermarsi, se avete altre cose in programma per oggi. Non è forse così?»
192 Alla ricerca della via più breve
di scuola. La ramanzina a casa fu comunque piuttosto mite. Rut non era sicura se il merito fosse suo, che con le sue scuse in anticipo aveva abilmente sgonfiato il disappunto dei suoi genitori, oppure se dipendesse dalla presenza di Jan. Sicuramente ai suoi genitori Jan doveva piacere. Suo padre aveva più volte sottolineato quanto trovasse bello che lui l’avesse riaccompagnata a casa.
Euleriano o non euleriano, ` il dilemma questo e Il giorno seguente, a scuola, Rut chiese a Martina se poteva portare con sé anche Jan al party di venerdì. Nessun problema – aveva risposto Martina con un gran sorriso, aggiungendo che adesso finalmente sapeva perché Rut negli ultimi tempi si era fatta vedere così poco. Quando Rut tornò a casa, sua madre stava invece uscendo. «Ciao mamma.» «Ciao signorina. Il tuo pranzo è nel forno. Mi ha appena telefonato Teresa chiedendomi se avevo voglia di fare un giro in centro con lei. Tu hai già qualcosa in programma per oggi?» «Jan sta per arrivare.» «Ah! Allora a dopo.» Rut non capiva più come girasse il mondo. Normalmente seguivano raccomandazioni del tipo: “Non dimenticare di fare i compiti!”, “Ricordati di mettere a posto!” o simili, ma appena aveva nominato Jan, nell’espressione di sua madre era cambiato qualcosa. Proprio come ieri sera, pensò Rut. Jan aveva un qualche strano effetto sui suoi genitori. Rut stava prendendo un piatto dalla credenza quando il campanello suonò. Jan era già lì. Fortunatamente, sua madre cucinava sempre in abbondanza e ce ne fu anche per lui. «Ciao Vim.» «Ciao Jan, anche oggi dei nostri?»
194 Alla ricerca della via più breve
«Certo! Non voglio proprio perdermi niente. Purtroppo però oggi non posso rimanere a lungo. In fisica mi è stata rifilata una relazione scritta. Al signor Zweiholz non è piaciuto che io e Daniel, durante la sua “emozionante” lezione, ci siamo messi a parlare di film di fantascienza. Come punizione, Daniel deve scrivere per dopodomani un tema sulla velocità della luce ed io, invece, devo comporre un trattato sul funzionamento del laser.» «Ma questo non è un problema. Che ne diresti di un sito web nel quale trovare questi temi già svolti?» «Sarebbe fantastico! Ma esiste davvero qualcosa del genere?» «Oh, certo. Non c’è che l’imbarazzo della scelta. Conosco un sito che ospita un archivio di vecchie relazioni di scienze nel quale puoi trovare tutto quello che vuoi.» «La versione multimediale della scopiazzatura! Bisogna assolutamente che io scopra se c’è anche in italiano. Sarebbe una soffiata eccezionale per Sara.» «Altroché! Compiti in rete, già pronti per essere copiati: come nel paese della cuccagna!» «Direi piuttosto: al mercato delle pulci. Chi garantisce infatti che questi testi siano anche buoni? E poi devi pur sempre capirla la roba che scrivi.» «Questo è chiaro. Puoi spedirmi l’indirizzo di questo sito per posta elettronica?» «Già fatto.» «Ferma tutto! Chi ti ha dato l’indirizzo di Jan?» «L’ho preso dai tuoi indirizzi e-mail.» «Come? E tu ti metti tranquillamente a rovistare nel mio indirizzario e-mail? Tra un po’ mi vieni a raccontare che leggi anche i miei messaggi!» «No, non lo farei mai. Scusami, ti prego, non accadrà più.» «E va bene. Torniamo allora al nostro argomento. Perché i gradi dei vertici dovrebbero aiutarci a rispondere alla domanda se è possibile o no fare il giro di tutti i ponti di Königsberg?»
195
«Euleriano? Deve essere bellissimo quando uno è così famoso da usare il suo nome come aggettivo.» «E perché? Non hai mai sentito dire in italiano “rutinario” o “rutilante”?» «Allora, ammettiamo di partire da p e di raggiungere uno qualsiasi dei vertici intermedi lungo il cammino. Arriveremo su questo vertice utilizzando un lato non ancora usato e lo lasceremo di nuovo attraverso un lato mai usato fino a quel momento. Ogni volta che ciò succede, vengono utilizzati due dei lati che contengono questo vertice. Che cosa possiamo concludere sul suo grado?» «Se il vertice ha grado inferiore a 2, non funziona.» «Giusto. Un vertice con grado 0 non può proprio essere attraversato e dunque non può nemmeno far parte del nostro cammino. Vertici simili sono completamente isolati e non ci preoccupano: il problema del cammino euleriano riguarda i lati. Non si può dire la stessa cosa per i vertici di grado 1 che sono invece una sorta di vicolo cieco:»
1 «Li riusciamo a raggiungere, ma non possiamo più tornare indietro.» «Esattamente. Poiché dobbiamo percorrere anche questi lati e non abbiamo modo di lasciare il vertice per un’altra strada, questi vertici non possono che essere la partenza o l’arrivo del nostro cammino. Con vertici del genere è esclusa fin dall’inizio
Euleriano o non euleriano, questo è il dilemma
«Per prima cosa introduciamo tre nuove definizioni: ogni cammino che, partendo da un vertice p, utilizza esattamente tutti i lati del grafo una volta sola, si chiama cammino di Eulero; se questo cammino termina nello stesso vertice di partenza, cioè in p, si parla di circuito di Eulero; un grafo che contiene un circuito di Eulero si dice euleriano.»
196 Alla ricerca della via più breve
la costruzione di un circuito euleriano. E cosa succede con i vertici di grado maggiore?» «Un vertice di grado 2 può essere attraversato esattamente una volta sola. Se invece il grado è 3, abbiamo di nuovo il problema del vicolo cieco. Infatti, dopo aver attraversato il vertice una volta, ci rimane un solo lato a disposizione.» «Rut, tu praticamente hai quasi già risolto il problema! Ogni lato può essere usato una volta sola e allora possiamo pensare di eliminarlo dopo l’uso. Tutte le volte che si attraversa un vertice che non è il punto di partenza e nemmeno il punto di arrivo di un cammino euleriano, il suo grado si riduce di 2. Questo significa che un tale vertice interno al percorso euleriano mantiene sempre un grado dispari, se dispari era il suo grado all’inizio e rimarrà invece sempre di grado pari, se era pari anche all’inizio.»
4
2
0
5
3
1
«Quindi nei vertici di grado dispari avanza alla fine sempre un lato.» «Tranne nel caso in cui questi vertici sono la partenza o l’arrivo del cammino euleriano.» «Giusto. Con un cammino euleriano avente partenza e arrivo distinti, si abbandona il vertice p una volta in più di quanto non lo si raggiunga e per il traguardo t vale esattamente il contrario. In un circuito euleriano, poi, dato che p = t, anche questo vertice deve essere raggiunto e lasciato lo stesso numero
197
Teorema di Eulero Per ogni grafo G = (V, E) connesso ad eccezione, tutt’al più, dei suoi vertici isolati, si ha che: a) esiste un cammino euleriano in G se e soltanto se non più di due vertici di V hanno grado dispari; b) esiste un circuito euleriano in G se e soltanto se tutti i vertici di V hanno grado pari.
«Dobbiamo solo contare quanti lati escono dai singoli vertici ed abbiamo già la soluzione? Elegante! A Königsberg non c’è un cammino euleriano, perché tutti e 4 i vertici hanno grado dispari.» «Esatto. Questa è la risposta corretta nel caso del grafo con 7 ponti. Anche a questo proposito c’è una poesia:» «Cosa vuol dire Q.E.D.?» «E’ l’acronimo dell’espressione latina: “quod erat demonstrandum” e significa “come volevasi dimostrare”. Ai matematici piace concludere così le loro dimostrazioni.»
Some citizens of Königsberg Were walking on the strand Beside the river Pregel With its seven bridges spanned. O, Euler come and walk with us Thus burghers did beseech We’ll walk the seven bridges o’er And pass but once by each ‘It can’t be done’ then Euler cried ‘Here comes the Q.E.D. Your islands are but vertices And all of odd degree.’ William T. Tutte, in: Denés König – Theorie der endlichen und unendlichen Graphen, Teubner, 1986, risvolto di copertina.
«Questa me la segno per il prossimo compito in classe di matematica.» «Nella versione con otto ponti, soltanto due dei vertici hanno grado dispari. Allora si può trovare un cammino euleriano.»
Euleriano o non euleriano, questo è il dilemma
di volte. I gradi dei vertici sono allora la chiave per la soluzione del problema. Abbiamo così praticamente già dimostrato il teorema di Eulero:»
198 Alla ricerca della via più breve
«Oh sì, non è ancora possibile avere un circuito euleriano, ma si può ottenere un cammino euleriano. Sarà stato certamente questo il motivo per cui Loyd ha introdotto l’ottavo ponte: voleva una soluzione.» «Chissà. Qui sotto ho disegnato ancora una volta il grafo degli otto ponti. Sulla sua destra potete vedere un possibile cammino euleriano. Affinché fosse più agevole seguirne il percorso, ho tracciato in verde un’unica linea curva che lambisce i vertici.»
«E come si fa a trovare i cammini euleriani? Per il secondo grafo di Königsberg dovrebbe essere semplice, ma che succede se i grafi diventano grandi?» «Buona domanda! Finora abbiamo solo mostrato che non può esistere un cammino euleriano se ci sono più di due vertici aventi grado dispari. Dobbiamo però ancora dimostrare che con non più di due vertici di grado dispari un cammino euleriano esiste. Questo possiamo farlo con l’aiuto di un algoritmo che costruisce per noi un cammino del genere.» «È un algoritmo complicato?» «No, per niente. Per prima cosa scegliamo il vertice di partenza. Se ci sono due vertici di grado dispari, siamo costretti a scegliere uno dei due; diversamente, la scelta è libera. Partendo dal vertice iniziale, scegliamo un qualunque lato che ci porti su qualche altro vertice, da lì ne scegliamo un altro e procediamo in questo modo finché non si può più andare avanti. Se il grado del vertice raggiunto è pari, possiamo sempre uscirne percorrendo un lato non ancora utilizzato. Dopo aver lasciato il vertice di partenza, esiste solamente un vertice dal quale, alla
199
1
5 2
7
6
4 3
«Ma non sono stati percorsi tutti i lati del grafo!» «È vero, ma questo difetto si può correggere in fretta. Si sceglie come nuovo punto di partenza uno dei vertici lungo il cammino verde aventi ancora lati liberi e si fa ripartire l’algoritmo, procedendo in modo del tutto analogo sui lati grigi finché non è più possibile andare avanti. Per lo stesso motivo di prima, dobbiamo necessariamente terminare nel vertice dal quale questa volta siamo partiti. Otteniamo cioè un circuito aggiuntivo, che qui ho disegnato in rosso:»
4 1
2 3
«Ma così abbiamo due cammini invece di uno.» «È vero. Dobbiamo innestare il circuito rosso nel cammino verde. Per farlo, ricominciamo dalla partenza originaria e percorriamo il cammino verde fino al punto di inizio del circuito rosso; percorriamo dunque quest’ultimo per intero e riprendiamo il cammino verde da dove l’avevamo interrotto. Nel nostro esempio otteniamo già un cammino euleriano:»
Euleriano o non euleriano, questo è il dilemma
fine, non potremo più sfuggire: il vertice finale. Quando allora non è più possibile andare avanti, bisogna necessariamente aver raggiunto il vertice finale. Qui c’è un esempio. I numeri vicino ai lati indicano in quale ordine essi si succedono nel cammino verde.»
200 1
Alla ricerca della via più breve
9
2
4
11
10
5 6
7 8
3
«E se in un grafo più grande dovessero rimanere ancora lati non utilizzati? Ripeteremmo di nuovo questa procedura?» «Precisamente, la ripeteremmo quanto basta per coprire tutti i lati. Alla fine costruiamo sempre un cammino euleriano.» «Ora ho capito tutto. Prima si controllano i gradi dei vertici e se ce ne sono al massimo due di grado dispari, con questo algoritmo si trova un cammino euleriano. Oh, silenzio tutti! Credo che mia madre sia tornata a casa. Sarà meglio che smettiamo per oggi.» «E perché? Tua madre ha qualcosa contro Vim?» «No. Non sa nemmeno che esista! Però non le va a genio che io stia tutto il giorno seduta davanti al computer. Così cerco sempre di evitare che mi veda al monitor.» Rut non si era sbagliata. Sua madre aveva appena chiuso la portiera dell’auto ed aperto il baule. Jan e lei arrestarono in fretta il sistema e fecero come se avessero voluto lasciare la casa proprio in quel momento. «Ciao mamma.» «Ciao signorina, ciao Jan. Dove state andando?» «Volevamo andare un po’ fuori.» «Va bene, allora buon divertimento. Ma non tornare di nuovo tardi.» Rut e Jan pensarono a che cosa fare. Alla fine optarono per una piccola passeggiata e così, come aveva detto Jan con un sorriso ammiccante, andarono a girovagare un po’.
Eulero e Babbo Natale
Giunto a casa, Jan dovette subire l’assalto di Lukas che, tutto eccitato, gli corse incontro dicendo di aver imparato a disegnare la casa di Santa Claus in tanti modi diversi. A Jan questo non interessava un granché; che finisse pure con suo fratellino e la casa di Babbo Natale questa bella giornata. Ma poi fu come se improvvisamente gli si aprissero gli occhi. Ma certo! Lì dietro non si nascondeva nient’altro che Eulero! Il giorno dopo l’avrebbe chiesto a Vim. Il resto della serata lo passò insieme a Lukas. Disegnarono ripetutamente la casa di Babbo Natale, escogitando ogni sorta di varianti, cosicché Lukas, quando fu ora di andare a letto, sparì raggiante in camera sua con una intera pila di disegni. Nel frattempo Rut stava guardando la televisione in casa sua. I suoi genitori erano ad una cena d’affari con un gruppo di soci venuti dall’America e dopo la cena sarebbero andati a teatro.
Il Teatro Nazionale nella Max-Joseph-Platz
202 Alla ricerca della via più breve
Dopo il telegiornale, Rut navigò ancora in rete e poi andò abbastanza presto a letto. Per un poco rimase sveglia, pensando a quanto era stata bella quella giornata. Mercoledì Jan e Rut si erano dati appuntamento per le quattro del pomeriggio, perché prima Jan voleva andare a giocare a calcio. Quando Rut tornò da scuola, il pranzo era pronto. Sua madre le raccontò della cena d’affari della sera precedente e disse che era stata molto importante per la ditta di suo padre per via di un grosso incarico dall’America. Un incarico così importante che suo padre, quella stessa mattina, era dovuto partire per gli Stati Uniti e vi sarebbe rimasto una settimana intera. Come c’era da aspettarsi, non passò molto tempo prima che sua madre le chiedesse come fosse andato il suo pomeriggio con Jan. La mamma le raccontò anche del suo primo ragazzo e fu davvero un racconto interessante. Dopo le chiacchiere, Rut dovette affrettarsi per finire i compiti in tempo. Sua madre era seduta in giardino a leggere il giornale quando Jan arrivò. Perciò non lo udì nemmeno suonare il campanello. Rut, invece, era già in allerta. «Vieni dentro, Jan. Com’è andata la partita?» «Così così. Mi sono preso un calcio piuttosto brutto nel polpaccio.» «Eh già, tu zoppichi davvero. Aspetta, vado a chiedere a mia madre se abbiamo qualcosa per te.» Rut corse in giardino e vide che sua madre si era addormentata leggendo il giornale. «Mamma! Mi dispiace svegliarti, ma Jan è appena arrivato. Abbiamo da qualche parte un impacco freddo o qualcosa del genere per le contusioni?» «Sì, guarda nel congelatore, ce ne deve essere uno. Perché, si è ferito?» «No, niente di grave, ha solo giocato a calcio.» La busta per l’impacco era sotto i gelati. Che buffo, pensò Rut, non averla mai notata finora. Forse tutto era davvero geneticamente determinato. Vim le aveva pur spiegato, un paio di giorni
203
«Dai, prova con l’impacco. Il tuo infortunio un effetto positivo ce l’ha.» «E quale sarebbe?» «Perfino mia madre ammetterà che con un amico invalido la cosa migliore da fare è piazzarsi davanti al computer.» «Prendimi pure in giro! A proposito di computer, ieri ho scoperto qualcosa di interessante. Devo assolutamente raccontarlo a te e a Vim.» «Perfetto, anch’io ieri ho curiosato un po’ in Internet.» Entrarono nella camera di Rut. Mentre lei accendeva il computer, Jan diede un’occhiata ad alcuni dei suoi CD. «Basta poltrire! Sveglia Vim! Jan è di nuovo qui ed abbiamo entrambi in serbo qualcosa.» «Bene, bene. Allora sentiamo!» «Ieri ho cercato in rete qualcosa da leggere su Eulero. C’è così tanta roba che per leggerla tutta ci vorrebbe almeno una settimana!» «Oppure si affida agli apparentemente pigri software il compito di scegliere qualcosa al proprio posto! Una buona introduzione si può trovare al sito: www.students.trinity. wa.edu.au/library/subjects/maths/euler.htm. Non c’è tuttavia da meravigliarsi che esistano così tante pagine su Eulero. Egli, infatti, non solo è stato uno dei più grandi matematici, ma ha anche pubblicato una quantità folle di lavori: in tutto 886, tra articoli e libri. Dopo la sua morte, ci vollero ancora 30 anni prima che finalmente tutto fosse pubblicato. A Basilea, da molti anni, viene curata un’edizione integrale delle sue opere. Le prime tre parti dell’“Opera Omnia” constano di 72 volumi e il loro prezzo sfiora i 10.000 euro. Già nel 1975 venne pubblicato il primo volume della quarta parte, ma a tutt’oggi
Eulero e Babbo Natale
prima, che risiede nei geni la capacità innata di concentrarsi sulle cose essenziali della vita, come tigri feroci, gelati e cartine della metropolitana.
204 Alla ricerca della via più breve
non è ancora stata completata. L’incredibile versatilità di Eulero è mostrata anche dal fatto che espressioni come “teorema di Eulero” o “formula di Eulero” compaiono nei più disparati contesti. Una grossa parte dei suoi lavori, inoltre, fu prodotta quando lui era completamente cieco.» «Ma come? In matematica bisogna pur vedere quello che si fa. È impossibile che uno riesca a tenersi tutte queste cose in mente!» «Eulero era capace di farlo. Si racconta che due dei suoi studenti stessero litigando sul risultato di una difficile addizione. Dopo la somma di 17 termini, i due erano discordi sul valore della cinquantesima cifra decimale. Eulero avrebbe risolto il contenzioso semplicemente ricalcolando a mente il risultato.» «Caspita! Non solo doveva avere una memoria pazzesca, doveva anche possedere un’incredibile capacità di concentrazione.» «Oh sì. Ieri devo aver letto da qualche parte che, mentre lui lavorava, i suoi figli o i suoi nipoti spesso giocavano attorno a lui.» «È vero. Il suo collega Thiébault l’ha descritto con le seguenti parole:»
Un bimbo sulle ginocchia, un gatto sulle spalle, così scrive le sue opere immortali.
«Esattamente, intendevo proprio questa citazione.» «Hai visto che c’è perfino una banconota svizzera che lo ritrae? Sul sito www2.physics.umd.edu/˜redish/Money/ puoi anche vederla on-line. Sul retro compare una delle turbine ad acqua realizzate da Eulero, con un’efficienza pari a circa il 71 %. Anche le turbine odierne non superano di molto l’80 %. L’immagine del nostro sistema solare vuole ricordare i contributi di Eulero in astronomia.»
205 Eulero e Babbo Natale
Banca Nazionale Svizzera, banconota da 10 Franchi della sesta serie, 1976
«Ma perché una banconota svizzera? Pensavo che Eulero vivesse a Königsberg.» «No. La maggior parte della sua vita la passò a San Pietroburgo, ma era nato a Basilea.» «I dati biografici li ho trovati anch’io in rete, ma che tipo di uomo era veramente?» «Abbastanza fuori dal mondo, immagino.» «Non credo proprio. Nelle biografie viene descritto come una persona per niente complicata e ricca di humor. Ogni tanto diventava un po’ irascibile, ma sapeva anche ridere di se stesso. E l’invidia, comune anche tra gli scienziati più illustri, non sapeva proprio cosa fosse. Gioiva di ogni nuovo risultato e, di quando in quando, cedeva una scoperta a qualcuno dei suoi colleghi.» «Non era piuttosto un’eccezione che un genio simile si occupasse di un tema così ordinario come il problema dei ponti di Königsberg? I matematici sono il più delle volte piuttosto lontani dalle cose pratiche.»
206 Alla ricerca della via più breve
«Mi dispiace Jan, ma devo contraddirti di nuovo. Naturalmente Eulero ha condotto una quantità enorme di ricerca teorica, ma molti dei suoi lavori si occupano di temi come l’ottica, la nautica, l’acustica, l’idraulica e la musica. Quanto sia significativo il lavoro di Eulero, lo si riconosce anche dal fatto che molte delle notazioni matematiche da lui introdotte sono diventate standard e sono utilizzate ancora oggi. Sono suoi i simboli utilizzati per le costanti matematiche forse più interessanti in assoluto: la e per la base dei logaritmi naturali; π per la costante del cerchio; i per l’unità immaginaria, cioè per la radice quadrata di −1, un numero non reale che consentì di sondare per la prima volta connessioni profonde e universali nella matematica. La relazione forse più bella l’ha scoperta proprio Eulero stesso: una formula che unisce tutte e tre queste costanti in un modo così semplice ed elegante da essere scelta quale la più bella formula matematica di tutti i tempi:» ei π + 1 = 0
«Essere scelta? C’è un concorso di bellezza per le formule matematiche?» «La rivista “The Mathematical Intelligencer” nel 1988 sottopose ai suoi lettori una lista con 24 proposte da votare. Eulero si aggiudicò anche il secondo posto. La formula che arrivò decima era invece di Fermat, ma era stata dimostrata per la prima volta ancora da Eulero.» «Fermat? Ho già sentito questo nome.» «Suo è il teorema diventato famoso – chi l’avrebbe mai detto – col nome di “ultimo teorema di Fermat”:» xn + yn = zn non ha soluzioni intere per n maggiore di 2.
«Ricorda un po’ il teorema di Pitagora.» «Sì, per n = 2 si ottiene proprio la formula del teorema di Pitagora. Ma quest’ultima ha soluzioni intere. In un appunto a margine del libro che stava studiando, Fermat formulò il teorema scritto sopra, aggiungendovi la seguente frase:»
207
«Ancora latino!» «Vuol dire: “Di questo fatto ho trovato una dimostrazione veramente mirabile, ma il bordo del foglio è troppo esiguo per contenerla”. Purtroppo Fermat non scrisse nient’altro e la dimostrazione non si trovò neppure tra le sue carte. Così il teorema divenne un vero e proprio enigma col quale, per tre secoli e mezzo, si cimentarono invano tutti i più grandi matematici, Eulero compreso. Finalmente, nel 1994, Andrew Wiles riuscì a dimostrare il teorema. La storia di questa formula è divenuta così popolare che probabilmente adesso raggiungerebbe addirittura il primo posto nella classifica.» «Eulero conosceva la casa di Nikolaus?» «Vuoi dire il rompicapo per bambini col quale hai tenuto occupato tuo fratello domenica scorsa?» «Proprio quello: si deve disegnare la casa senza mai staccare la penna dal foglio.» «Adesso capisco cosa intendi. All’indirizzo www.mathema tische-basteleien.de/house.html c’è una buona descrizione e anche qualche ulteriore dettaglio. Mi chiedi se Eulero conoscesse questo indovinello? Non ne ho la più pallida idea.»
Eulero e Babbo Natale
Cuius rei demonstrationem mirabilem sane detexi hanc marginis exiguitas non caperet.
208 «In ogni caso Eulero l’ha risolto!» Alla ricerca della via più breve
«Jan, come può averlo risolto, se non lo conosceva neppure?» «E invece sì, Jan ha ragione. Guarda, devi solo ridisegnare la casetta così:» 2
4
4
3
3
«I numeri sarebbero i gradi dei vertici?» «Ma certo. Disegnare tutta la casetta di Babbo Natale senza interruzioni non significa altro che trovare un cammino euleriano in questo grafo.» «Allora in questo gioco bisogna sempre partire dal basso!» «Esattamente. Quella che io però preferisco è la rappresentazione di Gabriele Heider:»
c VG Bild-Kunst, Bonn 2001
209 «Questa sì che è tecnica! Letame di mucca su tela?»
«Mmm, adesso che dici “bio”, ho una fame da lupi! Vado a vedere cosa c’è in frigo?» «Ho un’idea migliore. Che ne dici se ti invito? Conosco un posto non lontano da qui dove fanno un Kebap super.» «Ma ce la fai a camminare con il tuo polpaccio?» «Certo! Un vero uomo non teme il dolore.» «Beh, prima non dicevi così.» «E cosa fai tu nel frattempo, Vim?» «Mentre voi vi date ai piaceri della tavola, io cercherò di risolvere gli ultimi grandi misteri dell’umanità.» «Esagerato!»
Eulero e Babbo Natale
«Certo! Biomatematica!»
Oggi girovaga la nettezza urbana
Per la sua relazione, Jan aveva un poco riadattato il testo trovato in Internet, ma nella sostanza l’aveva lasciato com’era. Purtroppo anche il signor Zweiholz navigava volentieri e, cosa ancora peggiore, anche lui aveva scoperto e letto la relazione. Beccato! Fortunatamente il signor Zweiholz non la prese troppo male. Egli era perfino un sostenitore delle ricerche su Internet. La pura copiatura, tuttavia, era troppo anche per lui. Poiché un’interrogazione accurata dimostrò che Jan, per lo meno, il testo l’aveva capito bene, il signor Zweiholz decise di lasciar perdere per questa volta. In futuro Jan avrebbe però dovuto utilizzare diverse fonti, indicandole esplicitamente. Rut non poté invece andare a scuola. S’era procurata una brutta distorsione scendendo le scale e sembrava che si fosse addirittura slogata una caviglia. Guarda caso, proprio dopo che anche Jan, il giorno prima, si era azzoppato. Sua madre la portò dal medico, il quale ridimensionò la diagnosi, dicendo che in fondo non era una cosa tanto grave. Al piede venne applicata una pomata e venne fasciato. L’allenamento in piscina, per quel pomeriggio, ovviamente saltò. Rut aveva previsto di passare da Jan dopo il nuoto, ma così fu di nuovo lui a venirla a trovare. «Di’ la verità che non avevi voglia di andare a scuola, eh?» «Dai, smettila!» «Va bene, volevo solo farti arrabbiare un po’. Stai almeno un po’ meglio?»
212 Alla ricerca della via più breve
«Il piede è ancora piuttosto gonfio, ma se lo lascio stare e non ci penso, me ne dimentico quasi. Dove sono i fiori e i cioccolatini?» «Fiori? Cioccolatini?» «Un uomo tipico, direbbe adesso la nostra vicina di casa.» «Ma come è successo?» «Tutto per una semplice storta! Oggi non se ne parla proprio di andare a girovagare.» «Beh, siccome siamo di nuovo capitati qui da te, possiamo almeno starcene in camera a sentire cosa ci racconterà Vim di nuovo. Che ne dici?» «Ci sto! Mentre accendo il computer potresti chiedere a mia madre se ha qualche cosa da rosicchiare per noi.» «Lo faccio subito.» Jan sparì per un istante e tornò con un grosso pacco di patatine. Poi accese il dispositivo di comunicazione. «Ciao Vim, come va con gli ultimi misteri del mondo?» «Ciao a tutti e due. Ho trovato la risposta.» «La risposta a cosa?» «La risposta a tutto, Rut!» «La risposta alla vita, all’universo e a tutto il resto?» «Sì.» «42!» «Ma allora lo conosci anche tu, Jan?» «È chiaro!» «Un momento! Siete diventati matti tutto in un colpo, voi due?» «No, no. Sembra comunque che a Vim piaccia leggere Douglas Adams tanto quanto a me.»
213
«La Guida Galattica per Autostoppisti.» «Sì, esatto. Forse dovrei leggerli anch’io prima o poi.» «Assolutamente! Adesso sul serio, Vim. La tua giovane nobiltà girovagante di Königsberg sarà anche simpatica, ma non mi può convincere che la matematica di Eulero è importante e che ha davvero un’utilità pratica.» «No, questo solo esempio non convincerebbe nemmeno me. Il problema dei ponti di Königsberg è una storiella carina. La questione di trovare un percorso attraverso tutti i lati di un grafo, fa capolino però anche in ambiti completamente diversi.» «Ad esempio?» «Stamattina dovrebbe essere passata la nettezza urbana, non è vero?» «Sì, ma perché lo chiedi sempre?» «Perché anche la nettezza urbana può utilizzare i risultati di Eulero!» «Come, scusa? La nettezza urbana mica va a spasso!» «Eccome, invece. In un certo senso, anche lei girovaga per le strade della città. I risultati di Eulero potrebbero essere impiegati con profitto nella raccolta dei rifiuti, per risparmiare molti soldi. Denaro che ogni cittadino deve pagare, sotto forma di imposte e tasse sullo smaltimento. Questo è importante per tutti, non più solamente per un paio di giovani a passeggio.» «Non ci capisco più un tubo.» «Immagina che ci sia un deposito, dal quale tu debba partire con il tuo camion dei rifiuti, per fare il giro della città. Immagina di dover percorrere tutte le strade del tuo distretto per svuotare i cassonetti dei rifiuti. Ad ogni incrocio hai la possibi-
Oggi girovaga la nettezza urbana
«Intendi il tipo che ha scritto quei libri di fantascienza completamente fuori dal comune? Come si chiamavano pure?»
214 Alla ricerca della via più breve
lità di scegliere come andare avanti nel tuo giro. Abbiamo già ottenuto un grafo:»
Deposito
«Ah, i lati simboleggiano le strade ed i vertici gli incroci. Questo l’ho imparato anch’io, nel frattempo.» «Allora è tutto chiaro! Si determinano semplicemente i gradi dei vertici e così si sa già se esiste un circuito di Eulero, cioè un percorso che passa per tutte le strade e alla fine fa ritorno al deposito.» «Ma fantastico! E se non c’è, la nettezza urbana sciopera finché i cittadini non soffocano sotto i loro rifiuti. Molto economico!» «Sì, in questo Jan ha ragione. La nettezza urbana deve viaggiare anche se non ha a disposizione un circuito di Eulero.» «Con calma. Non siamo ancora arrivati a questo punto. Dovremmo prima di tutto osservare meglio l’esempio che ho disegnato. Come avrete senz’altro notato, ho scelto per cominciare un grafo in cui tutti i vertici hanno grado pari. Dunque esiste un circuito di Eulero. Ma perché poi un circuito di Eulero dovrebbe essere d’aiuto agli addetti alla raccolta dei rifiuti?»
215
4
4 Oggi girovaga la nettezza urbana
4 4
Deposito
6
2 4
4 4
4
4
4
«Ma è chiaro. La nettezza urbana deve passare per tutte le strade della città a svuotare i cassonetti. Se lo fa lungo un circuito di Eulero, non percorre un solo metro in più del necessario. Se invece non segue un circuito di Eulero, deve ripercorrere una parte delle strade più di una volta, dalla seconda volta in poi senza più dover svuotare i cassonetti.» «Ottimo! Ogni lato deve essere percorso almeno una volta ed in un circuito di Eulero nessun lato viene percorso una seconda volta. Se allora tutti i vertici hanno grado pari, ogni cammino di Eulero è un percorso ottimale per la raccolta dei rifiuti urbani.»
4
4
4 4
Deposito
6
2 4
4 4
4
4
4
216 Alla ricerca della via più breve
«Non credi che si possa arrivare a trovare questo percorso anche senza Eulero? Se il grafo è euleriano, un circuito di Eulero si trova in fondo abbastanza facilmente.» «È certamente possibile, Jan. Ma grazie ad Eulero, chi si occupa della definizione dei percorsi nella raccolta cittadina dei rifiuti sa anche esattamente quando non c’è speranza di trovarne uno. Inoltre sarà difficile avere una città in cui in ogni incrocio confluiscono sempre un numero pari di strade. Una cartina realistica conterrà piuttosto un certo numero di biforcazioni e, soprattutto, di vicoli ciechi. Essa potrà ad esempio apparire così:» 5
Deposito
1
2 3
5
4
1
6 5 4
5
4
4
4 3 1
3 6
«Ma allora non esistono circuiti euleriani ed i risultati di Eulero non sono più di alcun aiuto per la nettezza urbana. Bisognerà pur svuotare i cassonetti anche nei vicoli ciechi; lì non resta che tornare indietro per la stessa via già percorsa. Ciò significa usare il lato corrispondente due volte!» «Piano, Jan. È vero che in questo grafo non ci sono circuiti euleriani, tuttavia il teorema di Eulero ci aiuta.» «E come? Con così tanti vertici di grado dispari non c’è neppure un cammino di Eulero.»
217
«Viaggi a vuoto?» «Per poter uscire da un vertice di grado dispari, dopo aver già percorso tutti i suoi lati, abbiamo bisogno di un viaggio aggiuntivo su uno o più dei lati già visitati. Lungo questo spostamento, tuttavia, non compiamo più alcun lavoro, visto che i cassonetti delle rispettive strade sono già stati svuotati precedentemente. Ecco perché lo chiamo un viaggio a vuoto.» «E nel fare questo viaggio extra, si vorrà naturalmente percorrere meno strada possibile.» «Precisamente. Si pone allora la questione di come minimizzare i viaggi a vuoto. Sul tempo di svuotamento dei cassonetti, non possiamo guadagnare niente. Non importa infatti che percorso seguiamo: i cassonetti da svuotare sono sempre gli stessi e per svuotarli ci vuole sempre lo stesso tempo. Tuttavia a causa di viaggi a vuoto inutili possiamo perdere molto tempo. Detto in un altro modo: grazie ad un buon percorso, con viaggi a vuoto i più brevi possibili, si può risparmiare molto tempo e cioè denaro.» «Dobbiamo allora minimizzare la lunghezza totale dei viaggi a vuoto.» «Già. Qui sono plausibili di nuovo molti pesi diversi per i lati. Può avere senso considerare il tempo necessario per compiere il viaggio a vuoto, ma si può anche pensare alla lunghezza del tratto da percorrere oppure ai costi del viaggio. Per non confondere i pesi dei lati nei viaggi a vuoto con quelli originari che contemplavano anche il costo dello svuotamento – che ai fini dell’ottimizzazione non importa più – ho colorato i pesi a vuoto in verde:»
Oggi girovaga la nettezza urbana
«La domanda decisiva è proprio: come trattiamo questi vertici che sono critici per la ricerca del percorso ottimale? La risposta ha un nome: con i viaggi a vuoto.»
218 Alla ricerca della via più breve
4
3 3
7
4
4 4 4
4
2 6
6
3
5 3
3
3
2
5
3
2
2
5
1
3
2
2
1
5
3
Deposito
5 2
2
4
2
5
4
5 5
2
4
4 3
4
3 1
2
6
3
3
3
«Perché hai colorato di rosso una parte dei vertici?» «Sono i vertici di grado dispari. Dobbiamo riuscire a neutralizzarli!» «Cosa intendi con “riuscire a neutralizzarli”?» «Abbiamo constatato che solo i vertici di grado dispari ci creano difficoltà. Nei vertici di grado pari si entra e si esce tutte le volte che serve, fino ad estinguere tutti i lati. In ciascuno dei vertici di grado dispari, invece, bisogna usare almeno un lato due volte. Se ora disegniamo due volte nel nostro grafo questi lati da ripercorrere, eleviamo di un’unità il grado di entrambi i loro estremi ed il vertice che prima aveva grado dispari ha adesso grado pari.»
Viaggio a vuoto 1
2
219
«Questo è vero. Finché il nostro viaggio a vuoto va da un vertice di grado dispari ad un vertice di grado pari, avremo sempre lo stesso numero di vertici critici di prima. La cosa più semplice sarebbe che i viaggi a vuoto collegassero sempre due vertici vicini di grado dispari. Tuttavia non sempre c’è una coppia di questi vertici con un collegamento diretto tra loro, come si vede in questo esempio:» 4
1
4
4
4
3
4
«Cosa possiamo fare allora?» «Semplicissimo! Facciamo un viaggio a vuoto da un vertice critico all’altro. Poiché tutti i vertici intermedi su questo cammino vengono raggiunti e di nuovo lasciati, il loro grado si innalza di 2 e così i vertici di grado pari mantengono questa proprietà.» 4
2
6
6
6
4
4
«Capisco. Ad ogni vertice critico abbiamo bisogno di un viaggio a vuoto e un simile viaggio lo compiamo possibilmente tra due di questi vertici critici, per prendere due piccioni con. . . un viaggio solo.»
Oggi girovaga la nettezza urbana
«Questo allora intendi con “neutralizzare”. Ma se l’altro estremo aveva prima grado pari, adesso diventa dispari e non abbiamo guadagnato niente.»
220 Alla ricerca della via più breve
«Giusto. Ci servono viaggi a vuoto tra coppie di vertici di grado dispari. Vi ricordate che il numero dei vertici di grado dispari era sempre pari?» «Ma certo. L’avevamo dimostrato per mezzo dell’induzione totale.» «L’induzione completa! Essendo il numero dei vertici critici sempre pari, possiamo associarli a due a due, formando coppie di vertici partenza-traguardo. Nel nostro grafo originario questo potrebbe essere fatto ad esempio così:» 3
6
3
Deposito 2
2
2
2
6
4
3
2
4
3
2
2
2
7
5 3 4 4
6
3 2
5 2
4
2
6
4
5 5
2
4
4 3
4
4 2 2
6
8
6
4 3
4
3
8
3
4 3
«Va bene, qui è sempre chiaro, ma non in ogni grafo si può riconoscere altrettanto facilmente lungo quali vie condurre al meglio i viaggi a vuoto, giusto?» «Sì, qui sorge il nostro problema di ottimizzazione. Come possiamo minimizzare i costi dei viaggi a vuoto?» «Dobbiamo trovare il modo complessivamente più economico di appaiare i vertici critici.» «Esattamente, Rut. Per farlo, creiamo per prima cosa un nuovo grafo che contenga solo i nostri vertici critici, cioè quelli di
221
17
11
10
8
«Un bel groviglio di lati! Come può aiutarci un grafo così?» «Nel nuovo grafo, i lati simboleggiano tutti i possibili viaggi a vuoto tra i vertici critici. Naturalmente, nel grafo originario non sempre c’è un lato tra due di questi vertici. Quando decidiamo di fare un viaggio a vuoto tra due vertici rossi, tentiamo di farlo seguendo un cammino minimo. Come pesi dei lati nel nuovo grafo che ho disegnato qui sopra prendiamo allora sempre la lunghezza di un cammino minimo tra i rispettivi vertici nel grafo di partenza. In modo che si potesse ancora riconoscere qualcosa, ho aggiunto qualcuno di questi nuovi pesi, stavolta in rosso, per distinguerli dai pesi verdi del grafo originario. Il 10, ad esempio, deriva dalle lunghezze 4, 4 e 2 dei tre lati che formano il cammino minimo tra questi due vertici critici nel grafo di partenza.» «Ciò significa che diamo ai lati del nuovo grafo, come peso, la lunghezza del cammino minimo tra i vertici corrispondenti nel grafo originario delle strade. Ma allora, a partire da ogni
Oggi girovaga la nettezza urbana
grado dispari. Il nuovo grafo sarà inoltre completo, che significa che tra ogni coppia di vertici del grafo c’è un lato che li congiunge.»
222 Alla ricerca della via più breve
vertice, dobbiamo risolvere tanti problemi di cammino minimo quanti sono i vertici da raggiungere. E questo per ogni vertice!» «Solo per i vertici critici, cioè per quelli rossi! Tuttavia possono essere tanti anche questi.» «Io non ho ancora capito perché abbiamo bisogno di questo nuovo grafo.» «Nessun problema. Dunque, stiamo cercando il modo migliore di effettuare i viaggi a vuoto tra coppie di vertici di grado dispari. Se nel grafo iniziale aggiungiamo una seconda volta i lati che usiamo in questi viaggi a vuoto, tutti i vertici critici vengono “neutralizzati” e ogni vertice del grafo avrà grado pari. Possiamo così trovare finalmente un circuito di Eulero. Nel nostro nuovo grafo, ogni singolo lato sta per un intero viaggio a vuoto. Non ci resta che risolvere un problema di accoppiamento in questo grafo per poter scegliere i viaggi a vuoto in modo ottimale, cioè con una lunghezza complessiva la più piccola possibile.» «Un problema di accoppiamento? Ma che roba è? Suona in qualche modo interessante!»
La stagione delle coppie
«Eh già, avete ragione. Cosa sia un problema di accoppiamento non ve l’ho ancora spiegato. Rimedio subito!» «Siamo tutt’orecchi!» «Incominciamo con il problema di accoppiamento bipartito, meglio noto come problema di assegnamento. Rut, tu sei sempre un’ottima nuotatrice, vero? Immagina allora che tu e le tue compagne vogliate partecipare alla prossima staffetta mista 4 × 100 metri.» «Non abbiamo mai nuotato in una staffetta mista, ma sarebbe sicuramente divertente. Comunque non abbiamo una grande scelta. Tra le ragazze siamo infatti solo in quattro a partecipare alle gare.» «Rimane tuttavia da decidere quale disciplina assegnare a ciascuna di voi.» «Questo non è per niente facile. Karla è la migliore in tutte le specialità, mentre Ines, Tanja ed io siamo circa alla pari praticamente ovunque. Solo in delfino Ines è un po’ più debole.»
224 Alla ricerca della via più breve
«Saprai bene che, quando si tratta di vincere, anche la più piccola differenza può essere importante. Proviamo allora a rappresentare il problema con un grafo:» Nuotatrice
Disciplina
Karla
Dorso
Ines
Rana
Tanja
Delfino
Rut
Stile Libero
«Dunque assegni un vertice ad ogni nuotatrice e ad ogni disciplina. Ma cosa significano i lati nel tuo grafo?» «Ogni lato rappresenta la possibile attribuzione di una disciplina del nuoto ad una nuotatrice. Il lato che va da “Karla” a “Dorso”, ad esempio, significa che Karla può nuotare a dorso. In questo modo il nostro problema di assegnamento diventa un problema di scelta di lati. La domanda adesso è: in che modo possiamo scegliere 4 dei 16 lati in questo grafo per ottenere la miglior combinazione possibile?» «Per decidere quali abbinamenti è meglio fare, abbiamo però bisogno di un qualche criterio!» «Naturalmente. Per questo prendiamo i tempi che Rut e le sue compagne di team hanno raggiunto finora nelle diverse discipline. Affinché il tutto rimanesse leggibile, non ho scritto i tempi direttamente sui lati, ma a fianco delle nuotatrici:»
225
Ines
Tanja
Dorso 1:13.5 1:20,0 1:17,0 1:04,5
1:14.0 1:20,5 1:13,0 1:04,0 Rut
Rana
Delfino 1:13.0 1:20,5 1:12,5 1:03,5
Stile libero
«E da dove hai tirato fuori i nostri tempi?» «La vostra Unione Sportiva ha una Homepage, dove è possibile leggere i risultati di tutte le vostre gare. Ho fatto la media dei tempi in gara di ognuna di voi. Spero, con queste valutazioni, di non essermi sbagliato di molto.» «No, i tempi vanno benissimo. Forse nel frattempo siamo leggermente migliorate. Ultimamente ci siamo allenate molto, ma vai a sapere se anche in gara questi progressi si noteranno. I diversi colori vorranno senz’altro indicare a quale disciplina i tempi si riferiscono. Adesso, allora, non resta che scegliere la miglior combinazione di quattro lati, giusto?» «Una combinazione tale che da ogni nuotatrice esca un lato solo.» «È chiaro, deve essere una staffetta. Karla non può nuotare da sola, pur essendo la più veloce in assoluto.» «E siccome si tratta di una staffetta mista, anche in ogni disciplina del nuoto deve arrivare un lato.» «È logico, altrimenti nessuna di noi, potendo scegliere, nuoterebbe a rana.» «Questo problema si potrà risolvere certamente con uno di quegli algoritmi ingordi, non è vero?»
La stagione delle coppie
Karla
1:11.5 1:18,5 1:09,5 1:01,5
226 Alla ricerca della via più breve
«No Jan, l’algoritmo greedy qui non fornisce la combinazione ottimale. I 100 metri più veloci in assoluto sono quelli di Karla in stile libero. A questi, l’algoritmo greedy farebbe immediatamente seguire il tratto a delfino di Rut ed il tratto a dorso di Ines. Alla fine, a Tanja non resterebbe che nuotare a rana. In questo modo la staffetta raggiungerebbe un tempo complessivo di 4 minuti e 48 secondi. Tuttavia la soluzione ottimale prevede invece che Rut cominci nuotando i suoi 100 metri a dorso, che Ines e Karla la seguano rispettivamente a rana e delfino e che Tanja concluda con i 100 metri in stile libero. In questa disposizione ci si può attendere dal team un tempo complessivo di 4 minuti e 46,5 secondi.»
K 1:01,5
Do
K 1:09,5
Do
I
1:13.5
R
I
1:20.0
R
T
1:20,5
De
T
1:04,0
De
R
1:12,5
S
R
1:13,0
S
4:48,0
4:46,5
«Un secondo e mezzo in meno! Può davvero voler dire qualcosa. Inoltre io nuoto in ogni caso più volentieri a dorso ed essendo la prima a partire, non dovrei più concentrarmi su quello stramaledetto cambio.» «Okay Vim, hai ragione. Però non ci vuole molto per calcolare quel paio di combinazioni possibili per trovare i migliori accoppiamenti.» «Attenzione! Per una staffetta mista con quattro persone può anche essere vero, tuttavia con problemi più grossi potresti avere delle difficoltà.» «Staffette più grandi di così?» «Fai finta di essere il capo di una azienda di lavoro interinale, una di quelle ditte che mandano persone a lavorare a giornata
227
Persone
Lavori
«Però con molti vertici in più!» «Sicuramente, almeno se alla ditta di lavoro interinale gli affari vanno bene. Se ogni persona può fare qualunque lavoro, con n persone e n lavori i modi possibili di fare gli accoppiamenti sono in tutto n · (n − 1) · (n − 2) · . . . · 2 · 1.» «Perché proprio così?» «Pensaci. Quanti modi ci sono di assegnare alla prima persona – chiamiamola Andrea – uno degli n lavori?» «Beh, n naturalmente!»
La stagione delle coppie
in altre aziende, negli stand di fiere e così via. In uno schedario hai registrato un determinato profilo professionale per ciascuna delle persone in cerca di lavoro. Fino alle ore 18 arrivano le richieste delle aziende e, per rispondere a tutte in tempo, devi decidere il più velocemente possibile chi, il mattino seguente, deve essere mandato a chi. Scriviamo allora le persone da una parte e le aziende dall’altra, rappresentando tutti con vertici. Ai lati tra lavoratori e lavori viene attribuito un peso basandosi sul profilo professionale che permette di valutare quanto il lavoratore sia adatto a ciascuno dei lavori disponibili. Otteniamo così esattamente un problema di accoppiamento come con la staffetta mista.»
228 Alla ricerca della via più breve
«E se abbiamo già assegnato un lavoro ad Andrea, quante possibilità restano per Bruno, il secondo lavoratore?» «Tutti i lavori tranne quello che ha già Andrea.» «Dunque n−1. Ma così fanno in tutto già n·(n−1) modi diversi di attribuire un lavoro ad Andrea e Bruno.» «Ah, adesso mi ricordo. Una cosa del genere l’abbiamo imparata a scuola in matematica. Per la terza persona si aggiunge un fattore n − 2 alla catena e così via, finché la penultima persona può scegliere tra 2 soli lavori e all’ultima non resta che accettare quell’unico che rimane.» «Benissimo. In tutto fanno cioè n · (n − 1) · (n − 2) · . . . · 2 · 1 modi diversi. Questo prodotto si indica brevemente con la notazione n! che si legge n fattoriale. Con 10 persone e 10 lavori, le 10! combinazioni possibili ammontano già a più di 3,6 milioni.» «Puah! Ma questa è l’esplosione combinatoria di cui mi ha già parlato Rut.» «È proprio lei! Ci sono tuttavia algoritmi con i quali è possibile risolvere questo problema in un tempo accettabile.» «In un tempo accettabile? A quale dei nostri raccoglitori appartengono allora questi algoritmi?» «I migliori nel raccoglitore O(n3 ).» «In una ditta simile, che fa da mediatrice tra lavoratori e aziende, senz’altro arriveranno di continuo sempre nuove offerte e richieste. Alcuni lavori dureranno poi più di un giorno e certe persone potrebbero voler fare più di un lavoro al giorno.» «Tutto ciò è possibile. Bisogna naturalmente adattare il modello matematico. In questo modo, questi modelli diventano spesso notevolmente più complicati. Se poi dobbiamo assegnare una parte dei lavori già prima che sia arrivata l’ultima offerta, si parla di problema on-line. È interessante notare che il problema non diventa più complicato nel caso di lavori che necessitano contemporaneamente di più di una persona. Si ha in questo caso un problema di trasporto che può essere risolto in modo del tutto analogo al problema di assegnamento.»
229
«Il nome “problema di trasporto” deriva dalla seguente interpretazione. Ammettiamo che i vertici di sinistra non rappresentino persone, ma produttori di – mettiamo – gessetti bianchi per la scuola e che i vertici di destra siano scuole che acquistano i gessi dai produttori. Oltre a ciò, in ogni vertice c’è un numero che diProduttori Scuole ce, a sinistra, quante (quantità disponibile) (fabbisogno) scatole di gessi il corri35 spondente produttore può fornire e, a destra, quante scatole quella 20 scuola richiede. I pesi 3.000 dei lati qui rispecchiano i costi di trasporto 25 tra i rispettivi produt5.000 tori e consumatori. Se vogliamo coprire tutte 40 le richieste delle scuole minimizzando i co8.000 sti di trasporto, otte25 niamo un problema di trasporto.» «Molto bene. Ha qualcosa a che fare con il nostro problema dell’assegnamento dei lavori?»
15
«Certo. Se a fianco di ogni lavoro annotiamo la quantità di forza lavoro che esso necessita, abbiamo già formulato un problema di trasporto nel quale ogni produttore – il lavoratore – fornisce esattamente un’unità di forza lavoro e ogni consumatore – l’azienda – necessita di un determinato numero di queste unità. Le unità da “trasportare” sono le prestazioni di lavoro occasionale.» «Ci sono anche lavori che richiedono solo poche ore ed è allora eventualmente possibile assegnare allo stesso lavoratore più di un lavoro nell’arco della stessa giornata.»
La stagione delle coppie
«Perché un problema di trasporto? Non vogliamo trasportare un bel niente.»
230 Alla ricerca della via più breve
«Se non ci sono vincoli sull’ordine di esecuzione dei diversi lavori, tutto ciò si lascia inquadrare tranquillamente nel problema generale del trasporto. Non appena però intervengono altre condizioni, come ad esempio il fatto che determinati lavori vadano terminati prima di poterne cominciare altri, il problema diventa notevolmente più difficile.» «Andiamo avanti o no con la faccenda del trasporto dei rifiuti?» «Subito. Finora abbiamo affrontato solo il problema di accoppiamento bipartito. L’espressione “bipartito” indica la ripartizione dei vertici in due gruppi, come le persone ed i lavori nel problema dell’agenzia interinale, oppure le ragazze e le discipline del nuoto nella staffetta mista.» «Capisco. Un gruppo di vertici a sinistra ed uno a destra, come ragazze e ragazzi nel corso di ballo.» «Sì, ma spostare una parte dei vertici a destra ed un’altra a sinistra è sempre possibile. Per avere un grafo bipartito è importante invece che non ci siano lati tra due vertici che si ritrovano dalla stessa parte.» «Ma è chiaro! Vogliamo assegnare lavori a persone.» «Giusto. I vertici di grado dispari nel problema della nettezza urbana, tuttavia, non si possono ripartire in due gruppi simili. Nel grafo dei viaggi a vuoto, completo sui vertici critici, c’è un lato addirittura per ogni coppia di vertici. Qui abbiamo un problema degli accoppiamenti generale e cioè tale che i vertici non sono necessariamente divisibili in due gruppi privi di lati al loro interno. I problemi di accoppiamento, siano essi bipartiti o no, nella letteratura specialistica vengono chiamati anche problemi di matching.» «Il problema non bipartito è più difficile da risolvere di quello bipartito?» «Sì e no. Il cosiddetto algoritmo blossom per il problema di matching generale sta nel raccoglitore O(n3 ) esattamente come i migliori algoritmi per la versione bipartita del problema. Nonostante Jack Edmonds, al quale l’algoritmo risale, abbia
231
«Che belle figure!» «Questo metodo “dei cerchi colorati” funziona purtroppo solamente con le distanze in linea d’aria. Le distanze nel nostro grafo ausiliario sui vertici critici per il problema della nettezza urbana non corrispondono tuttavia quasi mai alle distanze in linea d’aria.» «Senti, Vim, ti credo quando dici che abbiamo il problema in pugno, ma il seguito della tua storia di collaboratori ecologi-
La stagione delle coppie
messo in circolazione i suoi “fiori” già nel 1965 – “blossom” in inglese vuol dire appunto “fiore” –, ancora oggi molte persone ritengono che il suo algoritmo sia uno dei più difficili tra i procedimenti non esplosivi. Nel caso di distanze in linea d’aria tra vertici, potete ancora una volta osservare una versione speciale dell’algoritmo in funzione all’indirizzo www.math. sfu.ca/˜goddyn/Courseware/Visual_Matching.html. Sullo stesso sito avevamo da poco trovato i bei disegni generati dall’algoritmo di Kruskal per gli alberi generatori. Anche nel problema del matching l’algoritmo “visivo” costruisce una soluzione gonfiando dei cerchi attorno ai vertici finché non vengono toccati altri cerchi o vertici. Tuttavia i due algoritmi sono completamente diversi. Il matching minimale trovato, cioè il modo di abbinare i vertici a due a due che consente complessivamente la minima distanza in linea d’aria, si riconosce qui dai lati disegnati in grassetto:»
232 Alla ricerca della via più breve
ci forse è meglio che ce lo racconti domani. Altrimenti io oggi faccio indigestione!» «Okay.» Rut avrebbe preferito sapere subito come sarebbe andata a finire la storia, ma anche Jan aveva ragione. Quando la concentrazione cala, tutto sommato è meglio smettere. Rut, comunque, lo convinse ancora a provare di persona l’applet Java che Vim aveva mostrato loro. Così tentarono insieme di generare disegni sempre più belli. Anche solo stando a guardare, ricavarono man mano un’impressione di come l’algoritmo facesse crescere i suoi cerchi. Dopo aver chiacchierato ancora a lungo, Jan fece per tornare a casa sua, ma riuscì ad arrivare solo al corridoio: la madre di Rut lo intercettò e, su due piedi, lo invitò a cena. Rut, a tutta prima, non ne fu per niente entusiasta. Temeva che sua madre l’avrebbe assillato con domande penose. Per fortuna i timori di Rut erano infondati. Sua madre e Jan dimostrarono di intendersi a meraviglia.
Posta dalla Cina
Il mattino seguente, il piede di Rut era già migliorato notevolmente. Ovviamente dovette raccontare ai compagni di classe del suo piccolo “incidente” e, come già aveva temuto, le toccò sopportare in cambio ogni sorta di burle. Nell’intervallo incontrò Tanja, proveniente dalla classe a fianco. L’allenamento di nuoto si era svolto come al solito. Tanja trovò comunque molto avvincente l’idea di nuotare per una volta tutte e quattro in una staffetta mista. Dopo la scuola, Rut e Jan fecero un salto in centro. Quella sera stessa sarebbero andati alla festa di Martina e ancora non avevano un regalo per lei. Rut, veramente, aveva già pensato ad una
234 Alla ricerca della via più breve
bella maglietta, ma tutte quelle che le piacevano costavano troppo. Dopo il quarto negozio, ci rinunciò. Non perché le facesse male il piede, ma perché non voleva tormentare troppo Jan, costringendolo a seguirla in altri negozi di vestiti. Il suo volto cominciava già a tradire i primi segni di sofferenza. Ragazzi e shopping! Comprarono così un CD con una raccolta di ballate del gruppo preferito di Martina. Le sarebbe piaciuto di sicuro anche questo regalo. In più la musica lenta era l’ideale per ballare. Jan aveva già avvisato i suoi genitori che dopo la scuola sarebbe andato a fare compere e che da casa di Rut si sarebbe recato direttamente alla festa. Grazie al cielo era venerdì e il giorno dopo avrebbe potuto dormire. Per i compiti, poi, c’era tutto il fine settimana. Giunti a casa di Rut, dovettero bere subito qualcosa, per riprendersi dalle fatiche dello shopping. Prima di accendere Vim, Rut controllò la posta elettronica. Aveva ricevuto due nuovi messaggi. Il primo era del papà dall’America. Laggiù tutto procedeva secondo i piani e suo padre le chiedeva di dare alla mamma un grosso bacio da parte sua. Rut stampò la lettera, per poterla far vedere a sua madre più tardi. Il secondo messaggio, invece, era alquanto misterioso. A giudicare dal mittente, sembrava provenire dalla Cina, per il resto conteneva caratteri indecifrabili, forse appunto cinesi. Rut era confusa. Chi poteva averle scritto dalla Cina? E perché? Suo padre aveva forse fatto una visitina oltre il Pacifico? No, era impossibile. E se anche fosse stato in Asia, non le avrebbe certo scritto in cinese! Ma allora chi? Forse quella email non era destinata a lei, o magari era uno di quei virus che si diffondono per posta. Jan propose di domandare a Vim se era in grado di stabilire la provenienza del messaggio. «Ciao Vim!» «Ciao Rut! Posta dalla Cina?» «Come, prego? Non avrai mica letto per caso le mie e-mail? Ti avevo già detto che non è roba che ti riguarda!»
235 «Non l’ho fatto neanche per sogno!»
«Perché l’ho scritta io, così, per farti uno scherzo!» «Questo poi è il colmo! Sta’ attento che non mi venga voglia di rifilarti un virus, magari uno di quelli dalla Cina! Vim, dicci piuttosto se adesso, dopo l’incursione nel problema del matching, abbiamo tutto quel che serve per la nostra raccolta dei rifiuti.» «Sì, se mi credete sulla parola quando vi dico che il problema generale del matching può essere risolto in modo efficiente, non ci resta che assemblare il tutto, rimettendo ogni cosa al sul posto. A proposito, in letteratura questo problema va sotto il nome di problema del postino cinese.» «Ah, ecco la ragione del tuo piccolo scherzo. Scusa se non l’ho capito subito. All’inizio ho avuto davvero paura di aver preso un virus.» «Nessun problema, non ti preoccupare. Il tuo timore, per di più, non è per niente infondato quando si ricevono e-mail “forestiere”.» «Da dove viene lo strano nome del problema? Immagino che anche in Cina i cassonetti non siano svuotati dai postini.» «No, questo problema è stato introdotto nel 1962 dal cinese Mei-Ko Kwan. È chiamato in quel modo perché anche i postini devono percorrere tutte le strade della città, esattamente come i loro colleghi del servizio di raccolta dei rifiuti. Lo stesso vale anche per i mezzi spazza-neve, per le pulizie stradali e per altri analoghi servizi.» «Allora può servire anche a me, quando vado a consegnare i giornali.»
Posta dalla Cina
«Come fai allora a sapere che ho ricevuto una e-mail dalla Cina?»
236 Alla ricerca della via più breve
«Certamente. Devi solo predisporre correttamente il tuo grafo. Ecco qui l’algoritmo:» Algoritmo per il problema del postino cinese Input: Grafo pesato G = (V, E) Output: Cammino chiuso di lunghezza minima che contiene tutti i lati di G 1o Passo: Determinare l’insieme V dei vertici di grado dispari in G; 2o Passo: Determinare la lunghezza dei cammini minimi tra due qualsiasi vertici v, w di V ; 3o Passo: Determinare, rispetto a queste lunghezze, un matching ottimale M nel grafo completo G sui vertici di V ; 4o Passo: Costruire, a partire da G e dai lati di G che appartengono ai cammini del matching M, il grafo multiplo G ; 5o Passo: Trovare un circuito di Eulero in G .
«Aspetta un momento! È diverso dagli algoritmi che mi hai mostrato fin qui.» «Stavolta l’ho scritto in modo informale, considerando il fatto che non abbiamo neppure mai discusso in dettaglio i particolari formali del terzo passo. Se volete, possiamo guardare insieme l’algoritmo, per essere sicuri che tutto sia chiaro.» «Le prime due righe vogliono dire che l’algoritmo riceve in ingresso la nostra rete stradale e restituisce in uscita il miglior percorso che copre tutte le strade, o mi sbaglio?» «Giusto. È importante, in questo, che venga fornito un cammino chiuso, cioè un percorso che alla fine torni al punto di partenza. Dopo il nostro giro vogliamo pur sempre fare ritorno al deposito. Come si va avanti?» «Nel primo passo dell’algoritmo, determiniamo innanzitutto i vertici di grado dispari, che sono quelli problematici, da congiungere con viaggi a vuoto. . . »
237
«Fantastico! Sì, le lunghezze dei cammini minimi tra due vertici critici qualsiasi v und w vengono usate come pesi nel nuovo grafo G . Tu te lo ricordi, Jan?» «Ma certo! Era il grafo per il quale avevamo dovuto risolvere il problema del matching. E questo è proprio ciò che succede nel terzo passo dell’algoritmo.»
«Sì, precisamente. Qui ho già colorato di rosso i lati del matching ottimale in G . Ad ogni lato del matching corrisponde sempre un cammino minimo tra gli stessi due vertici nel grafo iniziale, cioè un viaggio a vuoto. Il quarto passo significa semplicemente che adesso dobbiamo aggiungere ancora una volta i lati di questi percorsi a vuoto al grafo G. In questo modo, tutti i vertici avranno grado pari ed otteniamo così un grafo euleriano G .»
Posta dalla Cina
«. . . e nel secondo passo troviamo i cammini minimi tra tutte le coppie di questi vertici critici. Le lunghezze di questi cammini ci servono come pesi per i lati del grafo ausiliario sui vertici critici.»
238 6
Deposito
2
Alla ricerca della via più breve
2 4
6
4
2
8 6 4
6
4
4
6 4 4
2 8
«Capisco. Avendo innestato una seconda volta i percorsi a vuoto nel nostro grafo, al quinto passo non resta che trovare un circuito di Eulero in questo grafo ampliato.» «Sì. Ho dato qui di seguito una direzione alla mia soluzione nonostante il nostro grafo non fosse diretto, solo perché fosse più facile seguirne il percorso. Si può naturalmente raccogliere l’immondizia anche nel senso inverso.» 6
Deposito
2
2 4
6
4
8
2 6 4
6
4
4
6 4 2
4 8
239
«Se vuoi. È tuttavia possibile distribuire i viaggi a vuoto in modo ancora più uniforme lungo il percorso:»
6
Deposito
2
2 4
6
4
2
8 6
6
4
4
4
6 4 2
4 8
«Non avevi detto che i viaggi a vuoto vanno fatti sempre tra due vertici di grado dispari?» «Sì e lo facciamo anche adesso, ma non più in una volta sola. Non appena abbiamo introdotto nel grafo i lati dei viaggi a vuoto, possiamo usare qualsiasi circuito di Eulero come percorso per svuotare i cassonetti. Volete sentire un’altra applicazione del problema del postino cinese?» «Ma certo!» «Sapete cos’è un plotter?» «Harry Plotter?» «Simpaticona. Allora, ne avete già visto uno o no?»
Posta dalla Cina
«Hai distribuito i viaggi a vuoto in modo abbastanza equilibrato. L’hai fatto in modo che gli addetti alla nettezza urbana non arrivino troppo sudati?»
240 «Io no e tu, Jan?» Alla ricerca della via più breve
«Non sono quegli affari che si usano per disegnare delle curve di qualche tipo? Oggi si fa molto meglio con le normali stampanti, non è vero?» «Beh, dipende sempre da che cosa si deve disegnare. Grossi disegni tecnici fatti di tante linee sottili, nei quali il foglio rimane per il resto relativamente vuoto, possono essere disegnati meglio con un plotter che ha una punta o un beccuccio che si muovono esattamente lungo le linee, piuttosto che con una stampante che depone singoli punti andando sempre a capo riga per riga.» «Okay, ma cosa c’entra con il problema del postino cinese?» «Con calma. Secondo te un plotter come traccerebbe questo disegno?»
«Disegnando prima un quadrato e poi l’altro.»
«Che ne dici di questa soluzione?»
«Ah, adesso ho capito dove vuoi arrivare. Se interpretiamo lo schizzo come un grafo, esso possiede un circuito di Eulero. Possiamo allora fare il disegno senza interrompere mai il tratto.»
241
«Osservate questo disegno:» 5
3
«Dov’è la differenza? Se questo fosse il grafo della rete stradale nella raccolta dei rifiuti, dovremmo fare due viaggi a vuoto tra i vertici di grado dispari ed anche il plotter ha bisogno di due movimenti di pen-up tra gli stessi quattro vertici critici.» «Sì, ma mentre nella rete stradale dobbiamo attenerci ai lati del grafo anche per i nostri viaggi a vuoto, il plotter può invece effettuare i suoi movimenti di pen-up tra i vertici critici anche in linea d’aria. Come si può vedere in questo esempio, le due soluzioni sono diverse:» 4
4
4
6
6
4
4
4
Posta dalla Cina
«Sì, e quando il grafo non ha un circuito di Eulero dobbiamo di nuovo abbinare i vertici di grado dispari in modo minimale, per perdere il minor tempo possibile nei viaggi a vuoto, cioè nei movimenti che la testina scrivente deve fare senza disegnare. Nel gergo specialistico si parla di tempi di pen-up, in contrapposizione ai tempi di pen-down, nei quali invece la testina è abbassata e disegna. Vogliamo allora minimizzare i tempi di pen-up. Rispetto ai problemi di ricerca dei percorsi più adatti per lo svuotamento dei cassonetti, esistono tuttavia due differenze.» «E quali sarebbero?» 3 3
242 Alla ricerca della via più breve
«Ah, ma allora nel secondo passo dell’algoritmo non dobbiamo più risolvere un problema di cammino minimo, in quanto per il problema di matching possiamo usare direttamente le distanze in linea d’aria tra i vertici critici.» «Hai visto giusto, Rut.» «E la seconda differenza?» «È quella che rende il problema del plotter notevolmente più difficile. La rete stradale è sempre connessa, mentre non è detto che i disegni che il plotter deve tracciare lo siano. Può senz’altro succedere che nel disegno ci siano delle parti non collegate tra loro. Decidere allora in quali punti del disegno saltare da una parte non connessa all’altra complica molto di più le cose.» «Io ho in mente da un po’ un’altra domanda.» «Sì?» «Abbiamo trattato il problema del postino cinese sempre solamente per grafi non orientati. Ma in città ci sono un mucchio di sensi unici che anche la nettezza urbana deve rispettare.» «Magnifico! Pensavo che non me l’avreste più chiesto. Già, questo è un problema molto interessante. La soluzione più semplice sarebbe dotare i mezzi della nettezza urbana di un permesso speciale, in modo che possano viaggiare anche in direzione contraria al senso di marcia in questi casi. Tuttavia assumiamo, per cominciare, che l’intera rete stradale sia composta esclusivamente da sensi unici. Ciò vuol dire avere veramente a che fare con un grafo orientato. Beh, in questo caso il problema si risolve quasi nello stesso modo. Proprio come nel caso non orientato, cerchiamo anche ora di costruire un circuito di Eulero al prezzo dell’aggiunta del minor numero possibile di viaggi a vuoto. Guardate qua, ecco un’altra variante del nostro grafo delle strade, stavolta però solamente con strade a senso unico e, di conseguenza, senza più vicoli ciechi:»
243 Deposito
4
Posta dalla Cina
2 3
5
4
6 5 4
5
4 4 3 3 3 5
«Oh, così le possibilità di scegliere lungo quali percorsi muoversi si sono ridotte notevolmente.» «È vero. Non è nemmeno più scontato che sia ancora possibile andare da un vertice qualsiasi a ciascuno degli altri. In una rete stradale reale, tuttavia, è sempre possibile. Grafi orientati nei quali esiste un cammino tra due vertici qualsiasi vengono detti fortemente connessi. Nei grafi orientati non basta più identificare i vertici di grado dispari. Nel nostro grafo della nettezza urbana, in corrispondenza del vertice di grado 6, occorrono addirittura due viaggi a vuoto. Riuscite a vedere il perché?» «Ma certo. Da questo vertice escono quattro archi, mentre ne entrano soltanto due.» «Giusto. Il numero degli archi che sfociano nel vertice viene anche detto grado in ingresso e il numero di quelli che escono dal vertice si dice invece grado in uscita del vertice. Se tralasciamo i vertici isolati, il grafo orientato deve naturalmente essere fortemente connesso per poter contenere un circuito di Eulero. Per di più, i gradi in ingresso ed in uscita devono coincidere in ogni vertice. I vertici per i quali questo non accade devono essere congiunti con viaggi a vuoto aggiuntivi e questo più di una volta, se, come nel caso del vertice di grado 6, la differenza tra i gradi in ingresso e in uscita è maggiore di 1.»
244 Deposito
Alla ricerca della via più breve
2/2
1/1 3/2 1
2/2
1 2/1
2 2/4 1 3/2 2/2 1 1
2/2
2/3
2/2
1/2 2/1
3/2 1
1
1 1/2
«Okay; con i numeri vicini ai vertici, hai distinto il loro grado in ingresso dal loro grado in uscita, ma perché stavolta hai marcato i vertici “problematici” con due colori diversi? Cosa vogliono dire i numeri dentro a questi vertici?» «I colori servono a distinguere ulteriormente i vertici critici. I rossi sono quelli dai quali escono più archi di quanti non ne entrino e i verdi sono quelli ai quali arrivano più archi di quanti non ne escano. I numeri dentro i vertici corrispondono alla differenza tra grado in ingresso e grado in uscita. Se costruiamo adesso di nuovo il nostro grafo ausiliario G , ridotto ai vertici critici, otteniamo stavolta un problema di trasporto invece del problema di matching generale. Quest’ultimo è addirittura un po’ più facile da risolvere.» 1
1
2 1 1 1
1
1
1
245
«Non lasciarti ingannare dal disegno, Jan. Nessun arco va da un vertice rosso ad un altro vertice rosso e neppure da un vertice verde ad un altro vertice verde. Se però ti piace di più, puoi sempre ridisegnare il grafo in modo che tutti i vertici verdi stiano a sinistra e tutti quelli rossi a destra:» «Ah, adesso capisco. Il primo disegno mi ha tratto in inganno.»
1 1 1 2 1 1 1 1 1
«Sì, bisogna starci attenti. Essere bipartito è una proprietà del grafo e non del modo in cui esso viene disegnato, anche se spesso parliamo di vertici a destra e a sinistra.» «Non fa niente che ci siano più vertici verdi che rossi?» «No. Dobbiamo “trasportare fuori” da ogni vertice verde un viaggio a vuoto e fanno in tutto 5 viaggi; e 5 sono anche i viaggi a vuoto che devono essere “trasportati dentro” i vertici rossi: uno a testa per tre dei vertici e due per quello di grado 6.» «Okay, tutto chiaro. Tuttavia non è decisamente realistico supporre che tutte le strade della città siano sensi unici.» «È vero. Quello di cui abbiamo veramente bisogno nel nostro problema della nettezza urbana sono i grafi misti, cioè grafi con lati ed archi.»
Posta dalla Cina
«Un momento! Questo non lo capisco. Il problema di trasporto era come un problema di assegnamento, nel quale a sinistra si indicava quanto poteva uscire e a destra quanto poteva entrare. Per fare questo, il grafo non deve essere bipartito? Quello che abbiamo noi non mi pare proprio che lo sia.»
246 Alla ricerca della via più breve
«Ma fa differenza questo? Tu mi hai già fatto vedere nel problema del cammino minimo come si può trasformare ogni lato in due archi. Puoi inserire di nuovo quel disegno per Jan?»
«Ma che razza di trucco è questo? Non è più la stessa cosa! Nel primo caso i cassonetti vengono svuotati una volta, come deve essere, ma nel secondo dovremmo svuotarli due volte. Non credo che farebbe piacere agli addetti ai lavori!» «Jan ha ragione. Il nostro vecchio trucco qui non funziona più. Il lato significa che in quella strada dobbiamo svuotare i cassonetti e che ciò non dipende comunque dalla direzione in cui la strada viene percorsa. I due archi opposti invece stanno per due sensi unici, entrambi con cassonetti da vuotare.» «Okay. Lo ammetto, ho sbagliato. Ma così difficile questo problema non potrà comunque essere, o no?» «Potrà anche sembrare strano, ma nonostante esistano algoritmi sia per il problema del postino cinese non orientato che per quello orientato, algoritmi che stanno nel raccoglitore O(n3 ), la versione mista del Postino Cinese è di nuovo un problema difficile. Ciò significa che probabilmente non ci sarà mai un algoritmo efficiente che lo risolve.» «Nemmeno se il problema non è difficile sia per i grafi orientati che per i grafi non orientati? Davvero particolare!» «Ehi Rut, non dobbiamo schizzare via immediatamente? Martina ha ripetuto cento volte di non fare tardi perché c’è anche qualcosa di caldo da mangiare.» «Oh sì, il tempo stringe!» Rut e Jan presero la metropolitana. Erano solo due fermate per arrivare da Martina, ma erano già piuttosto in ritardo e Rut non si fidava ancora a correre sul suo piede. Tariffa ridotta, le venne in mente. La festa di Martina fu un vero successo. La musica era strepitosa e il cibo veramente buonissimo. Ma la cosa che a Rut piacque di
247
La madre di Rut si era offerta di venirli a prendere in auto al termine della festa e di riaccompagnare a casa Jan. Così, per questa volta, non dovettero più preoccuparsi dei limiti d’orario e poterono godersi fino in fondo la serata.
Posta dalla Cina
più fu essere lì con Jan. Il suo piede non le faceva assolutamente più male. Ma doveva fare attenzione, diceva Jan, e ballare solo i lenti. Con lui, naturalmente! Non era carino?
Scacco matto?
La mattina del sabato Rut poté finalmente dormire quanto voleva. Risvegliata dal profumo del caffè appena fatto, indossò la sua vestaglia e scese in cucina. Fece un’abbondante colazione in compagnia di sua madre, la quale, com’è naturale, volle sapere tutto della festa della sera prima. Rut allora le disse chi c’era, che cosa si era mangiato e bevuto e le raccontò di aver ballato parecchio. Questo non fece molto piacere alla mamma, ancora preoccupata per quel piede. Rut però la tranquillizzò: il piede era praticamente guarito e ormai non c’era più niente da temere. Naturalmente, Rut non le aveva detto che aveva ballato solo con Jan e solo musica lenta “terapeutica”. . . Oggi Rut avrebbe passato l’intera giornata da sola, perché Jan andava con suo padre a vedere una partita di calcio del campionato regionale a Norimberga e ne avrebbero approfittato per visitare la fortezza. Così Rut decise di sfruttare la prima parte della mattina per recuperare l’allenamento di nuoto che aveva perso. Conosceva abbastanza bene il programma di mantenimento del suo allenatore per poterlo eseguire tutto, da cima a fondo, anche da sola. Dovette comunque concentrarsi maggiormente sulla tecnica delle braccia per non sottoporre il piede a eccessivi sforzi. Quando fu di nuovo a casa, prese la sedia a sdraio della mamma, si mise comoda in giardino e cominciò a leggere il libro che Martina le aveva prestato il giorno prima. Si trattava di una favola indiana. Le piacque così tanto che la lesse tutta d’un fiato. Rut non era una lettrice accanita, ma quando un libro la avvinceva, perdeva completamente il senso del tempo. Fu l’odore di grigliata proveniente dal giardino del vicino a ricordarle che non mangiava da prima del nuoto. Sua madre era seduta nel suo studio e sembrava
250 Alla ricerca della via più breve
molto occupata. Chissà se avrebbe gradito anche lei una omelette. Con il suo piatto, Rut si trasferì di sopra, in camera sua, per controllare se suo padre le aveva scritto di nuovo. Purtroppo però non c’erano nuovi messaggi nella sua mail-box e decise allora di chiacchierare un po’ con Vim. Sicuramente lui avrebbe trovato qualcosa di interessante per tenerla occupata un po’, senza che Jan si perdesse niente, naturalmente. «Che ne dici di un piccolo gioco?» «Benissimo, per giocare sono sempre disponibile.» «Allora osserva questo applet Java in Internet all’indirizzo www. midaslink.com/east/knight.htm:»
«Somiglia ad una scacchiera, ma perché c’è scritto “Knight”? Negli scacchi non mi sembra ci siano cavalieri!» «È il cavallo. In inglese questa figura si chiama molto nobilmente “cavaliere”. In questo gioco si deve “cavalcare” per tutta la scacchiera con il cavallo, senza passare più di una volta sulla stessa casella. Le caselle già utilizzate vengono marcate in giallo e non vi si può più accedere per il resto del gioco. Lo scopo è coprire il maggior numero possibile di caselle della scacchiera. Sai come può muoversi il cavallo nel gioco degli scacchi?»
251
«Allora, ti va?» «Diamogli pure un’occhiata.» Rut iniziò a giocare. Dovette ricominciare da capo parecchie volte, tentando di raggiungere un numero maggiore di caselle. Lentamente il suo punteggio migliorò e se all’inizio finiva spesso per impantanarsi in vicoli ciechi creati con le sue stesse mani, dopo alcuni turni cominciò ad avere la sensazione di quali fossero le astuzie del gioco. Imparò a stare attenta soprattutto ai quattro angoli della scacchiera. Da quei punti erano possibili solo due mosse, una delle quali andava sprecata già per raggiungere l’angolo.
4 2 3 1
Scacco matto?
«Ma certamente: due caselle in avanti ed una di lato. Gli scacchi me li ha insegnati mio padre già tre anni fa.»
252 Alla ricerca della via più breve
Doveva quindi assolutamente accertarsi che la via di uscita fosse libera, prima di finirci dentro, per non rimanervi intrappolata. Alla fine ci riuscì; 64 punti, tutte le caselle erano state raggiunte una volta sola. Ci riprovò immediatamente; purtroppo però l’applet scelse stavolta un diverso punto di partenza e Rut fallì di nuovo. Peccato che non si possa riprendere un gioco già fatto, pensò Rut. E invece sì, le venne in mente l’istante successivo. Andò a prendere la grossa scacchiera di suo padre, si procurò un foglio di carta e lo tagliò in 64 quadratini sui quali scrisse i numeri da 1 a 64. Adesso poteva riprendere il gioco. Se avesse trovato una soluzione, stavolta avrebbe potuto ricostruirla seguendo i numeri nei foglietti. Il vantaggio decisivo del suo metodo “off-line” era che poteva tornare indietro se faceva una mossa falsa e finiva in un vicolo cieco: bastava togliere i foglietti sbagliati fino a scorgere un modo migliore di procedere. Non ci volle molto prima che a Rut venisse il sospetto che Vim avesse in fondo uno scopo, con questo gioco. Questa faccenda doveva avere per forza qualcosa a che fare con i grafi. In qualche modo doveva trattarsi di un problema di Routenplanung anche qui. Il gioco avrebbe interessato sicuramente anche Jan. Gli scrisse perciò una mail.
Jan
Un piccolo indovinello
Ciao Jan, come è stata la partita? Spero vi siate divertiti. Vim mi ha mostrato in Internet un piccolo enigma sugli scacchi che puoi trovare all’indirizzo: http://home.earthlink.net/~tfiller/knight.htm Non è per niente facile! Magari hai voglia di spremerti un po’ le meningi... :- ) Se vuoi, puoi venire qui già domani mattina. Mia madre dice che puoi anche fermarti a pranzo da noi. A domani, tua Rut
Spedita la lettera, Rut scese di sotto e quella sera guardò ancora un film con sua madre, prima di andare a dormire.
253
«Il gioco che mi hai spedito è davvero fantastico!» «L’hai già risolto? Hai fatto almeno una volta 64 punti?» «Certo, tutte le volte!» «Impossibile! Io ce l’ho fatta una volta sola.» Rut fece partire l’applet e Jan si cimentò subito. Al primo tentativo, Rut pensò solo che Jan avesse avuto un po’ di fortuna, ma il risultato fu di 64 punti anche la seconda e la terza volta. Mentre Rut ancora non finiva di stupirsi, Jan digitò un altro indirizzo nel browser: w1.859.telia.com/˜u85905224/ knight/eknight.htm. Comparve un altro applet Java con una scacchiera.
Già la prima frase attirò l’attenzione di Rut: anche Eulero si era occupato del problema. Come sospettava, il problema delle mosse del cavallo non era che una variante del problema dei ponti di Königsberg. Il fatto poi che alla fine del testo si menzionasse un cammino chiuso che riportava il cavallo al punto di partenza, le sembrò un indizio ulteriore. Nella pagina successiva, l’autore del sito parlava proprio del procedimento che Rut aveva messo a punto autonomamente, ser-
Scacco matto?
Quando nella mattinata di domenica Jan arrivò da lei, era raggiante.
254 Alla ricerca della via più breve
vendosi della scacchiera di suo padre e dei foglietti, procedimento che consisteva nell’andare sempre avanti e, qualora si fosse finiti di un vicolo cieco, nel tornare indietro quel tanto che bastava per poter aggirare l’ostacolo. Nel testo, tuttavia, veniva descritto un limite di questo metodo, detto backtracking, che Rut conosceva molto bene: il suo impiego conduceva all’esplosione combinatoria! «Ah, è così! Allora non ci sei arrivato da solo!» «No. Dopo alcuni tentativi, mi è venuta l’idea di cercare “Knight’s tour” su Google. Così ho trovato, tra le tante, anche questa pagina.» «Quello che lì viene chiamato backtracking l’ho sperimentato anch’io ieri. Ma tu hai sempre trovato la tua soluzione direttamente, senza mai dover tornare su una mossa fatta.» «Guarda qui, in questa pagina c’è ancora un rimando ad una sotto-pagina che parla di una strategia migliore. Si chiama la regola di Warnsdorff .» «È quella che hai usato tu? Ero molto colpita.» Jan cliccò sul link e comparve una seconda pagina con analogo layout. Con l’aiuto del testo e dell’applet annesso, Rut capì in fretta quale logica Jan avesse seguito nel costruire i suoi percorsi. «Perché non proviamo a impressionare Vim con questo metodo?» «Sì, dai! Ci rimarrà di sasso.» Rut aprì la cartella che conteneva l’icona di Vim e con un doppio click fece partire il software. «Ciao Vim.» «Ciao a tutti.» «Questo gioco del cavallo era piuttosto semplice.»
255
«Una volta? Abbiamo trovato una semplice strategia che ci fa fare sempre il punteggio massimo.» «Veramente? Raccontatemi allora come funziona questa vostra strategia.» «Un gioco da ragazzi! Qualunque sia la casella raggiunta, determiniamo per prima cosa le caselle libere in cui il cavallo può muovere al passo successivo ed annotiamo poi in ognuna di esse il numero delle possibilità che si avrebbero di andare avanti da lì.» «Intendi ad esempio così?»
6
7
3
5
7 5
7
5 2 4 1
3
«Sì. A questo punto saltiamo sulla casella con il numero più piccolo, determiniamo nuovamente questi numeri per le caselle adesso raggiungibili e via di questo passo.» «H. C. Warnsdorff, La più semplice e generale soluzione del problema del cavallo, Schmalkalden,1823. Il titolo originale dovrebbe essere: Des Rösselsprungs einfachste und allgemeinste Lösung.» «Esatto!» «Esatto?»
Scacco matto?
«Oh, Rut ti ha fatto vedere quel gioco? Bene, ma lo chiami “semplice”? Avete raggiunto almeno una volta i 64 punti?»
256 Alla ricerca della via più breve
«Ehm. . . temo proprio di essermi tradita. Ebbene sì: Jan ha trovato questo procedimento in Internet. Io ieri sono però riuscita da sola a coprire per una volta tutte e 64 le caselle. Ma poi non ricordavo più come avevo fatto.» «Capisco. Volevate scoprire tutto da soli. A quanto pare non avete più bisogno di me.» «Sciocchezze! Sospettiamo piuttosto che tu con questo gioco abbia un secondo fine. Adesso volevamo solo stupirti, dandoti a bere che era tutta farina del nostro sacco.» «Ad ogni modo mi fa molto piacere che il problema vi abbia interessato al punto da spingervi a fare autonomamente delle ricerche. Avete notato che la regola di Warnsdorff è solo un’euristica?» «E che cos’è un’euristica? Tu lo sai, Rut?» «No.» «Sembra che, dopotutto, ci sia ancora bisogno di me qui. La parola “euristica” deriva dal verbo greco “heurískein” che significa “trovare” o “scoprire”. In matematica si indicano con questo nome quei procedimenti che sembrano sensati per la soluzione di un problema, per i quali tuttavia non c’è la garanzia che funzionino sempre. L’idea di procedere muovendosi sempre lungo i lati più corti era un’euristica per il problema del cammino minimo. Una strategia che poteva anche fallire, come abbiamo visto.» «Perché la regola di Warnsdorff è un’euristica? Con essa otteniamo sempre una soluzione del problema del cavallo sulla scacchiera.» «E chi l’ha detto?» «Beh, la pagina web su cui abbiamo trovato questa regola.» «E come viene dimostrata questa tesi?» «Oh, non ci ho proprio fatto caso. Tu, Rut?»
257
«La dimostrazione, qui, potrebbe essere la più banale che ci si possa immaginare. Con l’aiuto del computer, si potrebbero semplicemente controllare a tappeto tutti i cammini possibili che si possono generare seguendo la regola di Warnsdorff su una scacchiera 8 × 8.» «E allora? Controllare tutte le possibilità non costituirebbe forse una dimostrazione?» «Certo, ma non per scacchiere con un numero qualunque di caselle.» «Un numero qualunque di caselle? Ma le scacchiere sono tutte 8 × 8!» «Potreste però fare il gioco del cavallo anche su scacchiere di dimensioni diverse, come queste, ad esempio:»
«Ci risiamo, questo è tipico dei matematici. A nessun altro essere umano verrebbe in mente una scacchiera diversa dalla 8 × 8 e men che meno una scacchiera non quadrata!» «Ma no, Jan. Io non la trovo un’idea cattiva. Pensa a quanto tempo abbiamo impiegato per arrivare a una soluzione sulla scacchiera normale. Forse avremmo dovuto cominciare prima da una scacchiera più piccola.»
Scacco matto?
«Nemmeno io, ma sarà sicuramente simile al teorema di Eulero. In fondo questi numeri ricordano un po’ il grado dei vertici.»
258 Alla ricerca della via più breve
«Per me fa lo stesso. La scacchiera 2 × 3, comunque, è davvero noiosa. Lì non ci può essere alcuna soluzione.» «È vero, ma già con la 3 × 4 bisogna prima rifletterci un po’. Tornando alla nostra scacchiera 8 × 8, volevo comunque avvisarvi che, applicando la regola di Warnsdorff, potreste ancora andarvi a cacciare in un vicolo cieco. Si possono infatti dare esempi di percorsi nei quali, arrivati ad un certo punto, in presenza di caselle con lo stesso valore, si può scegliere una strada senza via di uscita. Lo stesso vale per scacchiere quadrate più grandi, ad esempio con la scacchiera 76 × 76.» «76 × 76? Nessuno si sognerebbe mai di provare il gioco del cavallo su una scacchiera simile.» «Nessuno, naturalmente. Il caso è interessante solo perché consente di studiare strategie che possono rivelarsi utili per risolvere teoricamente problemi simili a questo.» «Come ha fatto del resto Eulero con il problema dei ponti di Königsberg.» «Esattamente, Rut. A proposito, la regola di Warnsdorff ha un altro difetto.» «E sarebbe?» «Non si ottiene necessariamente un cammino chiuso.» «Ma non era nemmeno richiesto.» «È vero. Un cammino chiuso avrebbe tuttavia un vantaggio.» «E quale?» «Forse la risposta più autorevole in proposito è quella di Eulero stesso:»
259
54
49
40
35
56
47
42
33
39
36
55
48
41
34
59
46
50
53
38
57
62
45
32
43
37
12
29
52
31
58
19
60
28
51
26
63
20
61
44
5
11
64
13
30
25
6
21
18
14
27
2
9
16
23
4
7
1
10
15
24
3
8
17
22
Il cavallo salta cioè secondo l’ordine dei numeri. Poiché dal numero 64 al numero 1 c’è una mossa del cavallo, questo percorso è in se rediens. Esso verifica inoltre la proprietà che, in areolis oppositis, la differentia numerorum è ovunque 32. Lettera di Eulero a Goldbach del 26.4.1757, riprodotta in E. A. Fellmann – Leonhard Euler, Rowohlt Taschenbuch Verlag, 1995, pp. 73–74
Scacco matto?
Il ricordo di un problema che mi era stato sottoposto tempo fa mi ha dato recentemente l’occasione di compiere diligenti ricerche in un settore in cui l’analisi in genere non sembrerebbe avere alcun influsso. La domanda era: si devono attraversare tutte le 64 caselle di una scacchiera con un cavallo, in modo che questo non entri più di una volta in ciascuna di esse. A questo fine, tutti i posti venivano occupati con contrassegni che venivano rimossi al passaggio del cavallo. Si richiedeva inoltre che si iniziasse a muovere partendo da un posto prestabilito. Quest’ultima condizione mi sembrò rendere il problema sommamente difficile, perché avevo presto trovato alcuni percorsi, nei quali, però, dovevo essere lasciato libero di scegliere l’inizio. Vidi però che, se il percorso fosse stato in se rediens, cioè tale che il cavallo fosse stato in grado, dall’ultimo posto, di saltare nuovamente sul primo, anche questa difficoltà sarebbe stata superata. Dopo alcuni sforzi in questo senso, ho finalmente trovato un metodo sicuro, senza dover procedere per tentativi, per ottenere tutti i cammini che si desiderano, soddisfacenti le condizioni date (il numero dei percorsi possibili tuttavia non è infinito); uno di questi viene presentato nella seguente figura:
260 Alla ricerca della via più breve
«Furbo! Un cammino chiuso è automaticamente una soluzione che va bene per qualsiasi punto di partenza. Però non capisco proprio l’ultima frase di Eulero.» «Al vecchio genio non bastava esibire un percorso qualunque. Egli vi ha inserito anche un’altra interessante proprietà. Osservate le caselle del tour di Eulero che ho collegato qui con le tre linee colorate. Non notate niente di particolare?» 54
49
40
35
56
47
42
33
39
36
55
48
41
34
59
46
50
53
38
57
62
45
32
43
37
12
29
52
31
58
19
60
28
51
26
63
20
61
44
5
11
64
13
30
25
6
21
18
14
27
2
9
16
23
4
7
1
10
15
24
3
8
17
22
«Ma certo! La differentia numerorum è ovunque 32.» «Come, scusa? Pensavo che tu in latino non fossi una cima!» «Ma è dal disegno che si capisce! La differenza dei numeri nelle caselle è sempre 32. Intendeva dire questo, Eulero, con l’ultima frase, vero?» «Proprio così, Rut; e questo vale per ogni coppia di caselle che occupano posizioni simmetriche rispetto al centro della scacchiera, tali cioè che la linea che le congiunge attraversa il centro della scacchiera – il suo centro di simmetria – e viene divisa da questo in due parti uguali.» «“Affascinante”, direbbe il signor Spock.» «Tu e i tuoi film di fantascienza!» «E adesso facciamo una deviazione. Con il problema del cavallo volevo solo presentarvi un altro importante problema della teoria dei grafi.»
261
«Accidenti Jan, ma anche a proposito del problema dei ponti di Königsberg, in un primo momento, pensavamo che si trattasse solo di un piccolo rompicapo e invece si è rivelato di grande importanza per la raccolta dei rifiuti, per i postini e perfino per i plotter. Di sicuro Vim avrà in serbo qualcosa del genere anche adesso. Che tutto ciò avesse a che fare con i grafi, comunque, l’avevo già pensato anch’io. Si potrebbero rappresentare le caselle della scacchiera con vertici e congiungere due vertici con un lato se il cavallo può spostarsi tra le due caselle corrispondenti.» «Molto bene. Qui di seguito potete vedere i grafi per le scacchiere di formato 2 × 3 e 3 × 4:»
«Vedi Rut? Il primo grafo non è nemmeno connesso. L’avevo detto che il problema per la scacchiera 2 × 3 non aveva soluzione!» «Il grafo della scacchiera 3 × 4 appare già più complicato. In ogni caso non riesco a vedere a colpo d’occhio se ci sia o no un percorso completo. Non si tratta semplicemente nemmeno di una nuova forma del problema dei ponti di Königsberg.» «No. Probabilmente qui serve solo fare alcuni tentativi.» «Se si disegna il grafo diversamente, non è affatto complicato. Guardate, questo è lo stesso identico grafo:»
Scacco matto?
«Importante? Questo “salta, salta cavallino” è solo un gioco. Che cosa dovrebbe esserci di importante?»
262 Alla ricerca della via più breve
«Veramente? Ma i lati sono disposti in un modo completamente diverso!» «Ciò dipende solo dalla disposizione dei vertici. Se si ha la pazienza di dirimere il primo garbuglio, si vede che i due grafi coincidono. Di seguito ho disegnato i lati corrispondenti con lo stesso colore ed ho marcato i vertici con un numero:»
1
2
3
4
9
2
11
4
5
6
7
8
7
8
5
6
9
10
11
12
1
10
3
12
«Aspetta un momentino. . . Ah sì, ora lo vedo.» «Oh sì, e poiché ogni lato corrisponde ad un salto del cavallo, si vede immediatamente che, in questo caso, è possibile visitare tutti i vertici senza passare due volte sulla stessa casella.»
9
2
11
4
1
2
3
4
7
8
5
6
5
6
7
8
1
10
3
12
9
10
11
12
«Giusto, Jan. Il problema del cavallo è allora risolvibile. Si riuscirebbe anche a trovare un cammino chiuso?» «No, in nessun modo!»
263 «E perché?»
«. . . e a causa dei vertici 9, 7 e 1, anche tutti i lati neri. I lati neri e quelli gialli formano però già un circuito. . . » «. . . e questo circuito non può più essere completato per formarne uno più grande che copra tutti i vertici una sola volta.» «Magnifico! Voi due avete risolto il problema.» «Beh, dopo che tu avevi “dipanato la matassa” del grafo originario, non era più così difficile.» «A proposito, un cammino che attraversa tutti i vertici di un grafo esattamente una volta sola viene detto un cammino di Hamilton, e se alla fine si torna al punto di partenza, si parla di circuito di Hamilton. Guardate qua, il grafo del problema del cavallo sulla scacchiera 8 × 8 appare così:»
«Oh, quanti lati! Sembra però molto regolare, quasi come un tessuto.» «Non penserai di nuovo alle magliette, spero.» «Ma no, piuttosto alle “maglie” della camicia di metallo di un cavaliere. Alla fine si chiama pur sempre “Knight’s problem”.»
Scacco matto?
«In un cammino chiuso, da ogni vertice devono uscire due lati. Questo comporta che, a causa della presenza del vertice 8, entrambi i lati gialli dovrebbero farne parte. . . »
264 Alla ricerca della via più breve
«A proposito, in questo grafo non ci sono circuiti di Eulero. Gli otto vertici vicini agli angoli hanno infatti tutti grado 3. Ci sono tuttavia alcuni circuiti di Hamilton, come avete già potuto vedere. Quello trovato da Eulero appare così:»
Quando la madre di Rut chiamò per il pranzo, Jan saltò su come una molla; era da un po’, infatti, che sentiva i morsi della fame. Rut, al contrario, di fame non ne aveva molta; c’era invece una domanda che ancora la assillava. L’avrebbe rivolta a Vim subito dopo il pranzo.
Amore platonico?
Come dessert, ci furono lamponi con panna e Jan era felice come un bimbo. Rut invece conservò il dolce per più tardi. Dopo una piccola pausa digestiva, volle subito rivolgere a Vim la domanda che aveva in mente già da prima. «Cosa dice allora il teorema di Hamilton? Dipende ancora tutto dal grado dei vertici?» «Purtroppo non c’è nessun teorema che fornisca un criterio ragionevole per stabilire se un grafo generico contenga un cammino o un circuito di Hamilton.» «Stai scherzando? Non ci può essere una grande differenza tra il voler percorrere esattamente una volta tutti i lati di un grafo o il voler visitare una volta sola tutti i vertici.» «Guarda che dico sul serio: il problema del circuito di Hamilton è notevolmente più complicato. I migliori matematici del mondo finora non sono stati in grado di risolverlo.» «Perché allora questi affari si chiamano “cammini di Hamilton”, se non c’è nessun teorema che li riguardi?» «Questi “affari” portano il nome del matematico irlandese Sir William Rowan Hamilton che visse tra il 1805 e il 1865. All’età di 30 anni venne nominato Cavaliere, questo è il motivo del “Sir”. Su Internet, all’indirizzo www.treasure-troves.com/ bios/HamiltonWilliamRowan.html trovate un bel disegno che lo raffigura:»
266 Alla ricerca della via più breve
«Matematico e cavaliere? Divertente. Doveva anche partecipare ai tornei?» «Forse ai tornei di scacchi. No, Jan, nel diciannovesimo secolo i cavalieri non dovevano più sfidarsi a duello. Il titolo di Cavaliere era già come è oggi: un titolo onorifico, per particolari meriti acquisiti. Ti immagini Sir Paul McCartney con scudo e spada?» «Ah è vero, anche i Beatles ricevettero un titolo nobiliare dalla Regina d’Inghilterra.» «Ad ogni modo, Hamilton inventò nel 1856 un gioco di società che chiamò “the icosian game”.» «Gioco icosiano? Sembra un grafo!» «Sì, la tavola da gioco mostra il grafo dei lati e dei vertici di un dodecaedro. Sapete che cos’è?» «Uno dei cinque solidi platonici. Li abbiamo studiati l’anno scorso in matematica.» «Solidi platonici? Il signor Liste non ce ne ha mai parlato. In lettere, però, abbiamo fatto qualcosa sull’amore platonico, anche se non credo che c’entri molto.» «No, tranne il fatto che l’aggettivo si riferisce sempre al filosofo greco Platone. Chissà, magari al mondo esiste anche qualcuno che ha sviluppato un amore platonico per i solidi platonici.» «Che cos’è allora un solido platonico? Non potreste spiegarlo anche a me?»
267 Amore platonico?
Tratto da: Graph Theory 1736–1936 – N.L. Biggs, E.K. Lloyd, R.J. Wilson, Clarendon Press, 1976, p. ii
«Ma certo! Ci sono cinque solidi platonici, i cui nomi derivano dalla parola greca che indica il numero delle loro facce: il tetraedro, anche detto piramide triangolare, composto da 4 triangoli equilateri – in greco, 4 si dice “tetra” –; l’esaedro, composto da 6 quadrati, meglio noto come cubo; l’ottaedro, che consta di 8 triangoli equilateri e somiglia ad una doppia piramide egizia; il dodecaedro, la cui superficie è formata da 12 pentagoni regolari e l’icosaedro, con 20 triangoli equilateri. I solidi platonici sono molto regolari: le loro facce sono identiche tra loro e sono sempre poligoni regolari; anche il modo in cui le facce vengono assemblate è sempre lo stesso. Su Internet ci sono un’infinità di pagine nelle quali è possibile osservare questi corpi da tutte le angolazioni, perfino
268 Alla ricerca della via più breve
facendoli ruotare su se stessi. Queste immagini provengono dal sito www.math.utah.edu/˜alfeld/math/polyhedra/ polyhedra.html:»
«Non ce ne sono altri?» «No, non esistono altri solidi di questo tipo. Per ogni altra combinazione di poligoni regolari, infatti. . . » «. . . la somma degli angoli che devono “incastrarsi” tridimensionalmente nei vertici sarebbe troppo grossa. Se si cerca da soli di costruire un corpo simile, lo si nota subito. L’abbiamo provato anche a scuola. Ti posso far vedere cosa succede se parti da uno schema con esagoni regolari.» «Sul sito www.cs.mcgill.ca/˜sqrt/unfold/unfolding. html c’è perfino un’animazione che mostra come ogni solido platonico si origina dal rispettivo schema bidimensionale:»
«Oh, questo devo provarlo assolutamente!» «Questi solidi erano noti fin dall’antichità. Spesso gli uomini hanno ravvisato in loro qualcosa di mistico. Platone stesso li
269
www.idv.uni-linz.ac.at/kepler/werke/platonische_ koerper.html si può trovare una riproduzione delle illustra-
zioni originali del celebre astronomo Johannes Kepler:»
«Ed io che pensavo che il misticismo finisse proprio là dove la matematica comincia.» «Mah, che dire. Questi corpi hanno entusiasmato perfino Keplero. Per lui erano la dimostrazione dell’armonia del cosmo. Nel suo “Mysterium Cosmographicum”, il “mistero del mondo”, del 1596, constatò che Dio, per l’ordine dei pianeti, evidentemente doveva essersi basato sui solidi platonici. A quel tempo, oltre alla Terra, erano noti solo Mercurio, Venere, Marte, Giove e Saturno.» Creator Optimum maximus, in creatione Mundi hulus mobilis, et dispositione Coelorum, ad illa quinque regularia corpora, inde a PYTHAGORA et PLATONE, ad nos vsque, celebratissima respexerit, atque ad illorum naturam coelorum numerum, proportiones, et motuum rationem accomodauerit. . . Terra est Circulus mensor omium: Illi circumscribe Dodecaedron: Circulus hoc comprehendens erit Mars. Marti circumscribe Tetraedron: Circulus hoc comprehendens erit Jupiter. Ioui circumscribe Cubum: Circulus hunc comprehendens erit Saturnus. Iam terrae inscribe Icosaedron: Illi inscriptus Circulus erit Venus: Veneri inscribe Octaedron: Illi inscriptus Circulus erit Mercurius. Habes rationem numeri planetarum. J. Kepler – Prodomus dissertationum cosmographicarum, continens Mysterium Cosmographicum, Tübingen, 1596; riprodotto in: Johannes Kepler gesammelte Werke, Band 1 – C.H. Beck’sche Verlagsbuchhandlung, München, 1938
Amore platonico?
ha scelti come simboli degli “elementi”: il tetraedro per il fuoco, l’esaedro per la terra, l’ottaedro per l’aria e l’icosaedro per l’acqua. Il dodecaedro era il simbolo della misteriosa “quinta essentia”, l’etere celeste. Oggi diremmo l’“universo”. Sul sito
270 Alla ricerca della via più breve
«Ancora latino! Mi pare che cominci a vantarti un po’ troppo della tua formazione classica.» «No, scusami. Ecco la traduzione. Sul sito www.georgehart .com/virtual-polyhedra/kepler.html si possono trovare anche due schizzi di come Keplero immaginasse tutto ciò:» Dio (. . . ) ha posto alla base della disposizione delle orbite dei pianeti (. . . ) quei cinque solidi regolari (. . . ). L’orbita della Terra è la misura per tutte le altre orbite. Essa è inscritta in un dodecaedro; la sfera che lo circoscrive è quella di Marte. L’orbita di Marte è inscritta in un tetraedro; la sfera che lo circoscrive è quella di Giove. L’orbita di Giove è contenuta in un cubo; la sfera che lo circoscrive è quella di Saturno. Ora, all’interno della sfera dell’orbita della terra è inscritto un icosaedro; la sfera in esso inscritta è quella di Venere. Nella sfera dell’orbita di Venere è inscritto un ottaedro; la sfera in esso inscritta è quella di Mercurio. Da qui il motivo del numero dei pianeti. Tradotto da: R. Breitsohl-Klepser – Heiliger ist mir die Wahrheit, Johannes Kepler, Kreuz Verlag, 1976, p. 72
«Questo me lo devi spiegare meglio. Che c’entrano le forme geometriche con i pianeti?»
271
«Nelle lezioni di fisica abbiamo imparato che le orbite dei pianeti sono ellissi, con il sole in uno dei due fuochi.» «Tutto ciò e giusto, Jan. Tuttavia, ad eccezione di Mercurio e Plutone, le orbite degli altri pianeti sono quasi circolari e 400 anni fa Plutone non era nemmeno ancora stato scoperto. È interessante comunque notare la fiducia che Keplero nutriva nell’armonia del mondo espressa attraverso i solidi platonici: in essi vedeva la ragione del numero dei pianeti.» «Secondo Keplero dunque, Urano, Nettuno e Plutone non dovrebbero nemmeno esistere! Qui si è però sbagliato di grosso!» «Non solo Keplero, anche Hamilton era fuori pista; altrimenti perché avrebbe chiamato il suo gioco “icosian” quando invece ha luogo su un dodecaedro e non su un icosaedro?» «Non credo che si sbagliasse. Il dodecaedro ha sì 12 facce, ma ha anche 20 vertici, in greco “eikosi”. Nell’icosaedro accade esattamente il contrario: esso ha 20 facce e 12 vertici. Anche il cubo e l’ottaedro sono in questo senso una coppia: 6 facce e 8 vertici per il cubo e 8 facce e 6 vertici per l’ottaedro. Il tetraedro ha 4 facce e 4 vertici.» «Il tetraedro è allora un solitario.» «Oppure il partner di se stesso.» «Ti sei espressa molto bene, Rut. Guardate, in questo disegno che ho trovato sul sito www.cms.wisc.edu/˜cvg/course/491/
Amore platonico?
«Nella costruzione di Keplero puoi vedere i solidi platonici. Essi sono disposti l’uno dentro l’altro in modo tale che la più grande sfera contenuta in uno di essi, la sua sfera inscritta, coincide sempre con la più piccola sfera che racchiude il successivo, cioè la sua sfera circoscritta. I rapporti tra i raggi di queste sfere corrispondono in questo modo, all’incirca, ai rapporti tra i raggi delle orbite dei pianeti. In tutto ciò Keplero ravvisava un mistero divino.»
272 Alla ricerca della via più breve
modules/polyhedra/duality.shtml potete ammirare come i vertici di un solido trapassino esattamente le facce del proprio partner e viceversa, se i due solidi vengono sovrapposti in modo appropriato. Si vede così a colpo d’occhio che ci sono tante facce bianche quanti sono i vertici neri e tante facce nere quanti sono i vertici bianchi. Il numero dei lati, invece, rimane immutato a destra e a sinistra ed è facile verificarlo perché ogni lato del solido a destra tocca un solo lato del solido a sinistra e viceversa. I lati dei due solidi che si corrispondono, toccandosi, si tagliano inoltre reciprocamente a metà.»
«Allora i vertici nel gioco icosiano – o dovrei chiamarlo piuttosto “gioco dell’icosaedro”? – rappresentano ciascuno una delle facce dell’icosaedro? Sir Hamilton l’ha davvero pensata, questa!» «Forse Hamilton ha chiamato il gioco così solo perché il nome “dodecanian game” sarebbe suonato ancora più strano e misterioso. Oppure semplicemente perché il gioco si fa su 20 vertici, come viene anche spiegato all’inizio, nelle stesse istruzioni del gioco, istruzioni redatte in buona parte da Hamilton stesso:»
273 Amore platonico? In this new game (invented by Sir William Rowan Hamilton, LL.D.,&c., of Dublin, and by him named Icosian, from a Greek word signifying “twenty”) a player is to place the whole or part of a set of twenty numbered pieces or men upon the points or in the holes of a board, represented by the diagram above drawn, in such a manner as always to proceed along the lines of the figure, and also to fulfil certain other conditions, which may in various ways be assigned by another player. Ingenuity and skill may thus be exercised in proposing as well as in resolving problems of the game. For example, the first of the two players may place the first five pieces in any five consecutive holes, and then require the second player to place the remaining fifteen men consecutively in such a manner that the succession may be cyclical, that is, so that No. 20 may be adjacent to No. 1; and it is always possible to answer any question of this kind. Thus, if B C D F G be the five given initial points, it is allowed to complete the succession by following the alphabetical order of the twenty consonants, as suggested by the diagram itself; but after placing the piece No. 6 in the hole H, as before, it is also allowed (by supposed conditions) to put No. 7 in X instead of J, and then to conclude with the succesion, W R S T V J K L M N P Q Z. Other examples of Icosian Problems, with solutions of some of them, will be found in the following page. Tratto da: Graph Theory 1736–1936 – N.L. Biggs, E.K. Lloyd, R.J. Wilson, Clarendon Press, 1976, p. 32
274 Alla ricerca della via più breve
«Terribile! Un gioco con una spiegazione così contorta lo rimetterei subito nella scatola.» «Per questo il gioco rimase un fondo di magazzino. Poiché però il primo problema consisteva proprio nella costruzione di un circuito di Hamilton, questioni di questo Z W tipo vengono oggi assoX B ciate al suo nome. Per veG dere come appare una soH luzione dovete solo seguire in questo disegno le 20 consonanti nell’ordine alfabeJ tico.» V
R Q
P N
C D M F K L T
«E va bene. Nel grafo del dodecaedro c’è allora un circuito di Hamilton, così come anche nel grafo della scacchiera 8 × 8. E com’è con grafi generici? Il problema è davvero difficile?» «Oltremodo! Il problema del cammino di Hamilton ed il problema del circuito di Hamilton sono così difficili che probabilmente non ci sarà mai un algoritmo efficiente in grado di risolverli.» «Probabilmente? È un termine piuttosto vago e impreciso che stona particolarmente detto da te.» «Lo trovo anch’io! Ma ce lo racconti meglio domani, okay? Adesso voglio andare ancora un po’ fuori e approfittare di questa bella giornata. Rut, che ne dici di un piccolo giro in bicicletta?» «Oh sì, buona idea!» Detto, fatto. Il giro cominciò attraverso il Forstenrieder Park, portandoli nel cuore di una grossa riserva aperta. A qualche distanza, sul sentiero, attraversò loro la strada perfino un cinghiale. Poi passarono sotto un ponte autostradale e pedalarono per alcuni chilometri su sentieri di campagna e per boschi. I due non avevano fretta; avevano fin troppe cose da raccontarsi. Dopo aver pedalato per un altro bel pezzo, passarono davanti ad un Biergarten.
S
275 Amore platonico?
Biergarten
Rut e Jan, assetati, si sedettero ad un tavolo sotto un grande albero di ippocastano e bevvero entrambi un grosso bicchiere di acqua minerale. «Strano, in molti tavoli la gente ha messo una propria tovaglia e ha portato grosse ceste di cibo da casa. È curioso che sia permesso, nonostante il cibo sia in vendita anche nel Biergarten.» «C’è una ragione storica, per questo. Per conservare fresca la loro birra anche nei mesi estivi, molti degli antichi produttori avevano piantato tutt’attorno alberi di ippocastano, affinché facessero ombra. Non potevano infatti scavare cantine sufficientemente profonde a causa dell’alto livello della falda acquifera. E siccome sotto gli ippocastani si stava anche volentieri seduti a prendere il fresco, in quattro e quattro otto misero fuori delle panche e cominciarono a vendere la loro birra direttamente alla gente.» «E oltre alla birra, anche qualcosa da mangiare, vero?» «Inizialmente sì, ma poi gli osti e gli albergatori di Monaco insorsero, temendo la concorrenza dei produttori di birra. A quel punto, l’allora sovrano Ludwig I, per evitare una ribellione delle categorie interessate, decise salomonicamente che i produt-
276 Alla ricerca della via più breve
tori di birra avrebbero potuto vendere la loro birra, ma non il cibo.» «Capisco. Chi andava allora in un Biergarten per bere un boccale di birra si portava il proprio spuntino da casa.» «Esattamente, e questa tradizione dura ancora oggi, anche se nei Biergarten è da tempo nuovamente consentito vendere stinchi di maiale, pesce alla griglia, Brezeln e altri generi alimentari.» Piacque loro così tanto, là, sotto gli ippocastani, che dimenticarono l’orologio. Decisero così di tornare a casa con i mezzi pubblici: treno e metropolitana; seguendo il percorso più breve, naturalmente. A quell’ora era consentito salire con le biciclette e dunque non c’era alcun problema. Durante il viaggio, a Rut tornarono in mente i solidi platonici. Si era un po’ meravigliata che Vim glieli avesse descritti così in dettaglio: sembrava infatti che non avessero molto a che fare con i problemi di Pianificazione di itinerario. Ma in fondo era stata lei a insistere che le spiegasse che cosa ci fosse di così speciale in questi solidi.
Notoriamente Problematico
Rut andò a scuola con il solito umore del lunedì mattina. Quando finalmente suonò l’intervallo, Rut incontrò Jan nel cortile. «Mi sono appena aggiunto al gruppo che organizza la festa di fine anno a scuola. Hai voglia di partecipare anche tu?» «Ma certamente.» «Ottimo! La lista è appesa davanti alla sala insegnanti.» Jan e Rut si diressero verso la sala insegnanti e Rut scrisse anche il suo nome in fondo alla lista. «Sarà sicuramente una cosa grandiosa!» «Ma non sarà neppure tanto semplice.» «Non temere, troppo complicato non può essere. Basta fare sì che ogni cosa avvenga nei limiti di tempo stabiliti.» «Come in un concerto rock. Ti ho già raccontato che simili problemi di pianificazione possono essere risolti teoricamente con i grafi?» «Sì, me l’hai detto. In questo momento trovo comunque molto più interessanti i problemi difficili di cui Vim parla sempre. Su questo argomento voleva raccontarci ancora qualcosa.» «Chiediamoglielo oggi pomeriggio. Hai tempo?» «Certo! Sono da te verso le due. Okay?» «Magnifico!» Quando Jan giunse a casa di Rut, lei aveva già preparato tutto.
278 «Ben svegliato, Vim!» Alla ricerca della via più breve
«Ben svegliato? Sono già quasi le due del pomeriggio. Jan, ti sei alzato solo adesso?» «Io no, pensavo invece che tu. . . » «. . . che io me ne stessi intontito a poltrire, quando non parlo con voi? E se anche fosse, ogni computer ha pur sempre un suo orologio interno!» «Ma sentilo! “E se anche fosse”, dice. E che faresti allora quando sei spento?» «Adoro esibirmi nei cyber-café, girovagare per le autostrade di dati oppure intrattenermi amabilmente in chiacchiere in qualche chat-room.» «Che esagerato! Raccontaci piuttosto qualcosa d’altro sulla Pianificazione di itinerario.» «Dai, parlaci un po’ dei problemi difficili.» «Col termine “difficile” indichi sempre quei problemi per i quali, come dici tu stesso, “probabilmente non c’è alcun algoritmo non esplosivo”. Potresti spiegare meglio questo punto?» «Volentieri, se vi interessa. Questa faccenda dei problemi difficili, tuttavia, non è delle più immediate.» «Risiede in qualche modo nella natura stessa delle cose, vero?» «Prendiamo ad esempio il problema del circuito di Hamilton. Si tratta di un problema decisionale. Così vengono chiamati tutti i problemi la cui soluzione consiste in un “sì” oppure in un “no”. Alla domanda se un determinato grafo possiede ad esempio un circuito di Hamilton, possiamo rispondere solo con un “sì” o con un “no”.» «Capisco. Siccome dobbiamo decidere tra un “sì” e un “no”, abbiamo un problema decisionale.»
279
R Q
P
Z
W X
B
N
C
S
D
G
M
H F K J V
L T
«Certamente, una volta che la soluzione è nota.» «Anche nel problema delle mosse del cavallo sulla scacchiera possiamo facilmente accertare che la soluzione di Eulero è effettivamente corretta, siete d’accordo?» «Sì, ci vuole un po’ più di tempo, ma del resto ci sono anche molti più vertici.» «Se dunque non mi limito a rispondere affermativamente alla domanda sull’esistenza di un circuito hamiltoniano, ma vi esibisco anche un tale circuito, allora per voi non è difficile verificare se quella che ho spacciato per soluzione lo sia davvero oppure no, cioè, in questo caso, se sia un circuito di Hamilton. La soluzione fornita è dunque una dimostrazione che la risposta “sì” è corretta: il grafo contiene un circuito di Hamilton.» «Oh bella, ma su questo non ci piove! Se mi chiedi: “Questo grafo contiene un circuito di Hamilton?”, mi metto subito a cercarne uno e, se lo trovo, la risposta naturalmente è: “Sì, ne contiene uno”. Non c’è bisogno di parlare di “dimostrazione”.
Notoriamente Problematico
«Il problema del circuito di Hamilton ha anche un’ulteriore interessante proprietà. Dopo avervi mostrato la soluzione del gioco icosiano, non è stato difficile per voi verificare che effettivamente si trattava di una soluzione corretta.»
280 Alla ricerca della via più breve
Dire che “il circuito di Hamilton è una dimostrazione dell’esistenza di un circuito di Hamilton” suona piuttosto curioso, non trovi?» «Fornire direttamente una soluzione è solo uno dei possibili modi di dimostrare la correttezza della risposta. Per provare che un grafo è euleriano, non dobbiamo necessariamente esibire un circuito di Eulero. In virtù del teorema di Eulero, in questo caso è sufficiente fornire come dimostrazione la lista dei gradi dei vertici. A partire da essa è facile controllare che tutti i valori siano pari. Ecco dove voglio arrivare a parare: se a proposito di un determinato grafo G vi dico solo: “G possiede un circuito di Hamilton”, non è per niente chiaro come voi possiate verificare la validità della mia affermazione. Potrei anche sbagliarmi.» «Sbagliarti tu? Non me lo immagino nemmeno. Al massimo apposta, per metterci alla prova.» «Se invece vi dico che i vertici del grafo dell’icosaedro, presi in ordine alfabetico, costruiscono un circuito di Hamilton, allora potete facilmente verificarlo.» «È chiaro! Dobbiamo solo accertare che ogni vertice compaia esattamente una volta e che tra due vertici consecutivi qualsiasi esista sempre un lato del grafo che li congiunga.» «E un lato che congiunga il primo con l’ultimo. Il cammino deve chiudersi su se stesso, per avere un circuito.» «Esatto. Tutti i problemi decisionali per i quali la risposta “sì” è accompagnata da una dimostrazione verificabile in modo efficiente si chiamano problemi NP.» «Problemi NP? Sono le iniziali del loro scopritore?» «No, NP sta per “Non deterministic Polynomial”, cioè “non deterministicamente polinomiale”. Si tratta di un concetto che proviene dalla Teoria della Complessità computazionale ed ha di nuovo a che fare con la macchina di Turing.» «Era quel modello teorico di computer, non è vero?»
281
«Intendi dire che se qualcuno facesse il lavoro al nostro posto e risolvesse il problema per noi, dovremmo almeno essere in grado di verificare se la soluzione è corretta?» «Ma è logico! Altrimenti il tizio che dice di aver risolto il problema potrebbe anche averci preso in giro! Ma non si può trovare una dimostrazione simile per qualsiasi problema decisionale?» «Per molti di essi, ma non per tutti. Formuliamo la domanda del problema del circuito di Hamilton al contrario: “Dato un grafo G, G è privo di circuiti di Hamilton?” Anche questo è un problema decisionale e la risposta “sì” significa che nel grafo non ci sono circuiti di Hamilton. Adesso provate ad immaginare di dovermi convincere che la risposta affermativa è corretta. Come fareste?» «Bah, un circuito di Hamilton sarebbe ora una prova del contrario e dunque non se ne parla nemmeno.» «Dovremmo in qualche modo escludere tutti i circuiti di Hamilton.» «Una lista completa di tutti i circuiti presenti nel grafo che mostrasse che il grafo non possiede circuiti di Hamilton sarebbe una valida argomentazione. Tuttavia, il numero dei circuiti in un grafo può di nuovo diventare molto grande, al punto da non riuscire più nemmeno ad elencarli tutti. E se non riusciamo nemmeno a scrivere la lista, non se ne parla proprio di controllarla, per escludere che ci sia in mezzo un circuito di Hamilton. Di questo problema del circuito di Hamilton “rovesciato” non si sa fino ad oggi se sia o no un problema NP. Si è inclini a credere piuttosto che non lo sia.» «Di nuovo credere? Ma quante domande sono ancora senza risposta in matematica?» «Oh, un bel mucchio. È proprio questo che la rende così avvincente!»
Notoriamente Problematico
«Sì. Senza bisogno però di entrare nei dettagli, a noi basti che i problemi NP abbiano la seguente proprietà: ogni volta che in un problema concreto la risposta è “sì”, esiste anche una “dimostrazione” che possiamo controllare in modo efficiente.»
282 Alla ricerca della via più breve
«Ed io che ho sempre pensato che in matematica tutto fosse fissato e stabilito.» «No, no! I matematici fanno quotidianamente passi avanti, ma ogni giorno si pongono nuove sfide e sorgono sempre nuove domande alle quali chissà mai se e quando si potrà rispondere. In tutto ciò, sono continuamente necessarie idee nuove ed originali.» «E va bene. Che c’entra allora questo NP con la nostra domanda sui problemi difficili?» «NP è una classe di problemi molto vasta. In pratica tutti i problemi di cui vi ho parlato finora appartengono, in una forma o nell’altra, a questa classe. Tuttavia, in questa classe ci sono problemi che sono talmente difficili che, se solo si trovasse un algoritmo efficiente per risolvere uno di essi, immediatamente si avrebbero anche algoritmi efficienti per tutti gli altri. Questi problemi “più difficili” vengono detti NP-hard e possiamo chiamarli anche semplicemente i problemi difficili nella classe NP.» «Se siamo in grado di risolverne uno in modo efficiente, allora anche tutti gli altri? Che cosa intendi dire con questo?» «Già, si tratta davvero di una proprietà del tutto fuori dall’ordinario. Proverò a spiegarmi ricorrendo ad una analogia. Possiamo pensare a un algoritmo come alla capacità di risolvere un problema. Prendiamo allora, al posto dei problemi NP, tutti i lavori artigianali: fare il pane, aggiustare le scarpe, soffiare il vetro e così via; proprio tutti i lavori manuali per i quali c’è un apprendistato. Adesso immaginiamo che tra tutti questi mestieri ce ne sia uno, mettiamo il fornaio, con la proprietà corrispondente al fatto di essere difficile nella classe NP.» «Okay, fare il pane sarebbe allora un mestiere difficile in NP. Ma questo cosa significa?» «Vorrebbe dire che se fossi un buon fornaio – buono qui corrisponde all’efficienza degli algoritmi – in linea di principio sarei anche un buon falegname, un bravo costruttore di barche, un valente fabbro e lo stesso dicasi per tutti i lavori artigianali che ancora ci sono.»
283 Notoriamente Problematico «Ma che sciocchezza! Nessuno sa fare tutte queste cose insieme. Un super-artigiano così non esiste proprio.» «Con i lavori manuali no, ma tra i problemi della classe NP sì!» «Sembra incredibile! Allora ci saranno senza dubbio solo pochi problemi difficili in NP.» «No, purtroppo ce n’è una grandissima quantità. Tutti i problemi che finora ho qualificato in modo un po’ impreciso come difficili, cioè tutti quelli per i quali presumibilmente nessun algoritmo efficiente esiste, sono NP-hard; anche il problema del circuito di Hamilton.» «Vuoi dire che se avessimo un algoritmo efficiente per il problema del circuito di Hamilton potremmo risolvere in modo efficiente ogni problema della classe NP?» «Proprio così, Jan.» «Davvero? Questo ancora non lo capisco. Come può un algoritmo per il problema del circuito di Hamilton risolvere automaticamente un problema diverso? Normalmente nemmeno l’input e l’output si adattano tra loro.» «Bella domanda. Proviamo ad arrivarci dalla parte opposta. Rut, ti ricordi quel problema di cammino minimo nel quale
284 Alla ricerca della via più breve
avevamo ammesso anche pesi negativi per il lati ma avevamo vietato la visita di un vertice più di una volta?» «Oh sì. L’avevamo ottenuto con il tuo modello per la deviazione a Rothenburg. Quel modello che non ci era stato di grande aiuto; tu avevi detto che giunti a quel punto la faccenda poteva diventare difficile.» «Esatto. Ora immaginate per un istante di avere un algoritmo efficiente A che risolva questo problema. A partire da esso otterremmo immediatamente un algoritmo efficiente per il problema del circuito di Hamilton.» «Qualcuno può spiegarmi di cosa state parlando?» «Oh scusa, Jan! Tu, a quel punto, non eri ancora dei nostri. Volevamo tradurre in un modello il fatto che, in un viaggio di Rut con i suoi genitori da Monaco ad Amburgo, ci fosse o no tempo sufficiente per una deviazione a Rothenburg. Io avevo suggerito di farlo con l’aiuto di pesi negativi. Un peso negativo su Rothenburg avrebbe costituito un incentivo per l’algoritmo a scegliere un percorso passante per questa città. In questo contesto si ottiene una versione del problema del cammino minimo in cui sono ammessi pesi qualsiasi per i lati – e quindi anche pesi negativi –, nella quale però ogni vertice può essere attraversato al massimo una volta sola.» «Ci vuoi allora mostrare che un algoritmo efficiente per questo problema di cammino minimo “monouso” risolve anche il problema del circuito di Hamilton?» «Mi piace il nome che gli hai dato. Voglio mostrare che un algoritmo A per il problema del cammino minimo monouso potrebbe servire, per così dire, come sottoprogramma nella costruzione di un algoritmo efficiente B per il problema del circuito di Hamilton.» «Ma pensavo che il problema del circuito di Hamilton fosse difficile in NP. Non hai detto che per questo problema non c’è ancora un algoritmo efficiente e forse mai ci sarà?» «Sì, l’ho detto. Stiamo infatti solo facendo delle ipotesi. Adesso è importante che noi assumiamo l’esistenza di un simile algoritmo A. Funziona di nuovo come in una dimostrazione per
285
«Ah, poiché invece B non c’è, non c’è nemmeno A.» «Quasi. Non siamo sicuri che non esista davvero un algoritmo efficiente B per il problema del circuito di Hamilton.» «Ma come possiamo fare allora una dimostrazione per assurdo?» «In nessun modo. Non possiamo nemmeno escludere definitivamente l’esistenza di A. Siccome però dall’esistenza dell’algoritmo A segue immediatamente quella di B, se si sa risolvere il problema del cammino minimo monouso, si sa risolvere anche il problema del circuito di Hamilton. Sappiamo cioè che quello del cammino minimo monouso non è un problema più facile: esso è difficile almeno tanto quanto il problema del circuito di Hamilton, se non di più. Poiché quest’ultimo è difficile in NP, anche il problema del cammino minimo monouso deve esserlo.» «Va bene. Ma i due problemi appaiono però così diversi tra loro! Come puoi costruire un algoritmo per l’uno a partire da un algoritmo per l’altro?» «Vediamolo concretamente. Consideriamo un grafo qualsiasi G, con n vertici, un grafo per il quale dobbiamo stabilire se contiene o no un circuito di Hamilton.»
«Ma questi sono due grafi!» «Giusto. Due possibili grafi G in input, uno provvisto ed uno privo di un circuito di Hamilton. Non dimenticare inoltre che
Notoriamente Problematico
assurdo. Ammettiamo che ci sia un algoritmo efficiente A per il problema del cammino minimo monouso e mostriamo che in questo caso ci sarebbe anche un algoritmo efficiente B per il problema del circuito di Hamilton.»
286 Alla ricerca della via più breve
si tratta solamente di esempi, fatti per chiarire il procedimento. La costruzione deve funzionare naturalmente con qualsiasi grafo, cosa che, in effetti, avviene. Per prima cosa assegniamo ad ogni lato di G il peso −1. Quindi aggiungiamo a G i lati che mancano per avere un grafo completo G sugli stessi vertici e attribuiamo a questi nuovi lati il peso 0.» –1
–1
p
–1 p
0 –1
0 –1
–1
–1
0
–1
0 –1
–1
–1
–1
0
0
0
0
«E poi?» «Poi, con l’algoritmo A, risolviamo il problema del cammino minimo monouso per il grafo G , scegliendo come partenza e traguardo lo stesso vertice. Poiché ogni vertice può essere visitato una sola volta, il cammino minimo trovato conterrà al massimo n lati. Ne segue che la sua lunghezza non potrà essere più piccola di −n. Il valore −n stesso sarà raggiunto solamente se il percorso attraverserà n lati con peso −1. Un cammino simile esiste allora esattamente quando in G c’è un circuito di Hamilton.» –1
–1 p
p
–1
–1
–1
–1 –1
–5
–1
–1
–4
«Pian piano comincio a capire quello che intendi dire. Con l’aiuto dell’algoritmo A otteniamo adesso anche un algoritmo efficiente B per il problema del circuito di Hamilton.» «Ne otterremmo uno. Abbiamo solo ipotizzato che ci sia questo algoritmo efficiente A.»
287
«Come? Vim, non avevi detto che avremmo algoritmi efficienti per tutti i problemi della classe NP se ne trovassimo anche uno solo per uno qualsiasi dei problemi NP-hard?» «Sì, la classe dei problemi NP-hard è definita esattamente così.» «Non dobbiamo allora confrontare il nostro problema con tutti i problemi di NP? Col tuo esempio ci hai solo fatto vedere come da un algoritmo per la soluzione del problema del cammino minimo monouso se ne possa ottenere uno che risolve anche il problema del circuito di Hamilton. E tutti gli altri?» «Giustissimo, ma quello che abbiamo fatto è anche sufficiente. Il resto funziona come in una dimostrazione per induzione. Come succedeva nel primo passo, quello che avevamo chiamato “inizio dell’induzione”, serve un primo problema, per il quale bisogna effettivamente dimostrare che è difficile in NP. Una volta fatto questo però, non serve più ripetere tutto il lavoro e confrontare anche il successivo candidato NP-hard con tutti i problemi di NP. È sufficiente mostrare che questo candidato non sia un problema più facile del primo problema NP-hard trovato. E si va avanti così. Se si dimostra che un dato problema non è più facile di uno qualsiasi dei problemi già noti per essere difficili in NP, esso stesso risulterà essere difficile in NP. Non fa alcuna differenza, in tutto ciò, quale dei problemi difficili in NP si scelga per fare il confronto.» «Il problema del circuito di Hamilton è stato il primo problema difficile in NP?» «No, il primo problema difficile in NP è stato satisfiability. In questo problema si tratta di stabilire se un certo numero di enunciati logici in un certo numero di variabili possano essere soddisfatti simultaneamente per qualche combinazione di valori attribuiti alle variabili stesse.» «Davvero questo primo problema dovette essere confrontato con tutti gli altri problemi della classe NP? Se, come dici tu, questi problemi sono tantissimi, deve essere stato un lavoro pazzesco.»
Notoriamente Problematico
«Ma adesso sappiamo che il problema del cammino minimo monouso è difficile in NP, giusto?»
288 Alla ricerca della via più breve
«Sono state necessarie un paio di buone idee ed è stato Stephen Cook ad averle, nel 1971. Lui ha rotto il ghiaccio. Sulla sua homepage www.cs.toronto.edu/DCS/People/ Faculty/sacook.html c’è una sua foto:»
«E Cook avrebbe dimostrato che un algoritmo efficiente che risolva satisfiability può essere tradotto in algoritmi efficienti per risolvere ciascuno dei problemi di NP?» «Già, ha fatto proprio questo. A proposito, ci si riesce solo con l’aiuto della macchina di Turing ed un gran mucchio di formule logiche.» «Okay, dunque esiste un primo problema difficile. E dopo? Si va avanti davvero come con l’induzione?» «Più o meno. Nell’induzione – come Rut stessa si era espressa – la proprietà saliente viene sempre ereditata, ricordate? Anche qui, tutte le volte che si vuole mostrare che un dato problema è difficile in NP, se ne cerca un altro, del quale si sappia già che è difficile in NP e si mostra quindi che il nuovo problema è almeno altrettanto difficile.» «E ciò è sufficiente?» «Certo! Diamo ancora un’occhiata al nostro esempio di prima. Ammettiamo di sapere già che il problema del circuito di Hamilton sia difficile in NP. Dalle nostre precedenti riflessioni
289
«Con l’aiuto di A otterremmo allora algoritmi efficienti per tutti i problemi di NP.» «Sì, qui viene in nostro aiuto l’“ipotesi induttiva”. Noi abbiamo infatti ammesso che il problema del circuito di Hamilton fosse difficile in NP. Sotto questa ipotesi, qualsiasi algoritmo che risolva questo problema può essere convertito in un algoritmo per ciascuno degli altri problemi in NP.» «Ci sono! Usando A come sottoprogramma costruiamo un algoritmo per il problema del circuito di Hamilton e quest’ultimo, sfruttato a sua volta come sottoprogramma, porta ad algoritmi per tutti gli altri problemi di NP. È così perché il problema del circuito di Hamilton è difficile in NP. Il nostro A, dunque, in due passaggi, porta ad algoritmi per tutti gli altri problemi di NP e così anche quello del cammino minimo monouso è un problema difficile in NP.» «Esatto, Rut!» «Mi fuma il cervello!» «Anche a me, ma in qualche modo tutto ciò è emozionante.» «Se vuoi saperne di più puoi andare a visitare il sito web www.claymath.org/prizeproblems/. A questo indirizzo
puoi trovare una lista di sette delle più importanti questioni attualmente irrisolte della matematica; ciascuna di esse è dotata di un premio di un milione di dollari per la persona che per prima riesce a dare una risposta. Una di queste sette domande è:» ?
P = NP
Notoriamente Problematico
sappiamo anche che il nostro problema del cammino minimo monouso è almeno altrettanto difficile. A partire da un algoritmo efficiente A per il problema del cammino minimo monouso possiamo infatti costruirne uno per la soluzione del problema del circuito di Hamilton. Se dunque il problema del circuito di Hamilton è difficile in NP – e in effetti lo è –, allora anche il nuovo problema deve essere difficile in NP.»
290 «P = NP?» Alla ricerca della via più breve
«È questa la formulazione matematicamente precisa della questione se per uno qualsiasi dei problemi difficili in NP – e così anche per tutti gli altri – esista un algoritmo efficiente. Trovo particolarmente piacevole che Ian Stewart, in una sotto-pagina, dichiari che anche il famoso gioco di Windows “Minesweeper” è difficile in NP.» «Dovrei conoscerlo?» «Ma certo, fa parte integrante del sistema operativo.» «Guarda qui, Rut, te lo faccio partire:»
«Minesweeper non è un gioco difficile, Vim! Ci riesco quasi tutte le volte.» «Attento, Jan! Per mostrare che un problema non è difficile, hai bisogno di trovare un algoritmo risolutivo efficiente. Alcuni esempi, risolti in qualche modo “a naso”, non permettono di fare alcuna affermazione sulla difficoltà del problema. Anche per il problema del cavallo o per quello dell’icosaedro avevamo trovato soluzioni. Tuttavia il problema del circuito di Hamilton, per grafi qualsiasi, è difficile.» «Okay, Vim, tutto ciò è indubbiamente molto bello, ma noi, questi problemi, alla fine vorremmo poterli risolvere comunque. La nettezza urbana non può restarsene a casa solo perché il problema misto del postino cinese è difficile, no?»
291
«La mia alternativa adesso è “aria fresca”. Rut, che ne dici se “girovagassimo” un po’ verso la più vicina gelateria?» «Buona idea! Qui da noi, all’angolo, fanno una fantastica banana-split.» «Preferisco gli spaghetti-gelato; se si può, una doppia porzione.»
«E tu Vim? Ti portiamo qualcosa?» «No, no, io devo rimanere in-linea. . . » «Ma va’!»
Notoriamente Problematico
«No, certamente. Tuttavia sappiamo adesso che conviene essere meno ambiziosi e aggiustare il tiro. Siccome, probabilmente, non esiste alcun algoritmo efficiente per nessuno dei problemi difficili in NP, non ha molto senso mettersi a cercarne uno adesso, a meno che non si voglia affrontare proprio la domanda da un milione di dollari. Dobbiamo perciò ripiegare su alternative più modeste, se vogliamo uscire da questo “stato di necessità”.»
Sorte di un commesso viaggiatore
Quando il mattino seguente Rut scese le scale, sua madre era già sveglia e sembrava un po’ inquieta. Rut le chiese spiegazioni e lei disse che suo padre aveva telefonato il giorno prima: alcuni appuntamenti che si erano aggiunti all’ultimo momento avevano mandato all’aria la sua agenda e così lui si era visto costretto a prolungare il suo soggiorno negli Stati Uniti di un paio di giorni. La madre di Rut era seccata per via della vacanza che avevano già programmato di fare. In caso di ulteriori slittamenti nel viaggio di lavoro di suo padre, infatti, il sabato successivo Rut e lei sarebbero dovute partire da sole per la Francia. La madre di Rut non era mai stata entusiasta di guidare l’auto e adesso sul volto aveva dipinta un’espressione, tra lo sgomento ed il rassegnato, come se già le toccasse starsene da sola al volante tutto il tempo. Vacanze! Negli ultimi giorni Rut aveva completamente dimenticato che per tre settimane sarebbe andata in Provenza con i suoi genitori. Quando suo padre aveva prenotato la casa per le ferie, Rut era stata felicissima, ma adesso i suoi sentimenti erano un po’ in conflitto tra loro. Come se non bastasse, la mamma aveva deciso che il papà non avrebbe portato con sé né il telefonino, né il computer portatile. Doveva pur riposarsi una buona volta come si deve, quel pover’uomo! Questo “blocco delle comunicazioni” pesava adesso su Rut. Rut approfittò già della prima pausa per raccontare a Jan dei loro piani di viaggio. Nemmeno lui fu felicissimo di sapere che per tre settimane non si sarebbero visti e non avrebbero neppure potuto scriversi con la posta elettronica. Jan disse tuttavia di voler tentare di anticipare la visita a suo zio, in modo da poter passare insieme a Rut almeno la seconda parte delle vacanze estive.
294 Alla ricerca della via più breve
Martina corse loro incontro, chiedendo se quella sera avevano voglia di provare con lei “Zug um Zug”, un gioco di società che aveva ricevuto in regalo per il compleanno. Rut, all’inizio, non era affatto entusiasta, ma Jan la convinse che invece era una buona idea, sempre meglio che starsene a casa a “intristirsi”. Al termine delle lezioni ebbe luogo il primo incontro per l’organizzazione della festa di fine anno. Passato l’entusiasmo iniziale, in Rut aveva prevalso un certo scetticismo, visto che ormai era troppo tardi per mettere in piedi qualcosa di veramente innovativo. Ma poco importava: con Jan i preparativi sarebbero stati ugualmente divertenti. Dopo l’incontro, Jan dovette andare a casa. Sua madre l’aveva pregato di sbrigare alcune piccole commissioni. Quando più tardi giunse a casa di Rut, rimaneva ancora un po’ di tempo, prima dell’appuntamento da Martina. «Ciao Vim. Ieri ci stavi insegnando qualcosa sulla “modestia”.» «Oh, anche oggi andate di fretta. Posso presentarvi ugualmen1 te un nuovo problema?» 1
«Ma certo, se è interessante.» «Immaginatevi allora che un agente assicurativo debba visitare un certo numero di clienti. Il grafo dei villaggi circostanti, dove i clienti abitano, potrebbe avere ad esempio questo aspetto:»
2
3
1
2
1 1 2 2
3
5
«E per risparmiare tempo e denaro, l’assicuratore prova a disporre in ordine gli appuntamenti in modo da dover viaggiare lungo un cammino minimo.» «Giusto. Vogliamo di nuovo minimizzare qualcosa. Questa volta però cerchiamo il cammino più breve che attraversa tutti i vertici e non più tutti i lati, come accadeva nel problema del postino cinese.» «Vedi, Jan? La storiella del cavallo sulla scacchiera era solo un pretesto. In realtà Vim aveva in mente un problema di ottimizzazione molto concreto.»
295
«Sì e no. Per cominciare, non proibiamo all’agente di passare due volte per lo stesso villaggio. Se questo porta ad un cammino più breve, l’agente non si preoccuperà affatto di descrivere un circuito di Hamilton. Come potete vedere qui sotto, nel nostro grafo ci sono esattamente due circuiti di Hamilton ed hanno entrambi lunghezza 17. Il cammino raffigurato in basso ha invece lunghezza 14 e questo nonostante il lato all’estrema destra – e dunque anche il vertice in alto a destra – venga percorso due volte.» 1
1 1 2
3
1
1
2
3
2
1
1
1 2
2 2 3
1
2
1
2 3
5
5
1 1 2
3
1
2
1 1 2 2
3
5
«Ah, un viaggio a vuoto! Qui è chiaro che la soluzione non è un circuito di Hamilton. Perché hai detto allora “sì e no”?» «Possiamo di nuovo aggiungere lati al grafo, rendendolo un grafo completo, come avevamo fatto per il problema del postino cinese. Come peso, attribuiamo di nuovo a tutti i lati, anche a quelli che prima non c’erano, la lunghezza di un cammino minimo tra i loro vertici nel grafo originale. Qui a fianco ho esemplificato tutto ciò per quattro dei nuovi lati, ma anche il peso del lato in basso a destra è cambiato. Nel grafo origi-
Sorte di un commesso viaggiatore
«Vuoi dire che dobbiamo trovare adesso un circuito di Hamilton di costo minimo?»
296 Alla ricerca della via più breve
nale, infatti, il cammino più breve tra questi due vertici ha una lunghezza pari a 4 unità.» 1 1 2
3
2
2
1
2
1 2
1 5
2 2
3
4
«Capisco. I cammini minimi rappresentano per il nostro agente le distanze tra le località. Non può certo tagliare per i campi e nemmeno vorrà fare giri inutili. Dobbiamo di nuovo trovare i cammini minimi tra ogni coppia di vertici. Non avrei mai creduto che si potessero usare così spesso i cammini minimi.» «Nei grafi completati c’è sempre un circuito di Hamilton che è ottimale per l’agente. Qui si tratta ancora del giro di lunghezza 14. Il viaggio a vuoto è ora semplicemente contenuto nel nuovo lato.» 1 1 2
2
3
2
1
2
1 2
1 5
3
2 2
4
«Ma certo! I pesi dei lati sono qui le lunghezze dei cammini minimi tra due vertici. Dunque passare per un altro vertice non può più rendere la strada più breve.» «Il problema di trovare in un grafo un circuito di Hamilton di peso minimo va sotto il nome di traveling-salesman-problem, cioè il problema del commesso viaggiatore. Il più delle volte lo
297
«Dunque cerchiamo un tour ottimale per il nostro agente assicuratore. . . » «. . . oppure per qualche altro commesso viaggiatore. All’indirizzo www-m9.ma.tum.de/dm/java-applets/tsp-afrikaspiel/ potete provare voi stessi a costruire un tour ottimale attraverso 96 città africane. Si viaggia in aereo e perciò le distanze tra le città sono intese in linea d’aria.»
«Wow! Proviamo subito.» «Comincia tu. Io intanto vado in cucina a preparare il tè. Poi sarà il mio turno. Vediamo chi di noi due trova l’itinerario più corto!»
Sorte di un commesso viaggiatore
si abbrevia in TSP. Il TSP è senz’altro il più famoso di tutti i problemi della teoria dei grafi; è addirittura, per antonomasia, il prototipo del problema difficile in NP. Molti dei metodi algoritmici a disposizione oggi sono stati originariamente sviluppati per questo problema. Se i vertici corrispondono a città su una carta geografica, allora risolvere il TSP non significa altro che trovare il più breve itinerario che permette di visitare tutte le città, facendo ritorno al punto di partenza.»
298 «E tu Vim stai attento che nessuno bari.» Alla ricerca della via più breve
Detto, fatto. Mentre Rut era in cucina, Jan costruì il suo giro del. l’Africa; era lungo 60 352 km. Rut attese con impazienza che il tè fosse pronto e fece quindi subito ritorno con la teiera e due tazze. . Ora toccava a lei: 60 009 km. Che trionfo!
. Il tour di Rut, 60 009 km
«Hai visto, Vim? Ho inflitto a Jan una sconfitta umiliante.» «Ma non esagerare! Lo chiamerei piuttosto un finale al fotofinish. E senz’altro nemmeno il tuo giro è ottimale.» «Ma non si può fare molto meglio di così, vero Vim?» . «Il percorso ottimale ha una lunghezza di 55 209 km, quasi . 5 000 km in meno.» «Oh, il nostro commesso viaggiatore risparmierebbe un bel pezzo di strada. Come tour operator avresti ancora qualcosa da imparare, Rut.»
299
«Okay. Il primo che lo trova riceverà dall’altro un gelato. Ma di’ un po’, Vim, prima hai detto che molti degli approcci ai problemi difficili sono stati sviluppati sul TSP. C’erano davvero così tanti commessi viaggiatori con lunghi giri da fare, affinché valesse davvero la pena di fare tutto ciò?» «Quella del commesso viaggiatore che cerca l’itinerario migliore per visitare un certo numero di città è solo una bella rappresentazione, utile per illustrare il problema efficacemente. Ci sono tuttavia applicazioni più importanti del TSP, come ad esempio la costruzione dei circuiti stampati che si trovano nei televisori, nei computer o nelle lavatrici.» «Che c’entra questo con il commesso viaggiatore?» «Nella maggior parte delle schede dei circuiti stampati occorre praticare dei fori, attraverso i quali, in seguito, si realizzeranno i collegamenti con i componenti elettronici. Tutto ciò può allora avere all’incirca questo aspetto:»
Tratto da: M. Grötschel, M. Padberg – Die optimierte Odyssee, Spektrum der Wissenschaft, Digest 2/1999, pp. 32–41
Sorte di un commesso viaggiatore
«Ma senti chi parla! Il tuo percorso era ancora più lungo. Comunque, non mi dò per vinta. Non sarà certo così difficile trovare il tour ottimale.»
300 Alla ricerca della via più breve
«Ma simili compiti sono oggi affidati quasi sempre ai robot, che li eseguono comunque in un lampo.» «Il robot deve però sapere in anticipo in che successione fare i buchi. Ecco qui come due di queste possibili successioni possono apparire. Le linee rosse rivelano il movimento del trapano. Notate qualche differenza tra i due tour?»
Tratto da: M. Grötschel, M. Padberg – Die optimierte Odyssee, ibiden
301
«Soprattutto questa grossa “N” che nella prima successione passa nel bel mezzo del circuito stampato, non fa una bella impressione. La lunghezza del percorso del trapano ha una qualche importanza, vista la velocità dei robot?» «Nella seconda successione, la lunghezza del cammino del trapano è all’incirca la metà della prima. Facciamo due calcoli. Ammettiamo che finora i fori siano stati praticati secondo il percorso più lungo e che ci vogliano 5 unità di tempo – chiamiamoli semplicemente “tempi” – per finire un circuito stampato. Poniamo inoltre che questi 5 tempi siano così ripartiti: 3 tempi per l’abbassamento e l’innalzamento del trapano e 2 tempi per gli spostamenti da foro a foro.» «Allora con la nuova successione ci vorrebbero in tutto solo 4 tempi per ogni circuito stampato: di nuovo 3 tempi per i movimenti verticali del trapano e un tempo solo per gli spostamenti da un foro all’altro.» «Giusto. In questo modo il robot può produrre giornalmente il 20 per cento di circuiti stampati in più rispetto a prima.» «È vero. Tutto ciò non dipende affatto dalla velocità del robot. C’è sempre questo guadagno.» «E trovare una successione ottimale non significa altro che risolvere il nostro problema del commesso viaggiatore. . . » «. . . nel quale stavolta è la testa del trapano a fare le veci del rappresentante in viaggio. Penso di sapere come deve essere il grafo di cui tu stai parlando. I fori sono i vertici. Ci sono poi lati tra ogni coppia di vertici, poiché il trapano può essere guidato lungo ogni possibile traiettoria. I pesi dei lati si ottengono dai tempi che il trapano impiega per spostarsi da un foro all’altro.» «Che buffo! Il problema del trapano somiglia tantissimo al nostro problema del plotter di venerdì scorso. Fare dei fori in un circuito stampato oppure soltanto disegnare con la testina del plotter i punti nei quali i buchi devono essere fatti, non fa alcuna differenza, vero?»
Sorte di un commesso viaggiatore
«Ma certo! Nella prima successione il trapano fa chiaramente degli spostamenti inutili. In ogni caso, la prima immagine appare molto più “rossa” della seconda.»
302 Alla ricerca della via più breve
«No, hai completamente ragione. I pesi dei lati sono forse un po’ diversi, ma se il plotter deve solo disegnare questi punti, si tratta di nuovo di un problema identico al TSP.» «Tu avevi anche detto però che il problema del plotter sarebbe un esempio di un problema del postino cinese. Quest’ultimo, tuttavia, è molto più facile del TSP.» «Sì, ma vi avevo anche avvertito che il problema del plotter è un problema del postino cinese solo se il disegno da tracciare è connesso. Se si ammettono anche disegni non connessi, sono permessi naturalmente anche disegni fatti di puntini, come nel caso dei buchi del trapano. A questo punto non abbiamo più a che fare con il semplice problema del postino cinese, ma con il difficile – in NP – problema del commesso viaggiatore.» «E siccome potremmo risolvere il TSP, difficile in NP, con un algoritmo per il problema generale del plotter, anche quest’ultimo è difficile in NP, giusto?» «Sì, ma attenzione! Poiché i movimenti di pen-up del plotter seguono sempre i collegamenti in linea d’aria, potremmo risolvere, con un algoritmo per il plotter, solo quei problemi di TSP che coinvolgono distanze in linea d’aria. Siccome il problema del commesso viaggiatore è difficile in NP anche in questo caso, la tua conclusione che il problema generale del plotter sia difficile in NP rimane valida.» «È pazzesco a quante cose si debba stare attenti. Questa piccola differenza che consiste solamente nel permettere disegni separati uno dall’altro rende di nuovo difficile un problema che altrimenti sarebbe facile. Da non credere.» «“Difficile in NP” è una etichetta chiara per indicare che si ha a che fare con un osso duro. Cosa volevi dire allora quando invitavi a ripiegare su “alternative più modeste”?» «Okay. Poniamo di nuovo che il grafo in input sia connesso e che tutti i pesi siano positivi. Allora, senza perdita di generalità, possiamo supporre che il grafo sia completo e che ogni lato rappresenti il collegamento più breve tra i vertici ai suoi estremi, rendendo inutile, per andare da un vertice all’altro, il passaggio per un terzo vertice.»
303 «Senza perdita di generalità? Che cosa vuol dire?»
«Ah, intendi dire che se anche non avessimo un grafo completo, potremmo sempre aggiungervi i lati mancanti ed attribuire ad essi, come peso, la lunghezza di un cammino minimo tra i vertici corrispondenti nel grafo originale?» «Sì, esattamente come abbiamo fatto con il nostro agente assicuratore. Se sostituiamo al peso di ogni lato la lunghezza di un cammino minimo tra i due vertici agli estremi, non cambia niente per quanto concerne la lunghezza del viaggio più breve attraverso tutti i vertici, ma così sappiamo in più che il collegamento migliore tra due vertici è sempre quello diretto. . . » «. . . e quindi che ci basta anche cercare un circuito di Hamilton di peso minimo, in quanto passare più volte per gli stessi vertici non può più portare dei vantaggi.» «Molto bene! Avete magari voi stessi qualche idea per una strategia risolutiva che possa apparire sensata?» «Che ne dici se procedessimo di nuovo “avidamente”?» «Esatto! A partire da un vertice iniziale, potremmo andare avanti spostandoci sempre sul più vicino vertice non ancora raggiunto.» «Questo procedimento viene chiamato euristica del vicino più prossimo. Guardiamola in azione su un nuovo grafo di esempio:» 10
20
10
12
12 11
11 13
13 10
20
10
«Non volevamo partire dal presupposto che i grafi nel problema del commesso viaggiatore fossero completi?»
Sorte di un commesso viaggiatore
«Significa che l’ipotesi fatta sul nostro grafo non limita veramente il problema originale, anche se a tutta prima lo può sembrare, visto che abbiamo richiesto una proprietà in più che non tutti i grafi hanno.»
304 Alla ricerca della via più breve
«Giusto, ma i grafi completi sono sempre così poco leggibili. Guardate come apparirebbe il grafo completo nel nostro caso: non si riconosce quasi più niente, senza pensare che ancora mancano i pesi dei lati!»
«Hai ragione.» «Per questo ho disegnato solo i lati originali. Gli altri lati potete semplicemente immaginarli voi. Essi corrispondono di nuovo ai cammini minimi tra i due vertici agli estremi, cammini realizzati lungo i lati disegnati. Il lato in diagonale, che congiunge il terzo vertice da sinistra in alto con il terzo vertice da destra in basso, ha, ad esempio, il peso 51.» 10
20
10
12
12 51
11
11 13
13 10
20
10
«Questo perché i cammini minimi lungo i lati originali del grafo hanno esattamente lunghezza 51. Non importa se si fa il giro da destra o da sinistra: la lunghezza è sempre la stessa.» «Giusto. Ora noterete sicuramente che il giro più breve di tutti i vertici corre tutto all’esterno, in quanto tutti i lati che mancano hanno almeno lunghezza 21. La lunghezza del tour ottimale è allora 130. Stiamo a vedere che razza di giro produce qui l’euristica del vicino più prossimo. Se si comincia dal vertice all’estrema sinistra, questa euristica ci guiderebbe prima lungo il lato con peso 12 e in seguito, come nel tour ottimale, lungo i lati con peso 10, 20 e 10, nella parte alta del grafo:»
305 20
10
10 12
11
11 13
13 10
20
10
«A questo punto, però, l’euristica si discosta dal tour ottimale, perché il lato verticale con peso 11 che scende verso il basso è più corto di quello con peso 12.» «Giusto. Siccome in questa euristica ci concentriamo sempre soltanto sulla migliore scelta locale, il vertice esterno a destra viene inizialmente “dimenticato”. Dopo aver scelto infatti il lato di lunghezza 11, la scelta successiva riguarda il lato con peso 10, a destra, nella parte bassa del grafo. Da lì si procede di nuovo verso sinistra, lungo i lati coi pesi 20 e 10.» 20
10
10
12
12 11
11 13
13 10
20
10
«Okay, ma adesso dobbiamo ancora visitare il vertice all’estrema destra prima di poter concludere il nostro giro.» «Sì, è il vertice che avevamo dimenticato, ma adesso quella dimenticanza viene a costarci cara. Dal punto in cui siamo arrivati, esso dista 53 unità; per di più, dobbiamo pur sempre tornare anche “a casa” e fanno così altre 64 unità. Alla fine quindi, spostandoci sempre sul vicino più prossimo, abbiamo costruito un tour di lunghezza 220.» 20
10 12
11
10 11
64 53
13 10
12
13 20
10
Sorte di un commesso viaggiatore
12
306 Alla ricerca della via più breve
«E va bene. Sicuramente però, con un procedimento un po’ più intelligente, sarebbe andata meglio.» «Dipende da cosa tu intendi con “più intelligente”. Per tutte le euristiche di semplice concezione ci sono esempi che mostrano quanto esse possano fallire l’obiettivo, discostandosene anche considerevolmente. L’errore nell’euristica del vicino più prossimo, in proporzione, può diventare addirittura grande quanto si vuole.» «Cosa intendi dire con “in proporzione”?» «Dimmi il tuo numero preferito, Jan.» «42, naturalmente.» «Allora si possono esibire grafi nei quali la soluzione fornita dall’euristica del vicino più prossimo è 42 volte più lunga della soluzione ottimale. E questo vale per ogni numero.» «Anche se dicessi un milione di miliardi. . . » «. . . ci sarebbe sempre un grafo pesato per il quale il tour trovato con l’euristica del vicino più prossimo è un milione di miliardi di volte più lungo del tour ottimale.» «Eu!» «Dal tuo esempio di tour ottenuto con l’euristica potremmo tuttavia ricavare abbastanza facilmente il tour ottimale. Per farlo non dobbiamo fare altro che inserire l’ultimo vertice nel punto in cui si troverebbe nel giro ottimale.» «Ottima proposta. Così approdiamo ad un secondo tipo di euristica. Quella del vicino più prossimo era un’euristica costruttiva. Quello che invece tu proponi rientra nelle cosiddette euristiche migliorative. Si tratta di procedimenti il cui intento è quello di rendere ancora più breve un tour già trovato, operando scambi tra i lati. Il procedimento che hai appena suggerito viene chiamato inserimento di vertici. Esso consiste nel verificare, per ogni vertice del grafo se, togliendo il vertice dal suo posto attuale nel tour ed inserendolo in un punto diverso qualsiasi, si produce un accorciamento del tour stesso. Nel percorso ottenuto con l’euristica del vicino più prossimo “cancelliamo” allora per primo il vertice marcato in rosso a destra e sostituiamo entrambi i lati che lo legavano al nostro cam-
307
20
10 12
11
10 11
64 53
13 10
12
13 20
10
«E poi proviamo a reinserire da qualche altra parte il vertice precedentemente eliminato, cercando la posizione meno penalizzante.» «Giusto. Per ciascuno dei lati verdi che restano nel tour del vicino più prossimo controlliamo che cosa succede inserendo in quel punto il passaggio per il vertice rimosso. . . » «. . . e alla fine lo piazziamo nel punto migliore. Direi che ho capito!» «Dal nostro tour del vicino più prossimo, in questo modo, si ottiene effettivamente il percorso ottimale.» 20
10 12
11
10 11
64 53
13 10
12
13 20
10
«Ma non può andare sempre così liscia, vero?» «La combinazione di veloci euristiche costruttive con buone euristiche migliorative porta spesso nella prassi a risultati soddisfacenti. Ma il più delle volte non può essere garantito alcun sufficiente livello di bontà del risultato.» «Una garanzia di bontà? E come è possibile? Se non siamo in grado di determinare la soluzione ottimale, non possiamo nemmeno sapere quanto buona sia una soluzione qualunque trovata da noi.»
Sorte di un commesso viaggiatore
mino con il collegamento diretto tra i loro rimanenti vertici, collegamento anch’esso segnato qui in rosso.»
308 Alla ricerca della via più breve
«Sarà meglio però che Vim ci risponda domani, altrimenti faremo tardi da Martina!» La serata a casa di Martina fu davvero divertente. Il nuovo gioco di Martina era perfetto: pura Pianificazione di itinerario! Se solo Martina avesse saputo. . .
Chiedere meno ` e ottenere di piu L’avvicinarsi della fine dell’anno scolastico cominciava a farsi sentire. Non c’erano ormai quasi più compiti a casa e nella maggior parte delle lezioni si respirava già un’atmosfera molto rilassata. Durante il secondo incontro per la preparazione della festa della scuola si trattò solamente di dare una mano a predisporre i locali: spostare sedie, decorare le sale e così via; Rut e Jan ebbero comunque modo di divertirsi. Jan non se la prese nemmeno per il fatto di aver perso il suo allenamento di calcio. Poiché l’indomani – giovedì – avrebbero dovuto rimanere a scuola tutto il giorno e Jan la sera era impegnato di nuovo come babysitter, fu proprio lui, per una volta, a sollecitare che si andasse subito da Vim, il quale, per di più, gli era ancora debitore di una risposta. «Allora, Vim, come funziona la faccenda della garanzia per le euristiche?» «Vediamo. Rut, tu ricordi ancora come hai potuto trovare così rapidamente il cammino più breve da Marienplatz ad Harras nell’esempio della metropolitana?» «Ma certo! Era stato un trionfo dell’intuito femminile.» «Vim avrà avuto invece una motivazione più razionale, ci scommetto.» «Cosa vorresti dire, Jan? Okay, ne aveva una: quando si tratta di distanze in linea d’aria ci si può limitare a guardare la parte di grafo che sta dentro a certe ellissi.» «Oh sì, mi avevi pur detto qualcosa di queste ellissi. Di che si trattava?»
310 Alla ricerca della via più breve
«Del fatto che, per un verso, la lunghezza di un cammino minimo tra due località non può essere inferiore alla loro distanza in linea d’aria e, per l’altro verso, essa non può nemmeno superare la lunghezza di un cammino qualsiasi già noto.» «Sì, adesso me ne ricordo. La parte di grafo che contava poteva essere racchiusa in un’ellisse. Si può fare qualcosa del genere anche per il TSP?» «C’è una quantità di modi possibili di avvicinarsi da entrambe le parti ad un tour ottimale. Con l’aiuto di euristiche costruttive si possono ottenere rapidamente alcuni percorsi da usare come base di partenza, percorsi che possono ancora essere corretti con l’aiuto delle strategie migliorative. La lunghezza di ciascuno di questi cammini costituisce naturalmente una limitazione superiore per la lunghezza di un tour ottimale.» «Con l’espressione “limitazione superiore” intendi dire che la lunghezza di un tour ottimale non può in nessun caso essere più grande di così, cioè che sta al di sotto di questo valore?» «Esattamente. Limitiamo il valore ottimale dall’alto; per questo si parla di limitazione superiore. Nel trovare una simile limitazione può anche succedere che ci imbattiamo addirittura in un percorso ottimale, senza accorgercene.» «Va bene. Le tue limitazioni dall’alto però non sono poi chissà quale arte. Per “accerchiare” la soluzione ottimale e non lasciarle scampo abbiamo bisogno anche di qualcosa dal basso.» «Oh, determinare buone limitazioni superiori è un’arte, Jan! Ma hai ragione, ci servono naturalmente anche limitazioni inferiori, se vogliamo valutare la bontà della soluzione trovata ad un certo punto.» «Qualcosa come la distanza in linea d’aria tra le località di partenza e di arrivo nel problema del cammino minimo.» «Giusto. Che succede allora, nel problema del cammino minimo, se misuriamo la distanza tra le città in linea d’aria e non ci atteniamo invece alle lunghezze delle strade nella nostra rete viaria?»
311 «Beh, allora bariamo!»
«Oh, io non trovo così male il termine “barare”. Riformulerei la cosa così: “allentiamo” un pochino le regole del gioco nel nostro problema del cammino minimo, in modo da poterlo risolvere più in fretta. Ieri sera, nel vostro gioco di società, l’avreste definito “barare”, ma in matematica lo si chiama rilassare.» «Rilassare? Ci si dovrebbe rilassare mentre il nostro avversario ci sta imbrogliando?» «La tua interpretazione non è così fuorviante. La parola allude proprio alla distensione e si riferisce allo sciogliere o al rendere meno rigide le condizioni che descrivono il problema matematico da risolvere.» «Che ne dici allora se, come limitazione inferiore, prendessimo il doppio della distanza in linea d’aria tra i due vertici del grafo più lontani tra loro? Dovendo per forza andarci, laggiù, ed anche fare ritorno, nessun tour può essere più corto di così.» «La “distanza in linea d’aria” non ha molto senso nei grafi più generali.» «È vero, i pesi non devono avere necessariamente a che fare con le distanze in linea d’aria.» «Tuttavia hai ragione: poiché da ogni vertice dobbiamo raggiungere ciascuno degli altri e tornare anche indietro, possiamo naturalmente sempre raddoppiare il peso del lato più lungo e considerare questo valore una limitazione inferiore per il tour ottimale. Osservate però il nostro problema dei fori del trapano. Qui abbiamo a che fare proprio con distanze in linea d’aria e tuttavia il doppio della distanza tra i due vertici più lontani tra loro è enormemente più corto del tour di lunghezza minima.» «Se poi si dovessero praticare ancora più buchi nella stessa piastra, sarebbe addirittura peggio.»
Chiedere meno e ottenere di più
«Ma Jan, non si tratta di barare se in questo modo possiamo trovare una limitazione inferiore!»
312 Alla ricerca della via più breve «È vero! Con l’aggiunta di altri fori, solo il cammino rosso potrebbe allungarsi.» «Possiamo comunque trovare migliori limitazioni inferiori per il TSP. Jan, Rut ti ha riferito quello che abbiamo detto degli alberi generatori?» «Sì. Erano i più piccoli sottoinsiemi connessi di lati che raggiungevano tutti i vertici di un grafo, no?» «Esattamente. Immaginate di aver già costruito un percorso che faccia il giro di tutti i vertici; per me può andare benissimo il tour trovato nell’esempio di ieri con l’euristica del vicino più prossimo. Ora togliamo da questo tour un vertice qualunque. Ho scelto qui ancora una volta il vertice all’estrema destra, con i due lati del tour che lo contengono. I lati rimanenti costituiscono un albero generatore per il resto dei vertici:» 20
10 12
11
10 11
64 53
13 10
12
13 20
10
313 «Beh, veramente è un cammino.»
«Okay, ma è un albero generatore molto speciale!» «Ci basta che sia un albero generatore. Ogni tour completo infatti, con l’eliminazione di un vertice e i suoi lati, si trasforma in un cammino di Hamilton, il quale è anche un albero generatore sul resto del grafo. Allora, piuttosto che cercare un simile cammino di Hamilton, ci mettiamo semplicemente alla ricerca di un minimo albero generatore. Questo compito possiamo sbrigarlo piuttosto in fretta con l’aiuto dell’algoritmo greedy. Dopodiché “riattacchiamo” il vertice rimosso all’albero generatore trovato, utilizzando i due lati più corti che escono da esso. Se ad un albero generatore si aggiunge un ulteriore vertice con due dei suoi lati, si ottiene un cosiddetto 1-albero. Questo “1” sta per il vertice incluso nell’albero in un secondo momento.» «Il vertice extra?» «Chiamiamolo pure così.» «In qualche modo, il nostro grafo di esempio mi ha sempre fatto pensare ad una barca e adesso arrivi tu e mi parli di un albero. Ancora imbarcazioni: a un albero, due alberi, tre alberi. . . » «È vero, il grafo assomiglia davvero a una barca a vela o a una canoa, viste dall’alto.» «Che gli uomini vedano pecorelle quando guardano le nuvole si sa, ma che i miei grafi facciano pensare a piccole barchette. . . Qui ho disegnato l’1-albero di peso minimo per la nostra “barchetta”. Il vertice extra è colorato di giallo e ho scritto un 1 al suo interno. I lati rossi sono i due lati più corti tra tutti quelli che escono da lui. I lati verdi, infine, costituiscono un minimo albero generatore per i restanti vertici.» 10
20
10
12
12 11
11
1 13
13 10
20
10
Chiedere meno e ottenere di più
«Giusto, addirittura un cammino di Hamilton, ma ogni cammino di Hamilton è anche un albero generatore.»
314 Alla ricerca della via più breve
«Ma così non abbiamo più un cammino chiuso che fa il giro di tutti i vertici! Addio tour!» «È vero. Solo raramente otteniamo in questo modo un tour; ma è proprio in questo che consiste il nostro rilassare il problema. Permettiamo un maggior numero di soluzioni, semplificando così il problema ed ottenendo una limitazione inferiore. Nel nostro esempio, la lunghezza dell’1-albero minimale è 119.» «Un maggior numero di soluzioni?» «Ogni cammino di Hamilton è anche un albero generatore per l’insieme dei suoi vertici ed ogni cammino di Hamilton chiuso, cioè ogni tour, è un 1-albero. Con la parola “tour” abbiamo sempre inteso un percorso che attraversa tutti i vertici del grafo facendo ritorno al punto di partenza. Abbiamo inoltre osservato che, senza perdita di generalità, possiamo ridurci a considerare tour che non passano due volte per lo stesso vertice; dunque “tour” è adesso un sinonimo di “circuito di Hamilton”.» «Capisco. Poiché ogni tour è un 1-albero, ma non ogni 1-albero è un tour, l’insieme degli 1-alberi è più grande e comprende al suo interno quello dei tour.» «Esatto. L’insieme degli 1-alberi contiene quello di tutti i tour del problema del commesso viaggiatore. In questo modo, un tour ottimale del TSP, in un grafo pesato, non può essere più corto di un 1-albero ottimale nello stesso grafo. Poiché tuttavia gli 1-alberi ottimali non sono necessariamente già tutti dei tour belli e pronti – come mostra anche il nostro esempio – otteniamo solamente una limitazione inferiore per la lunghezza del tour minimale.» «Raffinato! Essendo ogni tour di peso minimo anche un 1-albero, la lunghezza dell’1-albero più corto può ancora essere inferiore – ma mai superiore – a quella del tour ottimale.» «Rilassiamo dunque le regole del gioco del TSP. Così facendo, il più delle volte non otterremo più un tour, ma una limitazione inferiore per il minimo delle loro lunghezze. Nel caso in cui poi dovessimo ottenere un tour, sapremo allora subito che si tratterebbe di un tour ottimale.»
315 «Ma è davvero così semplice trovare un 1-albero minimale?»
«Strano, però. Se ogni tour è anche un 1-albero, ma naturalmente non viceversa, allora ci sono molti più 1-alberi che tour. Tuttavia è più semplice determinare un 1-albero di peso minimo che non il tour più corto.» «Sì, il numero degli 1-alberi è addirittura enormemente più grande del numero dei tour del TSP. Se con n indichiamo di nuovo il numero dei vertici del grafo ed n vale almeno 3, allora in un grafo completo ci sono 12 (n − 1)! circuiti di Hamilton e, per un vertice extra fissato, 12 (n − 2)(n − 1)n−2 1-alberi. In questa tabella ho calcolato questi numeri per i valori di n da 3 a 10:» Vertici
Tour
1-Alberi
n
1 2 (n − 1)!
1 n −2 2 (n − 2)(n − 1)
3 4 5 6 7 8 9 10
1 3 12 60 360 . 2 520 . 20 160 . 181 440
1 9 96 . 1 250 . 19 440 . 352 947 . . 7 340 032 . . 172 186 884
«Uff! Il numero dei tour cresce già estremamente in fretta, ma quello degli 1-alberi se lo lascia alle spalle e lo distacca con disinvoltura!» «Nonostante questo, è più semplice trovare un 1-albero minimale, o forse proprio per questo.» «Proprio per questo?» «Sì. Il problema del commesso viaggiatore avanza così tante pretese per la soluzione che l’algoritmo greedy fallisce. Se
Chiedere meno e ottenere di più
«Gli 1-alberi di peso minimo si trovano esattamente con la stessa rapidità con cui si determinano gli alberi generatori di peso minimo; si può fare ad esempio con l’algoritmo greedy.»
316 Alla ricerca della via più breve
ammettiamo a fianco dei tour anche tutti gli oggetti che l’algoritmo greedy può generare con una semplice regola di scelta, cioè gli 1-alberi, allora otterremo raramente un tour, ma in compenso l’algoritmo greedy funziona.» «Intendi dire che scegliendo a caso stenterò a trovare il famoso ago nel pagliaio, ma con lo stesso procedimento sicuramente troverò un ago o una pagliuzza?» «Mi piace il tuo paragone. Attraverso un allargamento dell’insieme degli oggetti cercati – da “ago” ad “ago o pagliuzza” – improvvisamente la tua strategia di ricerca funziona in modo molto efficiente.» «Prendere la pagliuzza quando invece si cercava l’ago, mi sembra tuttavia un risultato un po’ modesto.» «Non dobbiamo però cercare così a lungo.» «Che il risultato sia modesto o no dipende, nella pratica, dai tempi di calcolo e, naturalmente, dalla distanza tra le limitazioni inferiore e superiore. Una distanza sufficientemente piccola ottenuta con tempi di calcolo non troppo lunghi non è affatto un risultato modesto. Siccome la lunghezza del tour ottimale deve trovarsi compresa tra le due limitazioni, siamo in grado di dire quanto un tour “euristico” dista al massimo dalla soluzione ottimale. Nel nostro esempio, la lunghezza dell’1-albero era 119. Se non conoscessimo la lunghezza del tour ottimale, sapremmo pur sempre che il tour di 220 unità, trovato con l’euristica del vicino più prossimo, al massimo dista 101 unità dalla soluzione ottimale. Ciò significa che nel caso estremo, qualora cioè il tour ottimale ignoto misurasse proprio 119 unità, con l’euristica greedy del vicino più prossimo commetteremmo un errore pari a circa l’85 per cento.» «E va bene, ma allora, con l’euristica dello spostamento del vertice, avevamo già trovato il tour ottimale di lunghezza 130.» «Giusto, tuttavia quello era stato solo un colpo di fortuna. Nemmeno l’euristica migliorativa fornisce normalmente soluzioni ottimali. Se non avessimo costruito il grafo in modo da sapere già, in via del tutto eccezionale, quale era il tour ottimale, non avremmo potuto accorgerci di averlo già raggiunto per caso.»
317
«Questo è verissimo. L’errore più grande che si può ancora commettere sarebbe così già sceso al 9 per cento circa. Se costruiamo l’1-albero scegliendo uno dei vertici che appartengono a uno dei lati con peso 20 come vertice extra, otteniamo addirittura un 1-albero minimale di lunghezza 126, cioè una limitazione inferiore ancora migliore. L’errore del tour di 130 unità ammonterebbe così al massimo a un 3 per cento.» 20
10
10
12
12 11
11 13
13 10
1
20
10
«Beh, adesso possiamo ritenerci soddisfatti, no? Soprattutto perché sappiamo che non abbiamo proprio fatto errori.» «In altri esempi può tuttavia ancora succederci di non riuscire, con le nostre euristiche, ad arrivare veramente vicini alla soluzione ottimale. Meglio sarebbe se potessimo garantire in anticipo che non rimarremo troppo lontani dall’ottimo.»
Chiedere meno e ottenere di più
«Ma sapremmo pur sempre che il tour ottimale non sarebbe più corto della nostra limitazione inferiore di 119 unità e nemmeno più lungo del tour trovato da noi di 130 unità.»
150 per cento
«Vuoi dire che non sarà più necessario calcolare una limitazione inferiore perché già in anticipo si saprà che il procedimento non potrà sbagliare più di tanto?» «Esatto. Per molte euristiche è possibile fornire stime dell’errore commesso. Le stime generali tuttavia, il più delle volte non sono molto incoraggianti. Le migliori limitazioni per l’errore commesso in grafi completi, nei quali quello diretto è sempre il collegamento più breve possibile, sono dovute a Nicos Christofides. L’algoritmo di Christofides costruisce un tour che può scostarsi da quello ottimale al massimo del 50 per cento.» «Ma è molto peggio del nostro 3 per cento!» «Jan, la differenza è che adesso, prima di cominciare i calcoli, sappiamo che l’errore non può diventare troppo grosso. Il fatto di aver trovato casualmente con le nostre euristiche il tour ottimale è stato soltanto un colpo di fortuna!» «D’accordo. Allora raccontaci per favore come funziona questo algoritmo di Christofides.» «Per prima cosa, costruiamo nuovamente un 1-albero minimale. Esso può essere lungo, tutt’al più, come il tour ottimale stesso, non di più.» «L’avevi già detto.» «Secondariamente, facciamo quello che già avevamo fatto con il problema del postino cinese – vi ricordate? – determiniamo un matching di peso minimo tra i vertici dell’1-albero che hanno grado dispari. Guardate qua: ho colorato tutti i lati del nostro 1-albero minimale di verde ed ho cerchiato di rosso i vertici dai quali escono un numero dispari di lati verdi. I lati rossi costituiscono un matching minimale su questi quattro vertici.»
320 20
10
10
Alla ricerca della via più breve
12
12 11
11 13
13 10
1
20
10
«Perché facciamo tutto ciò?» «Per lo stesso motivo per cui l’abbiamo fatto nel problema del postino cinese. Se infatti aggiungiamo i lati del matching a quelli dell’1-albero, tutti i vertici avranno grado pari. Per il teorema di Eulero, esisterà di conseguenza un circuito di Eulero attraverso i lati di questo sottografo.» 10
20
10 12
12 11
11 13
13 10
10 20
«Adesso andiamo a ripescare proprio tutto quello che ci hai raccontato fin qui.» «Sì, potete vederla così. Non si butta via niente.» «Ma noi cerchiamo un circuito di lunghezza minima attraverso tutti i vertici del grafo e non attraverso tutti i lati. A che ci servono allora i circuiti di Eulero?» «Il circuito di Eulero così costruito non attraversa tutti i lati del grafo, ma solo quelli dell’1-albero e quelli del matching. È per così dire un tour minimale del postino cinese attraverso i lati dell’1-albero. Poiché però l’1-albero collega tutti i vertici del grafo, con il circuito di Eulero generato in questo modo si percorrono anche tutti i vertici. Così facendo, la lunghezza di questo circuito di Eulero può superare quella del tour ottimale del TSP al massimo del 50 per cento.» «Questo sarà sicuramente difficile da dimostrare, non è vero?»
321
«Sì, per questo l’1-albero minimale costituiva una limitazione inferiore per il TSP.» «Siccome il circuito di Eulero è composto proprio da questo 1-albero e dai lati del matching, dobbiamo solo dimostrare che i lati del matching minimale complessivamente non possono superare la metà della lunghezza del tour di peso minimo.» «Capisco. L’1-albero minimale può al massimo essere lungo come il tour ottimale ed il matching al massimo come la sua metà. Complessivamente dunque, il circuito di Eulero raggiunge al massimo una volta e mezzo la lunghezza del tour ottimale.» «Esatto. Il matching minimale non può poi superare il 50 per cento di un tour ottimale perché a partire da ogni tour del TSP – e dunque anche da quello minimale – possiamo generare due matching dei vertici di grado dispari dell’1-albero minimale. Ho qui cerchiato di nuovo in rosso questi vertici e poi ho diviso il tour ottimale in due parti, una verde ed una gialla. Il colore del tour cambia tra giallo e verde ogni volta che si attraversa uno dei vertici rossi. Sono proprio questi, infatti, che vogliamo “accoppiare” tra loro:» 10
20
10
12
12 11
11 13
13 10
20
10
«Ma i lati gialli non formano affatto un matching.» «No, ma ne otteniamo subito uno sostituendo entrambi i cammini gialli con i collegamenti diretti tra i loro estremi:»
150 per cento
«No, per niente! Sappiamo già che i lati dell’1-albero sono lunghi complessivamente tutt’al più come quelli del tour ottimale del TSP.»
322 10
Alla ricerca della via più breve
12
20
10
40
12
64
11
11
13 10
20
13
10
«Se il grafo ha però un numero dispari di vertici, questa ripartizione in due matching non può avvenire.» «Il numero dei vertici del grafo non gioca alcun ruolo qui. I vertici sui quali fare il matching sono infatti proprio quelli di grado dispari dell’1-albero. . . » «. . . e il numero dei vertici di grado dispari è sempre pari.» «Ah, è vero: la nostra dimostrazione per induzione. Come facciamo allora a sapere che il matching minimale è lungo al massimo quanto la metà del tour ottimale?» «Abbiamo costruito due matching: uno è quello dei lati verdi e l’altro quello dei lati gialli. Presi assieme, essi sono lunghi al massimo come il tour ottimale, perché sono stati ottenuti da esso attraverso “accorciamenti”. Se però insieme non superano il tour ottimale, allora il più corto dei due – che per noi è il verde – non può essere più lungo della sua metà.» «Ma certo! Altrimenti entrambi i matching sarebbero più lunghi di mezzo tour ed insieme supererebbero così il tour intero.» «Se poi già il più piccolo di questi due matching non può superare il 50 per cento di un tour del TSP minimale, allora naturalmente nemmeno un matching minimale può essere più lungo di così.» «È logico, altrimenti non sarebbe minimale.» «Nel nostro esempio, il matching verde è già esso stesso minimale.»
323
«Precisamente. Al massimo facciamo in questo modo un errore del 50 per cento. Nel nostro esempio l’errore è in effetti solo di poco superiore al 15 per cento, di fatto cioè molto inferiore alla garanzia.» «Non è possibile, nei punti in cui il circuito di Eulero passa più volte per lo stesso vertice, abbreviare il cammino usando i collegamenti diretti tra i vertici?» «Ottima idea, Rut! Questo è l’ultimo passo dell’algoritmo di Christofides. Essendo i collegamenti diretti tra due vertici sempre i più brevi, non abbiamo bisogno di visitare alcun vertice più di una volta. Nel nostro grafo, il circuito di Eulero che avevamo costruito può essere accorciato seguendo le due frecce rosse. . . »
10
20
10 12
12 11
11 13
13 10
10 20
«. . . e otteniamo così addirittura il tour ottimale! L’algoritmo funziona allora molto meglio di quanto non garantisca.» «Sì, qui senz’altro, ma ci sono grafi per i quali l’errore si avvicina al 50 per cento. Se volete, ve ne mostro uno. Prima però, eccovi l’algoritmo completo, per averne una visione globale:»
150 per cento
«I lati dell’1-albero sono lunghi dunque al massimo come un tour ottimale e quelli del matching al massimo la metà. Il circuito di Eulero formato dall’insieme di tutti questi lati è allora lungo complessivamente tutt’al più una volta e mezzo il tour ottimale.»
324 Alla ricerca della via più breve
Algoritmo di Christofides Input:
Grafo completo G = (V, E), con pesi sui lati tali che il collegamento diretto tra due vertici sia sempre il più breve. Output: Tour di tutti i vertici, di lunghezza non superiore a 1,5 volte quella del tour ottimale del TSP.
1o Passo: Determinare un 1-albero minimale A in G; 2o Passo: Determinare un matching ottimale M dei vertici di grado dispari in A; 3o Passo: Determinare un circuito di Eulero attraverso i lati di A ed M; 4o Passo: Se lungo un circuito di Eulero un vertice viene visitato più volte, allora sostituire i lati che entrano ed escono da esso con il collegamento diretto tra gli altri loro vertici. Ripetere questo finché è possibile.
«Questo me lo stampo subito. Ed ora vediamo il tuo esempio da 150 per cento.» «Osservate questo grafo:» 1* 1
1*
1 1 1*
1 1*
1*
1
1*
1 1 1*
1
1* 1
1*
1 1*
1
1 1*
4
«Somiglia quasi a un ponte della ferrovia. Cosa vogliono dire gli asterischi a fianco degli 1 sui lati orizzontali del grafo?» «Essi vogliono indicare che il peso di questi lati è solo di poco più grande di 1. Tanto poco quanto volete voi. Il tour ottimale gira ancora una volta all’esterno del grafo; la sua lunghezza è 2 +11 ·1∗ . Poiché 1∗ è all’incirca 1, fanno in tutto circa 13 unità; poco di più.» «Okay, e cosa succede quando applichiamo l’algoritmo di Christofides?»
325
1* 1
1 1 1*
1*
1 1
1*
1
1*
1*
1 1 1*
1
1* 1
1*
1
1
1*
1 1*
4
«E se anche scegliessimo un diverso vertice extra. . . » «. . . otterremmo comunque un 1-albero minimale lungo circa 13 unità.» «Adesso dobbiamo aggiungere il matching dei vertici di grado dispari, vero?» «Precisamente. Nel nostro 1-albero si tratta dei primi tre e dell’ultimo nella fila di sotto. Il matching minimale di questi vertici ha lunghezza 4 + 1∗ :» 1* 1
1 1*
1
1
1*
1*
1 1 1*
1 1*
1* 1
1
1* 1
1*
1 1 1*
1 1*
4
«In tutto allora, tra 1-albero e matching, fanno 16 + 2 · 1∗ unità, cioè circa 18.» «Nell’ultimo passo dell’algoritmo possiamo però cercare ancora delle scorciatoie in corrispondenza dei vertici visitati più volte.»
150 per cento
«Per prima cosa costruiamo un 1-albero minimale. Per farlo dobbiamo prima scegliere un vertice extra. Ho preso il secondo da sinistra nella fila di sopra. Questo vertice va momentaneamente estromesso dal grafo, assieme a tutti i lati che escono da esso. Per il resto del grafo determiniamo un minimo albero generatore. Poiché 1∗ è più grande di 1, scegliamo i lati di lunghezza 1∗ solo quando sono finiti quelli con peso 1. Se infine ripristiniamo il vertice extra e lo colleghiamo con i due suoi lati più corti al minimo albero generatore, otteniamo allora un 1-albero minimale di lunghezza 12 + 1∗ . L’1-albero minimale ha dunque già da solo una lunghezza di poco superiore a 13.»
326 «Giusto. Otteniamo alla fine un tour di lunghezza 12 + 4 · 1∗ :» Alla ricerca della via più breve
1* 1
1*
1
1 1
1*
1 1
1*
1*
1*
1 1
1
1*
1* 1
1*
1 1 1*
1 1*
4
«Così avevamo un tour ottimale di circa 13 unità, mentre quello di Christofides ne misura circa 16. Ma 1, 5 · 13 fa però 19,5 e non 16. Il tour di Christofides non è ancora lungo 1,5 volte quello ottimale.» «Hai ragione, ma io avevo detto che al valore del 150 per cento ci si poteva avvicinare a piacere, non che lo si raggiungesse di fatto. Immaginatevi di costruire di nuovo lo stesso grafo, stavolta però con n + 1 vertici nella riga inferiore ed n vertici in quella superiore:» 1* 1
1
1*
1
1*
1* 1
1 1 1*
1
1* 1
1*
1
1* 1
1*
1 1 1*
1 1*
n–2
«Quindi. . . » «. . . se eseguiamo l’algoritmo di Christofides, otteniamo questo tour:» 1* 1
1
1 1 1*
1*
1* 1
1 1 1*
1*
1*
1 1
1*
1 1 1*
1 1 1*
1 1*
n –2
«Adesso il rapporto è 1,5?» «Lo verifichiamo subito. Il tour ottimale, che gira tutt’attorno all’esterno, ha una lunghezza che è solo di poco maggiore di 2n + 1. Anche l’1-albero minimale è lungo all’incirca 2n + 1 unità e il matching dei vertici di grado dispari n− 1 unità. Alla fine riusciamo ancora a spuntare solo un paio di unità con le scorciatoie. In tutto, il tour di Christofides ha dunque una lunghezza di circa 3n − 2. Quanto più il numero n dei vertici diventa
327
«Ma il 150 per cento non viene mai veramente raggiunto?» «No, tuttavia ci si avvicina ad esso tanto quanto si vuole.» «Non ci sono algoritmi che garantiscono un errore più piccolo?» «No, l’algoritmo di Christofides è il migliore che sia noto finora. Solo se si impongono ulteriori condizioni sui pesi dei lati, ci sono algoritmi efficienti che forniscono in anticipo migliori garanzie di bontà del risultato.» «Bene. Così la mia domanda sulle garanzie di qualità ha avuto una risposta. Giusto in tempo, perché adesso devo proprio andare a casa: Lukas, senz’altro, mi starà già aspettando.» Dopo che Jan se ne fu andato, Rut si affrettò a preparare una torta per la festa della scuola. Non che fare la cuoca la entusiasmasse, ma le altre ragazze del cosiddetto “team organizzativo” non si erano fatte avanti per niente, quando si era trattato di assegnare questi “compiti da donne”. Siccome però il ricavato della vendita delle torte era destinato ad arricchire il patrimonio dei libri al prestito della biblioteca della scuola, il disappunto di Rut non era durato a lungo. Durante la cena si parlò delle prossime vacanze. A Rut piaceva moltissimo l’idea di andare in Francia, anche se Jan le mancava già. Mentre sua madre guardava il telegiornale, Rut sparì in camera sua e cominciò a pensare a cosa avrebbe voluto portare con sé. Veramente le sarebbe piaciuto impacchettare anche Vim, ma non avrebbe potuto certo infilare il suo computer nel bagagliaio dell’auto senza farsi notare.
150 per cento
grande, tanto più il rapporto tra i numeri 3n − 2 e 2n + 1 si avvicina al valore 1,5. Per n = 10 è circa 1,333, per n = 100 è già circa 1,483 e per n = 1000 è circa 1,498.»
Bonsai
Rut aveva rischiato di non alzarsi in tempo, perché si era dimenticata di puntare la sveglia. Per fortuna, sua madre si era invece svegliata al momento giusto. Suo padre aveva telefonato la sera prima, dicendo che sarebbe tornato sabato, verso l’ora di pranzo, così domenica sarebbero potuti partire per la Francia. In questo modo avrebbero perso un giorno, ma almeno sarebbero partiti tutti assieme. Riguardo a questo slittamento, Rut non trovò niente da ridire, visto che per lei significava rimanere un giorno in più con Jan. Sempre che lui non avesse già in programma qualcosa per sabato. A scuola, le lezioni furono ancora più rilassate dei giorni precedenti. Perfino il signor Liste era di buon umore e si era limitato a sottoporre alla classe alcuni piccoli rompicapo. Alle due cominciò la festa. Dopo le lezioni, Rut e Jan si erano trattenuti ancora per dare una mano a sbrigare gli ultimi preparativi e durante la festa dovettero rimanere un’ora ciascuno in stand diversi, secondo i turni che erano stati loro assegnati. Quando ormai il turno di Rut stava finendo, Jan venne da lei con un pallone da calcio nuovo di zecca sotto il braccio. L’aveva vinto al torneo e ne era particolarmente fiero. Rut sorrise: che eroe! Poco dopo scoppiò un forte temporale che pose fine piuttosto bruscamente ai festeggiamenti. La maggior parte delle persone fece ritorno a casa. Solo in pochi rimasero a riordinare e Jan era tra questi. Rut dovette andare subito all’allenamento di nuoto. In un primo momento aveva pensato di saltarlo, ma poi aveva cambiato idea, visto che anche la settimana precedente non ci era andata.
330 Alla ricerca della via più breve
Venerdì vennero affissi i risultati degli scrutini. Rut era soddisfatta dei suoi voti. Che non fosse ai massimi livelli in tutte le materie, lo sapeva già. Non c’era nemmeno da meravigliarsi. Nonostante da qualche tempo non si sentisse più straniera a Monaco, il sistema scolastico tedesco era pur sempre diverso da quello italiano e la nuova lingua non aveva certo contribuito a semplificare le cose. Alle dieci si concluse ufficialmente l’anno scolastico e Jan tornò velocemente a casa a mostrare la pagella ai genitori. Un attimo dopo, già pedalava verso la casa di Rut. Lei, intanto, aveva appena acceso Vim. «Cia Jan! Come è andata la vostra festa?» «Bene, almeno fino al temporale. Dopo sono fuggiti tutti.» «Di’ un po’ Vim, che si fa, nel TSP, se non si rimane soddisfatti delle limitazioni ottenute? Ieri, con il solo aiuto degli 1-alberi e delle euristiche, nemmeno con grafi piccoli siamo riusciti a dire se i tour trovati erano ottimali. D’altra parte tu ci hai mostrato un tour ottimale per il problema relativamente grosso dei buchi del trapano. In quel caso sono stati usati altri procedimenti?» «Beh, se con procedimenti efficienti non riusciamo più ad andare avanti, non resta che inoltrarsi sul terreno rischioso degli algoritmi esplosivi, sperando di trovare un tour ottimale – o quantomeno una soluzione soddisfacente – prima che gli Eu dell’esplosione combinatoria ci fischino nelle orecchie.» «Non capisco.» «Aiutiamoci con questo esempio:» 1 4 7
5 3
5 5
3 5
4 4
4
3
2
8
331 «Il grafo somiglia alla casa di Nikolaus.» Bonsai
«Okay, chiamiamolo semplicemente il grafo di Nikolaus. Il nostro grafo di Nikolaus è un grafo completo con 5 vertici, che sono stati numerati da 1 a 5.» «Ah, pensavo già che fossero i valori delle distanze o i gradi dei vertici, ma sarebbero stati completamente sballati.» «I numeri vicino ai lati sono di nuovo i pesi. Come sappiamo dalla tabella di ieri, in questo grafo ci sono 12 (5 − 1)! tour, cioè 12 tour in tutto. Vogliamo adesso enumerare sistematicamente questi 12 tour. Per farlo, ci sono molti modi diversi. Vediamone uno. Cominciamo pure dal vertice 1: in un tour non ha importanza da quale vertice si parte. Come si potrebbe andare avanti?» «Procedendo verso il vertice 2, oppure il 3, il 4 o il 5.» «Giusto. Rappresentiamo questa situazione così:» 1
2
3
4
5
«Dal vertice 2 potremmo di nuovo andare avanti verso i vertici 3, 4 o 5, ma non tornare sul vertice 1.» «E si va proprio avanti così, una volta che dal vertice 1 ci si sia mossi verso uno degli altri vertici. Se aggiungiamo le diramazioni successive al nostro disegno, pian piano si sviluppa un albero:» 1
2
3
4
3
5
2
4
4
5
2
3
5
5
2
3
«E a cosa dovrebbe servirci tutto ciò?» «Ora, rimanendo ad esempio a sinistra nel nostro albero, possiamo di nuovo distinguere se vogliamo procedere verso il vertice 4 o verso il 5, dopodiché non rimane che visitare il vertice
4
332 Alla ricerca della via più breve
rimasto tra questi due, cosa che facciamo prima di tornare al vertice 1. Se distinguiamo i casi che si presentano anche negli altri rami, otteniamo questo albero, che contiene ora tutti i possibili tour:»
«I tour nel grafo di Nikolaus corrispondono allora ai cammini che partono dal vertice 1 e arrivano nell’ultimo strato del nostro albero.» «Sì, un cammino dalla radice 1 ad una delle foglie comprende esattamente tutti i lati di un tour; solo l’ultimo lato, quello che fa ritorno alla radice, non è stato disegnato.» «La radice in alto e le foglie in basso? Una pianta appesa?» «Se ti piace di più, puoi disegnare l’albero anche al contrario; non cambia niente.» «E va bene. Distinguendo i vari casi, hai fatto una lista di tutti i tour; però qua ne vedo 24 e non 12.» «Ma perché li abbiamo tutti due volte! Ad esempio il primo tour a sinistra – 1, 2, 3, 4, 5 e di nuovo 1 – è uguale all’ultimo a destra – 1, 5, 4, 3, 2, e ritorno a 1 –; solo che è percorso al contrario.» «Hai davvero una vista acuta, adesso lo riconosco anch’io.» «Sviluppando la nostra lista, non abbiamo ad esempio prestato attenzione al fatto che ogni tour che contiene il lato da 1 a 5 deve contenere anche un ulteriore lato da 1 a 2, o da 1 a 3, o ancora da 1 a 4. L’intero ramo a destra, con il 5 in alto, è allora solo una ripetizione di tour che abbiamo già annotato.
333
1
3
2
3
4
2
5
4
4
5
2
3
4
5
3
5
3
4
4
5
2
2
3
2
5
4
5
3
4
3
5
4
5
4
5
5
«Fammi indovinare: dall’inglese?» «Sì, “to branch” significa “ramificare”, “ramificarsi”.» «Non vorrai certo scorrere in fila tutti i tour della lista per cercare il più breve, vero? Con grafi più grossi non ce la farebbero nemmeno i migliori computer del mondo! Ce l’hai spiegato tu stesso. E il modo in cui i tour vengono elencati non potrà certo fare differenza.» «Non è detto, perché adesso entrano in gioco di nuovo le nostre limitazioni. Immagina, per far prima, di aver già trovato un tour con l’euristica del vicino più prossimo, un tour di lunghezza 21:» 1 4 7
5 3
5 5
3 5
4 4
4
3
2
8
Bonsai
Se si cancellano tutti i tour doppi, si ottiene un albero più piccolo con solo 12 foglie. A proposito, questo albero viene detto anche branching.»
334 Alla ricerca della via più breve
«A che scopo? Anche questo tour deve comparire nel nostro branching e dunque prima o poi lo raggiungeremmo ugualmente.» «Staremo a vedere, o meglio: “schaun mer mal”, come direbbe il Kaiser Franz Beckenbauer. Per prima cosa, determiniamo di nuovo una limitazione inferiore, ad esempio con l’aiuto di un 1-albero minimale. Con saggia previdenza, avevo già colorato il vertice extra:»
1 4 7
5 3
5 5
3 5
4 4
8
4
3
2
«Uff, ancora preprocessing!» «Ma ne vale la pena, Jan! Questo 1-albero minimale ha complessivamente lunghezza 19. Se avesse avuto lunghezza 21, avremmo subito saputo che il nostro tour del vicino più prossimo sarebbe stato il tour ottimale ed avremmo già finito.» «Certo. Se la limitazione inferiore coincide con quella superiore, allora abbiamo già trovato il valore ottimale, visto che quest’ultimo è bloccato tra i due. Questo caso però non deve capitare troppo spesso.» «Sono d’accordo. Per questo cominciamo ora con il nostro branching. Se esaminiamo per prima cosa tutti i tour che contengono il lato che va dal vertice 1 al vertice 2, dobbiamo prendere in considerazione solo il ramo di sinistra del nostro branching:»
335 1
3
4
5
2
Bonsai
3
2
4
4
5
2
3
4
5
3
5
3
4
4
5
2
2
3
2
5
4
5
3
4
3
5
4
5
4
5
5
«Okay. Sono i tour che contengono “di serie” il lato da 1 a 2.» «Per tutti questi tour possiamo di nuovo trovare un 1-albero minimale, nel quale però stavolta il lato da 1 a 2 è fissato. Otteniamo il valore 22:» 1 4 7
5 3
5 5
3
4 4
8
5 4
3
2
«Ma è più lungo del tour del vicino più prossimo!» «È vero. Poiché l’1-albero minimale costituisce una limitazione inferiore per la lunghezza di tutti i tour in questo ramo, sappiamo che ogni tour che contiene il lato da 1 a 2 deve essere lungo almeno 22 unità. Ma conosciamo già un tour di lunghezza 21 e dunque non dobbiamo più perder tempo a cercare un tour ottimale in questo ramo dell’albero.» «Significa che possiamo cancellare tutto quello che sta sotto il vertice 2 nella parte sinistra del tuo branching? Ma è magnifico! Il grafo diventa così molto più piccolo.»
336 Alla ricerca della via più breve
«Esattamente. Se ora si fa la stessa cosa in ciascuno dei rami del branching, si ottiene qualcosa di simile a questo:»
1
19
3
2 22
4
19
21
STOP
STOP
2
4
5
20
19
19
STOP
4 19
5
2 21
STOP
20 STOP
5 20
«I piccoli grafi di Nikolaus sono proprio carini. Piacerebbero certo a Lukas. Cosa vogliono dire?» «Ognuno di essi è un 1-albero minimale. In alto, vicino al vertice 1, non abbiamo ancora imposto condizioni al nostro tour. Per questo vi è riprodotto l’1-albero ottimale del grafo di Nikolaus senza alcuna restrizione. Successivamente ci siamo spostati nel ramo di sinistra del branching, constatando che l’1albero ottimale con obbligo di contenere il lato da 1 a 2 ha lunghezza 22. È questo l’1-albero che ho disegnato vicino al vertice 2.» «Si tratta dunque sempre di 1-alberi?» «Sì, 1-alberi minimali che soddisfano tutte le condizioni corrispondenti al ramo dell’albero in cui si trovano.» «E poiché l’1-albero a sinistra è già più lungo del tour del vicino più prossimo, possiamo fermarci direttamente qui.»
337 «Per questo hai messo uno “STOP”!»
«E quindi è migliore del tour del vicino più prossimo.» «Giusto. Adesso sappiamo che il tour più corto è lungo al massimo 20 unità. Perciò nel resto del branching possiamo fermarci anche quando troviamo 1-alberi minimali di peso superiore a 20 unità.» «Come mostrano tutti gli “STOP” nel resto del branching, il tour di lunghezza 20 è quello ottimale. Abbiamo sbrigato tutto piuttosto alla svelta.» «Tuttavia può anche andare peggio; alla fine il TSP è pur sempre un problema difficile in NP. Dipende in modo cruciale dalle limitazioni inferiore e superiore. Solo se esse sono buone è possibile potare sufficientemente il branching. Questo procedimento viene chiamato branch-and-bound. Per prima cosa si escogita una sensata regola per generare il “branching” e poi si cerca di sfoltire il più possibile l’albero ottenuto con buoni “bounds”, per ridurre al massimo i calcoli finali. In tutto ciò si possono utilizzare anche regole di enumerazione completamente diverse, per generare le ramificazioni.» «Altre regole? Ma la nostra non era per niente male.» «Nella prassi si utilizzano il più delle volte strategie di branching nelle quali viene deciso, in corso di esecuzione dell’algoritmo, come operare le ramificazioni successive. Se si usano come limitazioni inferiori gli 1-alberi minimali, è opportuno scegliere come punto di ramificazione un vertice dell’1-albero di grado maggiore o uguale a 3.»
Bonsai
«Esatto. Qui non abbiamo bisogno di cercare oltre. Possiamo saltare direttamente al prossimo ramo. Quest’ultimo raccoglie tutti i tour che contengono il lato da 1 a 3, ma non quello da 1 a 2. Lungo il suo sviluppo a sinistra, tuttavia, si ottiene fino al penultimo vertice l’1-albero di lunghezza 19, anche sotto ulteriori prescrizioni, come ad esempio quella di contenere il lato da 3 a 2. Per questo non possiamo mai effettuare la “potatura” del ramo e dobbiamo arrivare fino in fondo. Il cammino completo corrisponde al tour 1, 3, 2, 4, 5 e ritorno in 1, e questo cammino ha lunghezza 20.»
338 Alla ricerca della via più breve
«Intendi dire che l’algoritmo dà prima un’occhiata a come l’1albero minimale appare e solo dopo decide come scegliere le diramazioni?» «Precisamente. In un tour non può certo esserci un vertice di grado 3 o più. L’idea della regola di branching è che nessun ramo contenga più l’1-albero minimale trovato prima, a meno che questo non sia già un tour. Allo stesso tempo, naturalmente, nessun tour deve andare perduto. Così si può sperare di trovare sempre migliori limitazioni inferiori. Ma forse è meglio vedere come funziona questo procedimento nel caso del nostro esempio. Ecco qua di nuovo l’1-albero minimale del grafo di Nikolaus. Solo il vertice 3 ha grado 3; è con lui che determineremo la nostra ramificazione. Il resto del grafo è perciò lasciato in secondo piano, con una colorazione più tenue.» 1 4 7
5 3
5 5 4 4
3
8
5 4
3
2
«Adesso vogliamo creare le ramificazioni in modo che questo 1-albero non possa più presentarsi?» «Nel vertice 3 sfociano i lati provenienti dai vertici 1, 2 e 5. In ogni tour solo due di questi lati possono attraversare questo vertice. Possiamo allora creare diramazioni distinguendo ad esempio tre casi. Primo caso: il lato da 1 a 3 non è contenuto. Secondo caso: questo lato fa parte del tour, ma quello da 5 a 3 no. Terzo caso: sia il lato da 1 a 3 che quello da 5 a 3 sono contenuti nel tour. Nell’ultimo caso, naturalmente, non può più esserci un ulteriore lato che esce dal vertice 3. Se disegniamo in verde i lati che sono prescritti obbligatoriamente ed in rosso quelli che non possono più far parte del tour, otteniamo allora questa situazione:»
339 Bonsai
19
«Ah, l’1-albero minimale non può più rientrare in nessuna delle tre diramazioni. Uno dei tre lati che nell’1-albero escono dal vertice 3 è sempre vietato. Ma sono davvero possibili ancora tutti i tour?» «Tutti, dal primo all’ultimo! Sceglietene uno ed io vi mostrerò in quale ramo si trova.» «Che ne dici di quello che percorre 1, 3, 2, 4, 5 e poi ritorna in 1?» «Questo tour contiene il lato da 1 a 3, ma non quello da 5 a 3 e si trova allora nel ramo centrale.» «E 1, 2, 3, 4, 5 con ritorno in 1?» «Qui manca il lato da 1 a 3. Il tour appartiene alla prima diramazione.» «Okay. Hai vinto. E come si va avanti?» «Adesso determiniamo gli 1-alberi minimali in ognuna delle tre diramazioni. . . »
19
21
20 STOP
19 STOP
«. . . i quali necessariamente si distinguono tutti dal nostro vecchio 1-albero minimale.»
340 Alla ricerca della via più breve
«Giusto. Abbiamo scelto la nostra strategia di branching proprio con questo accorgimento in più. Nel ramo di sinistra si ottiene ora un 1-albero minimale di lunghezza 21 che è anche un tour. Abbiamo allora trovato un tour ottimale per questa diramazione, cioè sotto la condizione aggiuntiva che il lato da 1 a 3 sia vietato.» «Perché?» «Siccome il tour in questo ramo è un 1-albero minimale, la sua lunghezza rappresenta anche una limitazione inferiore. . . » «. . . e poiché ogni tour costituisce automaticamente anche una limitazione superiore, le due limitazioni, dall’alto e dal basso, coincidono. . . » «. . . e per questo il tour, almeno in questo ramo, è ottimale. Ho capito!» «Possiamo allora fermarci qui e passare al prossimo ramo. Anche qui si ottiene un tour, stavolta di lunghezza 20 e anche in questo caso si può smettere subito. Ci rimane solo il ramo di destra, nel quale purtroppo si ottiene di nuovo un 1-albero minimale di lunghezza 19, ma diverso da prima!» «Allora dobbiamo di nuovo ramificare.» «Sì, stavolta è il vertice 5 ad avere grado 3. Per questo l’ho portato in primo piano nel disegno:» 1 4 7
5 3
5 5
3
8
5
4
4 4
3
2
«Com’è variopinto! Se ho capito bene, l’1-albero è formato dai due lati verdi e dai tre lati blu. I lati verdi devono per forza far parte di ogni tour in questa ramificazione del branching.»
341
«Ma sicuro! In questo modo escludiamo nuovamente l’1-albero già trovato dal resto del branching, senza però perdere alcun tour di questa diramazione.» «Possiamo allora creare un’ulteriore ramificazione distinguendo se il lato da 4 a 5 è contenuto oppure no. Se è contenuto, escludiamo ogni altro lato uscente dal vertice 5, tranne quello da 3 a 5. Il resto del branching apparirebbe allora così:»
19
21
20 STOP
19 STOP
20
22 STOP
STOP
«Ah, capisco. In entrambi i rami si ottengono solamente 1-alberi minimali di lunghezza maggiore o uguale a quella del miglior tour da noi trovato e per questo possiamo interrompere la ricerca in ciascuno dei casi. Il tour trovato è ottimale.» «Con gli 1-alberi e l’euristica del vicino più prossimo si ottengono sempre limitazioni sufficientemente buone?» «No. Per i problemi veramente grandi bisogna sviluppare metodi notevolmente migliori. Si possono sperimentare euristiche diverse su uno stesso problema per ottenere una buona soluzione di partenza, non limitandosi naturalmente ad usare buone euristiche costruttive, ma anche buone euristiche migliorative. Le limitazioni inferiori rimangono comunque della stessa fondamentale importanza. La classe degli 1-alberi è in
Bonsai
«Esattamente. Siccome il lato da 3 a 5 è già parte integrante del tour, dobbiamo solo badare che i due lati blu da 1 a 5 e da 4 a 5 non vengano scelti contemporaneamente.»
342 Alla ricerca della via più breve
generale un po’ troppo grande e si cerca perciò, con uno sforzo in più, di generare limitazioni migliori. Questo porta alla Combinatoria poliedrale.» «Combinatoria poliedrale? Che nome strambo! Mmm, ma che buon profumino si sente arrivare!» «È vero. Credo che il pranzo sia pronto. Vogliamo scendere di sotto?» «Sì, diamo una mano ad apparecchiare.» «Dopo pranzo però ci racconti qualcosa di questa Combinatoria poliedrale? Sembra tanto una faccenda da eruditi!»
Nient’affatto platonico Quel profumo delizioso veniva proprio dalla cucina e più precisamente dal forno. La madre di Rut aveva preparato uno sformato con una grande quantità di formaggio gratinato, secondo una ricetta della vicina. Jan adorava il formaggio e trovò lo sformato irresistibile. La madre di Rut se ne rallegrò, perché non conosceva affatto i gusti di Jan. Rut era di nuovo felice che la mamma e Jan si capissero così bene. Dopo pranzo, i tre si trattennero a tavola ancora un po’ e parlarono dell’anno scolastico trascorso e delle vacanze estive. Rut si chiese se fosse ancora possibile fare una piccola uscita con Jan il giorno prima della partenza: l’indomani sarebbe tornato suo padre e lei stessa doveva ancora fare la valigia. Sua madre la incoraggiò in questo senso e le suggerì di radunare le sue cose quella sera stessa; inoltre suo padre, arrivato a casa, si sarebbe comunque buttato, sfinito, sul letto, per rimanerci senz’altro un bel po’. Così programmarono un’escursione in bicicletta allo Starnberger See: passeggiate, bagni, magari anche un giro in barca. Rut, infatti, trovava particolarmente romantica l’idea che Jan la portasse in barca sul lago. «Quando devi cominciare a preparare la valigia? Ti posso aiutare o ti disturbo?» «Ma c’è ancora tempo, Jan! Ne avanza anche per la Combinatoria poliedrale.» «Allora riprendiamo subito!» «Ciao Vim, siamo di nuovo qua.» «Bene. Avete fatto un buon pranzo?»
344 «Fantastico! La madre di Rut cucina in un modo straordinario.» Alla ricerca della via più breve
«Jan ed io domani facciamo un’escursione allo Starnberger See e poi io andrò in vacanza per tre settimane. Purtroppo non ci rimane più molto tempo per il commesso viaggiatore! Ma questa storia della Combinatoria poliedrale ce la devi raccontare a tutti i costi.» «Ricordatevi che la questione dell’esistenza di un tour attraverso tutti i vertici di un grafo, con ritorno al punto di partenza, è stata posta per la prima volta da Hamilton per i vertici di un dodecaedro. Nella Combinatoria poliedrale oggetti geometrici analoghi ci aiuteranno ora a determinare limitazioni inferiori per la lunghezza dei circuiti di Hamilton di peso minimo.» «In che modo?» «Non è semplicissimo da spiegare, ma proverò a farlo come meglio posso. Osserviamo il grafo completo con tre vertici. Ho indicato i tre lati con a, b e c:»
a
b c
«Come grafo è piuttosto noioso!» «È vero. Tuttavia con esso posso illustrare meglio il principio. Assegniamo infatti ad ogni sottoinsieme di lati del grafo una lista di numeri contenente solo le cifre 0 e 1. Date un’occhiata a questo schema:» (0,0,0)
a
(1,0,0)
b
a
(0,1,0)
b
a
(0,0,1)
b
a
b
c
c
c
c
(1,1,0)
(1,0,1)
(0,1,1)
(1,1,1)
a
b c
a
b c
a
b c
a
b c
345 «Carino, e cosa ci dice questo schema?»
«Allora (0,1,0) è esattamente il sottoinsieme che contiene solo il lato b.» «Precisamente. Adesso possiamo considerare queste liste di numeri come coordinate di punti in uno spazio tridimensionale. Allora (1,0,1) è il punto che nel sistema di coordinate si trova, a partire dall’origine, spostandosi di un’unità in avanti, zero unità a destra ed una unità in alto. Invece (0,1,0) sarebbe il punto che sta 0 unità in avanti, una unità a destra e 0 unità in alto rispetto all’origine:» 1 (1,0,1)
(0,1,0) 1 1
«Ah, ecco! adesso sì che ci avviciniamo di più agli oggetti geometrici.» «Qui ho disegnato tutti e otto i punti nello spazio. Riuscite a vedere cosa si ottiene?»
Nient’affatto platonico
«Esso mostra tutti gli otto possibili sottoinsiemi dei lati del grafo, a partire da quello che non ne contiene alcuno, proseguendo con i tre aventi un solo lato, poi con quelli aventi due lati e concludendo con il grafo completo. A ciascuno di questi grafi è abbinata una lista di numeri. Ciò avviene in questo modo: il primo numero della lista si riferisce sempre al lato a, il secondo al lato b ed il terzo numero al lato c. Un 1 nella lista significa che il lato corrispondente è presente, uno 0 significa invece che il lato non è presente. La lista (1,0,1) ci dice allora che i lati a e c appartengono a questo sottoinsieme, mentre il lato b no.»
346 Alla ricerca della via più breve
«Certo! Diventa un cubo.» «Esatto. Se si collegano gli otto vertici nel modo giusto, si ottiene un cubo:» (0,0,1) (1,0,1)
(0,1,1) (1,1,1)
(0,0,0) (1,0,0)
(0,1,0) (1,1,0)
«Ah, era questo ciò che intendevi quando dicevi che dai grafi si ottenevano oggetti geometrici. Abbiamo ottenuto perfino un solido platonico!» «Giusto. Tuttavia, a partire da grafi con 4 lati, si ottiene già un “ipercubo” quadridimensionale e, con n lati, un ipercubo, n-dimensionale.» «Quadridimensionale? n-dimensionale? Ipercubo? Ma roba del genere che aspetto dovrebbe avere? Nessun uomo può immaginarselo!» «Il prefisso “iper” si usa spesso per designare i corrispettivi, in spazi a più di tre dimensioni, di oggetti tridimensionali noti. Con la forza dell’immaginazione, tuttavia, qui si va poco avanti. Spesso si può però lavorare in modo analogo a come si farebbe in tre dimensioni. Con gli ipercubi di ogni dimensione i matematici si trovano perfettamente a loro agio.»
347 «“Ipercubo” suona tuttavia misterioso e complicato.»
«. . . perché con tre lati nel grafo, il cubo perlomeno rientra nel nostro spazio visivo tridimensionale. Con 100 lati otterremmo un ipercubo 100-dimensionale. Questo è un oggetto un po’ meno “maneggevole”.» «Spazi 100-dimensionali? Davvero “spaziosi”!» «Purtroppo non ci interessa l’ipercubo in sé, ma solo la parte dei suoi vertici che corrisponde alle liste che descrivono un tour attraverso tutti i vertici. Nel nostro grafo con 3 vertici si tratterebbe qui solo della lista (1,1,1). L’oggetto geometrico corrispondente sarebbe quindi un unico punto. A partire da un grafo completo con 4 vertici, si origina comunque già un triangolo nello spazio a 6 dimensioni, in quanto le tre sequenze (1,1,1,1,0,0), (1,0,1,0,1,1) e (0,1,0,1,1,1) descrivono tutti i tour del grafo, una volta che si siano indicati i lati come segue:» a e
f
d
b c
«Ah, 3 tour corrispondono a 3 sequenze e queste di nuovo corrispondono a 3 punti. Tre punti formano sempre un triangolo, anche se sono sospesi nello spazio 6-dimensionale?» «Tranne nel caso in cui tutti e tre appartengano alla stessa retta. Tuttavia la cosa diventa molto presto più complicata. I 12 tour nel grafo completo con 5 nodi costituiscono già i vertici di un oggetto 5-dimensionale in uno spazio 10-dimensionale.» «Oh cribbio! E qui si dovrebbero trovare migliori limitazioni inferiori?» «Sì, il problema di “trovare un tour minimale” si traduce in quello di “trovare uno spigolo minimale in un poliedro”.» «Questa è allora l’origine dell’aggettivo “poliedrale” in “Combinatoria poliedrale”; ma cos’è poi un poliedro?»
Nient’affatto platonico
«Adesso capisco anche perché hai cominciato con il noioso grafo di tre vertici.»
348 Alla ricerca della via più breve
«Si tratta di corpi che hanno facce piatte e sono privi di buchi o rientranze.» «Come i solidi platonici?» «Sì, ma non devono essere necessariamente così regolari. Inoltre essi esistono in qualunque dimensione. Questi che vedete qui sono due possibili poliedri contenuti nel cubo tridimensionale:» (0,0,1)
(0,0,1)
(1,0,1)
(1,1,1)
(0,0,0) (1,0,0)
(0,0,0)
(0,1,0)
(0,1,0)
(1,0,0)
«Qualcosa non quadra. Noi sappiamo che nel problema del commesso viaggiatore possono esistere una grandissima quantità di tour.» «Ammontano a 12 (n − 1)! nel grafo completo con n vertici.» «Dunque non possiamo provare tutti i tour uno per uno, perché ce ne sono davvero troppi.» «Giusto. L’esplosione combinatoria non lo permette.» «Se non riusciamo nemmeno a elencare tutti i tour, come puoi seriamente proporre adesso di usare oggetti geometrici, i poliedri, per risolvere il TSP, se i loro vertici corrispondono proprio a tutti questi tour? I poliedri sono almeno altrettanto complicati.» «È vero.» «È vero? Non hai nient’altro da aggiungere?» «Eccome, molto ancora! Dunque, il problema del commesso viaggiatore è NP-hard e non ci sono trucchi o astuzie per raggirarlo. Ricordatevi che un algoritmo efficiente per un problema difficile nella classe NP darebbe vita, automaticamente, ad algoritmi efficienti per tutti gli altri problemi di NP.»
349
«Al contrario! La Combinatoria poliedrale è molto efficace. I migliori algoritmi a disposizione per il problema del commesso viaggiatore e molti altri problemi difficili si basano su queste impostazioni. Non c’è però garanzia di sfuggire sempre all’esplosione combinatoria.» «Come con le euristiche: il metodo spesso funziona molto bene, ma non sempre.» «Tutti quei vertici del poliedro sono però ancora là!» «Giusto. Per questo abbiamo bisogno di un metodo più “parsimonioso” per indicare i poliedri.» «Non capisco. I vertici sono comunque così tanti!» «Osservate il cubo. Esso ha 8 vertici, ma solo 6 facce; il dodecaedro ha 20 vertici e 12 facce.» «Vuoi dire che ci sono un paio di facce in meno rispetto ai vertici? Non vedo comunque come il cubo possa essere descritto in modo più parsimonioso con l’aiuto delle facce. Si tratta pur sempre di sei quadrati con 4 vertici ciascuno. Se li si indica tutti singolarmente, la cosa diventa ancora più dispendiosa.» «Immaginatevi una grossa forma di formaggio, un formaggio senza buchi. . . »
«Formaggio? Lo trovo delizioso.» «. . . e immaginate di volerne ricavare un cubo, facendo dei tagli con un grosso coltello. Di quanti tagli avete bisogno?» «Beh, 6 tagli naturalmente!» «Esatto, perché né sopra e né sotto la forma è veramente piatta. Dunque si deve tagliare qualcosa per ogni faccia.»
Nient’affatto platonico
«Dunque tutto il lavoro fatto finora non ci porta da nessuna parte.»
350 Alla ricerca della via più breve
«Per originare un cubo in questo modo non abbiamo bisogno dei vertici. Nemmeno il loro numero gioca qualche ruolo in tutto ciò. È importante solo il numero dei tagli necessari e se quest’ultimo non diventa troppo grande, va tutto bene.» «Ma 8 vertici o 6 facce non fanno una grossa differenza.» «No, nel caso del cubo tridimensionale non cambia sicuramente molto. Con l’ipercubo 100-dimensionale però è un po’ diverso: ci sono infatti . . . . . . . . . . 2100 = 1 267 650 600 228 229 401 496 703 205 376 vertici.» «Puah, 31 cifre! Questo numero non se lo può immaginare nessuno! E quante sono invece le facce? Non potranno essere molto meno di così, no?» «200.» «Solo 200? Non può essere!» «E invece sì! Potremmo ricavare il cubo 100-dimensionale con 200 tagli a partire da un formaggio 100-dimensionale.» «A me il formaggio piace più di ogni altra cosa, ma sarà ancora buono quello 100-dimensionale?» «Forse sì, sempre che tu abbia anche uno stomaco 100-dimensionale. . . » «A partire da un grosso formaggio è possibile “scolpire” tutti i possibili poliedri con tagli diritti. Inoltre in un simile poliedrosezione si può determinare uno spigolo ottimale in modo efficiente.» «Ma questo è pazzesco. Abbiamo un piccolo, simpatico grafo e gli abbiniamo un mostruoso pezzo di formaggio avente
351
«Funziona proprio così.» «I poliedri hanno sempre meno facce che vertici?» «No, vi ricordate ancora l’ottaedro?»
«Sì, non era uno dei solidi platonici?» «Esattamente. Ne esiste anche un esemplare 100-dimensionale con solo 200 vertici ma 2100 facce.» «Ma allora il problema del commesso viaggiatore è solo una questione di fortuna.» «Fortuna? Cosa intendi dire?» «Beh, se questa Combinatoria poliedrale con il TSP funziona, allora il “poliedro del commesso viaggiatore” deve avere certamente solo poche facce.» «Osservate questa tabella. Essa mostra la dimensione dello spazio in cui il poliedro del commesso viaggiatore “abita”, il numero dei suoi vertici e quello delle sue facce. A proposito, quello rosso è solo il numero delle facce note del poliedro. Può darsi che ce ne siano ancora di più.»
Nient’affatto platonico
un numero folle di dimensioni. Poi determiniamo un tour ottimale del grafo andando alla ricerca di uno spigolo ottimale in questo pezzo di formaggio?»
352 Poliedri del Commesso Viaggiatore Alla ricerca della via più breve
Nodi 6 7 8 9 10
Dimensione 15 21 28 36 45
Vertici
Facce
60 360 . 2 520 . 20 160 . 181 440
100 3437 . 194 187 . . 42 104 442 . . . 51 043 900 866
«Qui c’è qualcosa che non va! Il numero delle facce è molto più grande di quello dei vertici. Sicuramente avrai scambiato tra loro le due colonne.» «No, è assolutamente corretto così!» «Ma non hai appena detto che il poliedro del commesso viaggiatore può essere utile proprio perché non ha troppe facce e dunque può essere intagliato facilmente nel formaggio?» «No, questo l’hai supposto tu. Purtroppo non è così.» «Perché allora tutta quella storia con il cubo e il formaggio, se comunque non funziona lo stesso?» «Con il formaggio volevo mostrarvi che un poliedro può avere un numero pazzesco di vertici e tuttavia continuare a non essere difficile da “maneggiare”.» «Carino, ma questo con il problema del commesso viaggiatore non ha niente a che vedere.» «E invece sì. Il poliedro del commesso viaggiatore ci è di aiuto. Può succedere, è vero, che non troviamo nessuno spigolo ottimale perché il poliedro ha troppe facce per farlo, ma per trovare buone limitazioni inferiori non servono proprio tutte le facce.» «Vuoi dire che tralasciamo un paio di tagli del formaggio?» «Precisamente.» «Ma così il pezzo di formaggio diventa ancora più grosso!» «Questo è proprio il punto saliente. Se riusciamo, con pochi tagli soltanto, ad ottenere un pezzo di formaggio che “nei
353
«Le buone limitazioni si possono di nuovo utilizzare nei procedimenti di branch-and-bound?» «Sì. Con metodi simili è già possibile al giorno d’oggi risolvere in modo esatto problemi del commesso viaggiatore molto grandi e la ricerca fa continuamente ulteriori passi avanti.» «Dunque davvero la matematica non è facile!» «No, spesso è addirittura piuttosto difficile. Del resto, la vittoria in una staffetta di nuoto è tanto più bella e importante quanto più gli avversari sono bravi.» «Anche nel calcio è così!» «A proposito di calcio, ti volevo mostrare ancora una cosa. Guarda cosa c’era in rete:» «È quasi bello come quello che ho vinto io ieri.» «A me piace di più così:»
«No, com’è spiattellato! Vim, sei anche tu sicuramente un fan del calcio, vero?» «Negli ultimi tempi gioco piuttosto di rado, ma, se vuoi, ti cerco in Internet qualcosa sulla tua squadra preferita.» «Non serve, Vim. Jan sa già tutto a memoria sul suo FC Bayern München.»
Nient’affatto platonico
pressi” di un vertice ottimale “assomigli” sufficientemente al poliedro del commesso viaggiatore, allora otteniamo una buona limitazione inferiore. Se invece i nostri tagli sono troppo grossolani, allora ciò, naturalmente, non accadrà.»
Il successo del commesso viaggiatore «Raccontaci piuttosto chi ha avuto per primo l’idea di risolvere il problema del commesso viaggiatore con l’aiuto dei tagli nel formaggio. Sarà stato sicuramente uno svizzero.» «Alla fine degli anni quaranta il problema del commesso viaggiatore diventò popolare e a questa fama contribuì sicuramente anche il nome simpatico che porta. Più decisiva fu però la sua stretta parentela con problemi quali quello dell’assegnamento o quello del trasporto. Per questi ultimi, infatti, in quel periodo furono ottenuti molti risultati, cosa che invece non avvenne per il TSP, che doveva essere chiaramente un problema più difficile.» «Quanto era vero!» «L’attacco massiccio al TSP segnò l’inizio di una intera branca della matematica, l’Ottimizzazione combinatoria. George Dantzig, Ray Fulkerson e Selmer Johnson risolsero nel 1954 un problema del commesso viaggiatore con 49 città. Sul sito www.math.princeton.edu/tsp/history.html c’è un disegno di questo tour:»
356 «Un tour attraverso l’America?» Alla ricerca della via più breve
«Sì, più precisamente attraverso le 48 capitali degli allora 48 Stati confederati degli USA, più Washington. Indovinate un po’ che metodo hanno messo a punto per risolvere questo problema.» «Non ne ho la più pallida idea. Qualcosa di cui ci hai già parlato, suppongo.» «Sì. Hanno usato “tagli nel formaggio” per ottenere limitazioni inferiori in procedimenti di branch-and-bound. Nel 1947, infatti, Dantzig fu anche l’inventore del primo algoritmo rapido per determinare vertici ottimali del “poliedro di formaggio”. Potete trovare queste e altre utili informazioni sul TSP e la sua storia al sito www.tsp.gatech. edu//index.html. Ecco qui, invece, una foto di Dantzig:» «Dunque un altro amante del formaggio.» «Non saprei. Sicuramente una personalità insondabile. George Dantzig è purtroppo scomparso nel 2005. Ma volete sentire un bell’aneddoto su di lui?» «Certo!» «In un corso universitario che Dantzig frequentava da studente, il professore aveva l’abitudine di scrivere alla lavagna alcuni esercizi che gli studenti dovevano risolvere per la volta successiva. Un giorno Dantzig arrivò a lezione troppo tardi, ma per fortuna gli esercizi stavano ancora scritti sulla lavagna. A casa si mise subito al lavoro per risolverli. Gli sembrarono un po’ più difficili del solito, ma alla fine ci riuscì.» «E allora? Qual è il punto?» «Il professore, per una volta, non aveva affatto scritto dei compiti per casa: si trattava invece di due problemi irrisolti ai quali
357
«Questa sì che è bella! Probabilmente non ci avrebbe nemmeno provato, se avesse saputo prima quanto erano difficili!» «Può darsi, ma per fortuna non lo sapeva e così diventò ben presto il Professor Dantzig. Ma torniamo al TSP. Nel 1962 il problema del commesso viaggiatore era diventato già così popolare che “Procter and Gamble”, una grossa impresa americana, organizzò una competizione incentrata proprio su di esso. In Internet è ancora reperibile il poster di allora:»
www.math.princeton.edu/tsp/car54_medium.jpg
. «10 000 dollari come primo premio. . . niente male! Mi sarebbe piaciuto esserci. Noi tre avremmo senz’altro trovato il tour ottimale. . . »
Il successo del commesso viaggiatore
fino ad allora avevano lavorato senza successo alcuni dei migliori scienziati!»
358 Alla ricerca della via più breve
«Scusa Vim, ma le 49 città di Dantzig mi sembrano ancora poche. Il tuo esempio dei buchi del trapano aveva molti più vertici.» «Hai ragione, Jan. Ci volle tuttavia un po’ di tempo prima che un problema concreto più grande potesse essere risolto. Nel 1977 Martin Grötschel migliorò il record mondiale portando il numero dei vertici a 120 e nel 1987 lui e Olaf Holland riuscirono a costruire un giro del mondo ottimale attraverso ben 666 città. Nel 1990 questo giro del mondo venne perfino immortalato in una maglietta:»
«Ah, il giro del mondo in 80 giorni!» «Direi piuttosto: in 666 tappe. A proposito, il nostro tour dell’Africa faceva parte proprio di questo problema più grande.» «Ma oggi i computer sono diventati enormemente più veloci!» «Jan, anche con i migliori computer di oggi, semplicemente controllando a tappeto tutti i tour possibili, non risolveresti nemmeno il problema delle 49 città di Dantzig, Fulkerson e Johnson. Effettivamente la matematica ha fatto gli stessi fulminei progressi che ha fatto la tecnologia. Così, appena quattro
359
«Dunque si era ormai in grado di risolvere tutti i problemi del commesso viaggiatore con qualche migliaio di vertici.» «Attenzione. Il fatto che, nel 1991, il record mondiale fosse sta. to portato a 3 038 vertici non vuol dire che si fosse capaci di risolvere tutti i problemi più piccoli, ma significa solo che un problema reale con quel numero di vertici era stato risolto. C’è ad esempio un problema con sole 225 città che poté essere “scassinato” solo nel 1995. All’indirizzo www.cs.rutgers. edu/˜chvatal/ts225.html potete ammirarlo, completo di soluzione:»
«E dire che appare così docile e ordinato.» «Già, invece è proprio la simmetria a renderlo così difficile. Essendo tutto pressoché uguale ovunque, soltanto con molta difficoltà si riescono a potare rami nel branching.» «E il record del mondo attuale?» «Fino a poco tempo fa era questo tour:»
Il successo del commesso viaggiatore
anni dopo che il tour mondiale era stato trovato, David Applegate, Robert Bixby, Vasek Chvátal e William Cook risolsero un . problema con 3 038 vertici.»
360 Alla ricerca della via più breve Applegate, Bixby, Chvátal, Cook 2001 www.math.princeton.edu/tsp/history.html
«Un viaggio attraverso la Germania!» «Già, un percorso ottimale che si snoda attraverso tutti i suoi . 15 112 comuni. A proposito, il miglior “giro d’Italia” finora noto,
361
Applegate, Bixby, Chvátal, Cook 2001
www.math.princeton.edu/tsp/world/ittour.html
«Oh, niente male. Ma perché hai detto “fino a poco tempo fa”, parlando del giro della Germania?» «Perché quel record, che risale al 2001, è già stato battuto due volte. Nel maggio 2004, infatti, è stato possibile costrui-
Il successo del commesso viaggiatore
anche se non è ancora stato dimostrato che sia proprio quello . ottimale, passa per 16 862 città ed ha questo aspetto:»
362 Alla ricerca della via più breve
. re un percorso ottimale attraverso 24 978 centri abitati della Svezia. . . » . «24 978 città in Svezia? Ma la Svezia ha solo un paio di milioni di abitanti!» «Come città si conta tutto, da tre alci in su.» «. . . e nell’aprile del 2006 si è arrivati a risolvere un problema concreto, emerso alla fine degli anni ’80 nei Laboratori Bell, . che consisteva di ben 85 900 vertici. Potete trovarlo all’indirizzo www.tsp.gatech.edu//pla85900/index.html.» «Caspita! Al confronto, il problema delle 49 città è roba da ragazzi.» «Dal 1954, la tecnologia dei computer ha progredito a velocità vorticosa e l’Ottimizzazione combinatoria forse ancora di più. Tuttavia Applegate, Bixby, Chvátal e Cook, già detentori del record del 2001 e attuali campioni in carica assieme a Espinoza, Goycoolea e Helsgaun, hanno affermato: “. . . our computer program follows the scheme designed by George Dantzig, Ray Fulkerson, and Selmer Johnson. . . ”.» «Dunque niente affatto roba da ragazzi! Il lavoro del 1954 è stato molto importante.» «Sì. Le tecniche, da allora, sono state ulteriormente raffinate e si sono aggiunti molti nuovi metodi. Ancora oggi, comunque, a molte domande non si è in grado di dare risposta e perciò la ricerca va sempre avanti.» «Se io però volessi produrre circuiti stampati con un numero di fori tale che nemmeno i migliori matematici di oggi potrebbero trovare la soluzione ottimale, che farei?» «Con l’aiuto delle nostre limitazioni superiori ed inferiori, spesso possiamo essere sicuri abbastanza in fretta di aver trovato un tour che non si allontana molto da quello ottimale. Quale ditta perderebbe settimane o mesi alla ricerca della soluzione ottimale se in un lasso di tempo ragionevole riuscisse a garantirsi di averla mancata solo per qualche punto percentuale?» «Dunque questa corsa al record mondiale è totalmente priva di senso.»
363
«Certo, anche la Formula 1 è high-tech.» «Molto più importante è tuttavia il fatto che l’esperienza ricavata e i metodi trovati possano essere messi in pratica e impiegati per la soluzione di problemi reali più significativi. Il record del mondo rappresenta solo il più grande problema risolto fin ora in modo ottimale. Sul sito www.math.princeton.edu/ tsp/world/countries.html potete trovare ancora una intera serie di tour attraverso diversi stati; in alcuni casi i percorsi sono ottimali, mentre in altri è riportata la miglior soluzione finora conosciuta, completa del margine di errore. Particolarmente impressionante è però il miglior giro del mondo attra. . verso ben 1 904 711 località, al quale si dà la caccia all’indirizzo www.math.princeton.edu/tsp/world/index.html.»
Il successo del commesso viaggiatore
«Priva di senso esattamente quanto lo è nel nuoto o nelle gare automobilistiche. Lo si può vedere come uno sport, nel quale le tecniche più nuove vengono messe alla prova.»
364 Alla ricerca della via più breve
«Quasi due milioni di città! Ormai non si distingue più nemmeno il percorso.» «Per seguirlo nei dettagli si è ricorso ad una serie di ingrandi. menti parziali, come pure si è fatto per il record degli 85 900 vertici. Può darsi benissimo che il percorso trovato da Keld Helsgaun nel luglio del 2008 – il migliore, finora – non sia ancora quello ottimale, ma, sulla base della miglior limitazione inferiore attualmente disponibile, si può comunque affermare che lo scarto tra la sua lunghezza e quella del tour ottimale è al massimo dello 0,04987 per cento.» «Wow! Da non credere che si possa arrivare così vicini alla soluzione ottimale con un numero così grande di città. . . » «. . . e che lo si possa anche dimostrare!» «Rut, non pensi che pian piano dovremmo avviarci alla conclusione? Devi ancora fare le valigie e per domattina eravamo d’accordo di partire il prima possibile.» «Hai ragione.» «Okay, allora io vado a casa. Ti passo a prendere domani. Verso le 9 va bene?» «Sì, perfetto! Non vedo l’ora.» La gita sul lago fu meravigliosa. Sole, uscite in barca, picnic con musica che proveniva dalla riva del passeggio: tutto era semplicemente magnifico. Il pomeriggio portò con sé un po’ di malinconia: per tre settimane non si sarebbero visti e Rut sentiva già adesso la mancanza di Jan. Anche Vim le sarebbe mancato, ma questa era tutta un’altra cosa. Quando Rut tornò a casa, suo padre si era già svegliato. Rut gli saltò al collo dalla gioia. «Allora, mia signorina, hai passato una bella giornata?» «Meravigliosa! E tu, vagabondo? Ti sarai stancato in America.» «Lo puoi dire forte! Mi dispiace che tutto sia dovuto slittare in avanti. Ho sentito però che tu non eri poi così triste di partire un giorno dopo.»
365 Il successo del commesso viaggiatore
MSI Freilassing
Rut arrossì e fece una smorfia. «Jan lo conosci, no? La mamma nel frattempo si è già affezionata a lui: Jan ha ormai un posticino nel suo cuore.» «Io mi preoccupo piuttosto del tuo, di cuore.» «Ma papà!» Gli ultimi preparativi per il viaggio furono sbrigati alla svelta. La madre di Rut andò a letto presto, mentre suo padre, dopo il lungo sonno del pomeriggio, si trattenne ancora un poco. Anche Rut rimase per un certo tempo sveglia nel suo letto. I suoi pensieri rincorrevano migliaia di cose. Poi finì per addormentarsi. Il mattino seguente cominciò il lungo viaggio, che voleva dire un mucchio di tempo per parlare delle vacanze, del viaggio in America del papà e, naturalmente, di Jan. «Come va poi con il tuo computer? Te la stai cavando?» «Ottimamente! È stato davvero un regalo super!» «E come sta Vim?» «Vim? Come fai. . . Ah, l’avevo immaginato! Allora ci sei tu dietro a questa cosa!»
366 Alla ricerca della via più breve
Dal gran sogghigno sul volto di suo padre Rut capì che aveva indovinato. «Dunque quella volta al telefono hai raccontato un mucchio di bugie! Ed io che per tutto il tempo ho temuto che Vim fosse capitato sul mio computer per sbaglio e che prima o poi mi sarebbe toccato restituirlo.» «No, naturalmente puoi tenerlo. Non si è trattato nemmeno di una svista. Tu eri la mia “persona-test”.» «Come, scusa? La tua cavia? Ma perché non me l’hai detto, almeno?» «Purtroppo non potevo. Doveva trattarsi di un test obbiettivo. Se tu avessi saputo che dietro Vim c’ero io, sicuramente non ti saresti buttata così a capofitto in questa avventura. Mi devi raccontare esattamente come è andata con lui.» «Di tempo in vacanza ne avremo. . . » Rut, in fondo, non era veramente arrabbiata; sotto sotto provava perfino un pochino di orgoglio perché suo padre aveva dimostrato così di tenere al suo parere. «Chi è allora Vim, esattamente?» «Originariamente Vim era l’acronimo di “Virtual Intelligence Module”, ma ormai tutti lo chiamano soltanto Vim.» «E il tuo viaggio di lavoro negli USA. . . » «. . . è stato un viaggio promozionale per Vim, addirittura uno dei più fruttuosi. Inizialmente volevo aspettare di vedere come tu te la saresti cavata con lui, ma poi i nostri soci in America hanno fatto talmente tante pressioni che la settimana scorsa mi sono dovuto scapicollare oltreoceano.» «Adesso allora non ti servo più, vero?» «Altroché, invece! Vim è solamente un prototipo. C’è ancora sicuramente qualcosa da migliorare.» Un prototipo davvero carino, pensò Rut tra sé e sé. Vim l’avrebbe dunque accompagnata anche nelle vacanze. . .
Ringraziamenti Vorremmo ringraziare tutti coloro i quali ci hanno sostenuto e incoraggiato in questa avventura matematica: le nostre famiglie e i nostri amici, le colleghe e i colleghi, i collaboratori della Springer e molti altri ancora. Il nostro grazie va anche a quanti ci hanno accordato il permesso di pubblicare le pagine web citate in questo libro. I corrispondenti URL e i riferimenti sono stati riportati direttamente nel testo. In particolare, rinnoviamo qui la nostra gratitudine nei confronti dei seguenti proprietari: c 2001 Netscape Communications Corporation. Screenshots used with permission pp. 21, 252 c Bayrische Schifffahrt GmbH, Foto Christian Prager p. 365 c Deutsche Telekom AG p. 133 c Fremdenverkehrsamt München pp. 6, 25, 66, 81, 92, 115, 118, 127, 165, 170, 201, 233, 275 c Microsoft Corporation. Riproduzione degli Screenshots per gentile concessione p. 290 c Procter & Gamble Inc. p. 355 c www.bmw.de p. 80 c www.handwerkstag-sachsen.de/berufsbilder/ p. 283 c www.mvg-mobil.de/fotoarchiv.htm p. 106 c www.spiel-und-autor.de/Spielbesprechungen/ Zug%20 um%20Zug.html p. 308 c www.tsp.gatech.edu/world/images/world30.html S. 363 c www.viamichelin.com pp. 10, 11, 39, 109
Indice analitico
albero 130 1-albero 313 generatore 132 algoritmo 15 blossom 230 del postino cinese 236 di Christofides 324 di Dijkstra 69 di Dijkstra (per tutti I vertici) 78 di Floyd-Warshall 89 di Kruskal 159 di Prim 146 efficiente 89 greedy 155 analisi preliminare 119 APPLEGATE, David 359 arborescenza 167 arco 34 backtracking 254 Biergarten 274 BIXBY, Robert 359 branch-and-bound 337 branching 333 cammino di Eulero 195 di Hamilton 263 cappio 36 CHRISTOFIDES, Nicos 319 algoritmo di 324 CHVÁTAL, Vasek 359 ciclo FOR 72 WHILE 74
circuito 87 di Eulero 195 di Hamilton 263 di lunghezza negativa 88 Combinatoria poliedrale 342 completo (grafo) 221 connesso 29 2-connesso 162 fortemente 243 COOK, Stephen 288 COOK, William 359 DANTZIG, George 355 difficile nella classe NP 282 digrafo 38 DIJKSTRA, Edsger Wybe 84 algoritmo di 69 algoritmo di (per tutti i vertici) 78 dimostrazione indiretta 136 per assurdo 136 per contraddizione 136 per induzione completa 185 dodecaedro 267 EDMONDS, Jack 230 efficiente (algoritmo) 89 ellisse 113 esaedro 267 esplosione combinatoria 49 Eu 48 EULER, Leonhard (Eulero) 178 euristica 256 costruttiva 306
370 Alla ricerca della via più breve
del vicino più prossimo migliorativa 306
303
fattoriale 228 FERMAT, Pierre de 206 Floyd-Warshall, algoritmo di 88 foglia 131 formula di Eulero 206 fortemente connesso (grafo) 243 FULKERSON, Ray 355 generatore, albero 132 grado 182 in ingresso 243 in uscita 243 grafo 26 completo 221 connesso 29 euleriano 195 fortemente connesso 243 multiplo 33 orientato 35 greedy, algoritmo 155
icosaedro 267 inizio dell’induzione 187 inserimento di vertici 306 ipercubo 346 ipotesi induttiva 187 355
KEPLER, Johannes (Keplero) Kruskal, algoritmo di 159 lato 27 limitazione inferiore 310 superiore 310
macchina di Turing 93 matroide 161 motore dell’induzione 190 multigrafo 33 Nau 48 Nikolaus 173 nodo 26 NP 280 NP-hard 282 ottaedro 267 Ottimizzazione combinatoria 355
HAMILTON, Sir William Rowan 265 HELSGAUN, Keld 364
JOHNSON, Selmer
LOEBNER, Hugh 128 LOYD, Sam 180
269
passo induttivo 190 peso dei lati 37 dei vertici 40 Pianificazione di itinerario 14 Pianificazione di processo 20 PLATONE 268 plotter 239 poliedro 347 postino cinese, algoritmo del 236 preprocessing 119 Prim, algoritmo di 146 PRIM, Robert C. 146 problema decisionale 278 dei ponti di Königsberg 176 del cammino di Hamilton 274 del circuito di Hamilton 274 del commesso viaggiatore (TSP) 296 del postino cinese 235 dell’albero di Steiner 163 dell’albero generatore 134 di accoppiamento 223 di assegnamento 223
371
radice 131 Radler 127 regola di Warnsdorff 254 rilassare 311 Routenplanung 14 satisfiability 287 senza perdita di generalità 302 solidi platonici 266 soluzione approssimata 111 spigolo 27
Steiner, problema dell’albero di 163 stima dall’alto 98 tempo di esecuzione quadratico 105 teorema di Eulero 197 Teoria della Complessità computazionale 93 test di Turing 94 tetraedro 267 traveling-salesman-problem 296 TSP 297 TURING, Alan Mathison 93 ultimo teorema di Fermat update 76 valenza 182 vertice 26 viaggio a vuoto 217 Warnsdorff, regola di 254 WILES, Andrew 207
206
Indice analitico
di cammino massimo 41 di cammino minimo 15 di cammino minimo monouso 284 di matching 230 di trasporto 228 NP 280 NP-hard 282 on-line 228 satisfiability 287