Ricerca locale e ricottura simulata: un commesso viaggiatore tra i capoluoghi di regione cechi
Il problema di ottimizzazione, il problema del commesso viaggiatore, l’hill climbing con l’intorno 2-opt, minimi locali e riavvii, la ricottura simulata, la temperatura e lo schema di raffreddamento — su un giro tra tredici capoluoghi di regione con un ottimo noto.
Serie Basi di IA Parte 26 di 52
- Mappa dell’intelligenza artificiale: che cos’è ciascuna cosa e come si incastra tutto
- Breve storia dell’intelligenza artificiale: da Turing ai modelli linguistici
- Dati, modello, addestramento, inferenza: i concetti di base su un unico esempio
- Come leggere la notazione matematica: simboli, indici, sommatorie e quantificatori
- Insiemi e relazioni: i mattoncini con cui si costruiscono le definizioni nell’IA
- Funzioni e applicazioni: perché ogni modello di IA è una funzione
- Logica e dimostrazioni: le regole con cui si ragiona nell’IA
- Grafi e alberi: la struttura su cui poggiano la ricerca e le reti neurali
- Algebra lineare per l’apprendimento automatico: vettori, matrici e perché l’IA soprattutto moltiplica
- Derivate, gradiente e regola della catena: come un modello capisce in quale direzione imparare
- Discesa del gradiente: come impara un modello
- Che cos’è la probabilità: dal lancio di un dado agli assiomi di Kolmogorov
- Probabilità condizionata e teorema di Bayes: come cambiare una stima quando scopri qualcosa di nuovo
- Variabile aleatoria e funzione di ripartizione: una sola funzione che dice tutto sulla distribuzione
- Funzione di densità e funzione di massa: perché una variabile continua ha probabilità zero in un punto
- Valore atteso, varianza e covarianza: dove si trova una distribuzione, quanto è larga e che cosa è legato a che cosa
- Panoramica delle distribuzioni di probabilità: Bernoulli, binomiale, Poisson, uniforme, normale ed esponenziale
- Legge dei grandi numeri e teorema del limite centrale: perché le medie si comportano in modo così prevedibile
- Statistica e stima dei parametri: massima verosimiglianza, MAP e intervalli di confidenza
- Teoria dell’informazione: entropia, entropia incrociata e divergenza KL — da dove vengono le funzioni di perdita
- Ricerca nello spazio degli stati: BFS, DFS, UCS e A* con animazioni
- Giochi e avversari: minimax, potatura alfa-beta e Monte Carlo tree search
- Soddisfacimento di vincoli: backtracking, propagazione dei vincoli e AC-3 su un sudoku e una mappa delle regioni ceche
- Logica e sistemi basati sulla conoscenza: concatenazione in avanti e all’indietro, risoluzione e sistemi esperti
- Pianificazione: STRIPS, il mondo dei blocchi, euristiche dal rilassamento e pianificazione negli agenti IA
- Ricerca locale e ricottura simulata: un commesso viaggiatore tra i capoluoghi di regione cechi
- Algoritmi genetici: popolazione, incrocio, mutazione e selezione su uno zaino per l’escursione
- Strategie evolutive e programmazione genetica: dalla regola di un quinto alla legge di Keplero
- Ottimizzazione con colonie di formiche: come una traccia di feromone trova un percorso breve
- Ottimizzazione a sciame di particelle: inerzia, esperienza propria ed esperienza dello sciame
- Neuroevoluzione: evoluzione dei pesi e della forma delle reti neurali e l’algoritmo NEAT
- Insiemi fuzzy e funzioni di appartenenza: come scrivere «un po’ caldo»
- Logica fuzzy e probabilità: perché «un po’ caldo» non significa «probabilmente caldo»
- Logica fuzzy: t-norme, implicazioni e regole SE–ALLORA
- Controllo fuzzy: Mamdani e Sugeno, dal ventilatore al pendolo inverso su un carrello
- Clustering fuzzy: l’algoritmo fuzzy c-means e i punti tra i cluster
- Sistemi neuro-fuzzy (ANFIS): regole fuzzy che imparano dai dati
- Catene di Markov: matrice di transizione, distribuzione stazionaria e PageRank
- Modelli di Markov nascosti: l’algoritmo di Viterbi e il casinò disonesto
- Reti bayesiane: perché l’erba è bagnata e che cosa significa per l’irrigatore
- Filtro di Kalman: come stimare da misure imprecise dove si trova un’auto e a che velocità va
- Tipi di apprendimento automatico: supervisionato, non supervisionato, semi-supervisionato e altri
- Prompt, contesto e RAG: come dare a un modello le informazioni giuste
- Autoencoder variazionali (VAE): immagini nuove da uno spazio latente continuo
- Reti generative avversarie (GAN): il falsario contro il detective
- Modelli di diffusione: come il rumore puro diventa un’immagine
- Processi decisionali di Markov: stati, azioni, ricompense ed equazioni di Bellman
- Q-learning e DQN: imparare il valore delle azioni, dalla tabella alla rete neurale
- Policy gradient e PPO: imparare direttamente la politica
- Come funziona un agente IA: un modello linguistico in un ciclo con strumenti
- Programmare con agenti IA: incarico, test e controllo
- Valutazione e sicurezza dei sistemi di IA: come misurare e come sorvegliare
Programma completo della serie 52 di 83 argomenti pubblicati
- Perché l’hill climbing si blocca in un minimo locale e quando aiutano i riavvii casuali.
- Come la ricottura simulata accetta passi peggiori e perché la temperatura e lo schema di raffreddamento contano così tanto.
- Dove vive oggi la stessa idea — dalla progettazione di chip alla temperatura dei modelli linguistici.
Utile sapere prima: Ricerca nello spazio degli stati: BFS, DFS, UCS e A* con animazioni
Il fabbro che vuole una lama robusta non lascia raffreddare di colpo il metallo rovente — lo raffredda lentamente. Così gli atomi hanno il tempo di trovare una disposizione regolare con l’energia più bassa. Se il metallo si raffreddasse tutto d’un tratto, gli atomi resterebbero congelati dove si trovavano e la lama sarebbe fragile. Nel 1983 alcuni fisici si accorsero che proprio questo affligge anche gli algoritmi che cercano la soluzione migliore: se vanno solo «in discesa», restano congelati nella prima conca. Così è nata la ricottura simulata (simulated annealing) — e con essa una delle idee più utili dell’ottimizzazione.
Con questa parte inizia il modulo sugli algoritmi ispirati alla natura. Segue la parte Ricerca nello spazio degli stati, dove l’hill climbing e la ricottura sono comparsi per la prima volta.
1. Il problema di ottimizzazione
Definizione — problema di ottimizzazione e intorno
È dato un insieme di soluzioni ammissibili S e una funzione obiettivo f : S → ℝ. Cerchiamo s* = argmins ∈ S f(s) — la soluzione con il valore più piccolo (per la massimizzazione al contrario).
Un intorno è una funzione N : S → 2S che assegna a ogni soluzione l’insieme delle soluzioni «vicine», quelle che se ne ottengono con una piccola modifica. Una soluzione s è un minimo locale se f(s) ≤ f(s′) per ogni s′ ∈ N(s), e un minimo globale se ciò vale per ogni s′ ∈ S.
A differenza di un labirinto, non ci interessa il percorso verso la soluzione, ma la soluzione stessa: il giro più corto, l’orario migliore, la disposizione più economica. La funzione obiettivo dice quanto è buona una soluzione. L’intorno dice che cosa sono le «piccole modifiche» — e un minimo locale è una soluzione che nessuna piccola modifica riesce a migliorare, anche se poco più in là potrebbe essercene una molto migliore.
2. Il problema del commesso viaggiatore
Un commesso viaggiatore deve visitare tutti e tredici i capoluoghi di regione della Cechia, passare da ciascuno una volta e tornare da dove è partito. Quale giro gli fa percorrere meno chilometri? Le distanze le calcoliamo in linea d’aria.
Definizione — problema del commesso viaggiatore (TSP)
Sono date n città e le distanze d(i, j). Una soluzione è una permutazione ciclica π delle città; la sua lunghezza è f(π) = ∑k=1n d(πk, πk+1), dove πn+1 = π1.
I giri distinti (senza contare dove e in quale verso cominciano) sono (n − 1)! / 2. La versione decisionale del problema è NP-completa.
Per 13 città i giri possibili sono 239 500 800. Per venti già più di 60 biliardi. Provarli tutti non si può, e nessuno conosce un algoritmo che in generale trovi il giro più corto in modo sostanzialmente più rapido che in tempo esponenziale.
numero di giri = n! / (n · 2) = (n − 1)! / 2
- n!
- tutti gli ordini in cui si possono elencare n città — tante sono le permutazioni; ogni giro però vi è contato più volte
- n
- un giro non ha inizio: Praha → Brno → … → Praha è lo stesso percorso di Brno → … → Praha → Brno. Ogni giro può cominciare in una qualsiasi delle n città, quindi n volte di meno
- 2
- la distanza all’andata è uguale a quella al ritorno, quindi un giro percorso al contrario è lo stesso percorso con la stessa lunghezza
Esempio — la distanza in linea d’aria da Praha a Brno
Le città sono date da latitudine φ e longitudine λ in gradi. Sul territorio della Cechia basta una proiezione piana approssimata: un grado di latitudine misura 110,57 km, un grado di longitudine 111,32 · cos φ0 km, dove φ0 = 49,8° è il centro del Paese (i meridiani convergono verso il polo). Allora
d(i, j) = √( (71,85 · Δλ)2 + (110,57 · Δφ)2 ).
Praha (50,08° N, 14,42° E), Brno (49,20°, 16,61°)
Δλ = 2,19° → 71,85 · 2,19 = 157,35 km verso est
Δφ = −0,88° → 110,57 · 0,88 = 97,30 km verso sud
d = √(157,352 + 97,302) = √(24 759 + 9 467) = √34 226 ≈ 185,0 km
Rispetto al calcolo esatto sulla sfera, l’errore per distanze di questo tipo è intorno all’1 %; per confrontare i giri non importa.
Tredici città sono ancora abbastanza poche da poter calcolare l’ottimo esattamente — con la programmazione dinamica di Held e Karp sui sottoinsiemi di città, che richiede 2n · n2 passi invece di (n − 1)!. Il giro più corto misura 1 060,4 km. Grazie a questo, per ogni algoritmo successivo vedremo esattamente quanto si è avvicinato all’ottimo:
Algoritmo — programmazione dinamica di Held e Karp (1962)
Numeriamo le città 0, …, n − 1 e partiamo dalla città 0. Per ogni insieme di città M ∋ 0 e ogni città j ∈ M indichiamo con D(M, j) la lunghezza del percorso più corto che parte da 0, passa esattamente per le città di M e termina in j. Allora
D({0}, 0) = 0, D(M, j) = mink ∈ M ∖ {j} [ D(M ∖ {j}, k) + d(k, j) ],
e la lunghezza del giro ottimo è minj ≠ 0 [ D(tutte le città, j) + d(j, 0) ]. I valori di D sono al massimo 2n · n e ciascuno è il minimo di al massimo n numeri.
n = 13: 213 · 132 = 8 192 · 169 = 1 384 448 passi
provare tutti gli ordini da una partenza fissa: 12! = 479 001 600 — circa 346 volte di più
Per il resto del viaggio non conta nulla di come hai attraversato Plzeň, Karlovy Vary e Ústí, tranne due cose: quali città hai già alle spalle e dove ti trovi adesso. Basta quindi ricordare, per ogni coppia di questo tipo, il percorso più corto, non tutti gli ordini. Per 13 città è rapido, ma 2n cresce comunque in modo esponenziale — per 60 città la tabella avrebbe più di 1019 righe.
3. L’hill climbing e l’intorno 2-opt
Definizione — mossa 2-opt
Una mossa 2-opt toglie dal giro due archi non adiacenti (a, b) ed (e, f) e li sostituisce con gli archi (a, e) e (b, f) — cioè inverte l’ordine delle città tra b ed e. La lunghezza cambia di Δ = d(a, e) + d(b, f) − d(a, b) − d(e, f). L’intorno di un giro su n città conta (n − 1)(n − 2) / 2 mosse.
Dove il giro si incrocia con sé stesso, è quasi certamente più lungo del necessario. La mossa 2-opt scioglie l’incrocio: taglia il giro in due punti e capovolge uno dei pezzi. La variazione di lunghezza la calcoli da quattro distanze, senza dover ricalcolare tutto il giro.
Δ = d(a, e) + d(b, f) − (d(a, b) + d(e, f))
- Δ
- di quanto si allunga il giro; un Δ negativo significa un accorciamento. In base al segno decidono sia l’hill climbing sia la ricottura, per questo ci serve calcolarlo a buon mercato
- d(a, e) + d(b, f)
- i due nuovi archi con cui ricolleghiamo le estremità tagliate — si sommano, perché allungano il giro
- d(a, b) + d(e, f)
- i due archi che abbiamo tagliato — si sottraggono, perché spariscono dal giro. Il tratto tra b ed e lo percorriamo solo al contrario e le distanze sono simmetriche, quindi la sua lunghezza non cambia e nella formula non compare
Algoritmo — hill climbing (discesa più ripida)
Parti da una soluzione casuale s. Ripeti: trova s′ ∈ N(s) con la f(s′) più piccola; se f(s′) < f(s), passa a s′, altrimenti fermati — s è un minimo locale.
Prova tutti gli scioglimenti, scegli quello che accorcia di più il giro e ripeti. Quando nessuno aiuta più, ti fermi. Per tredici città sono 66 mosse a ogni passo.
def delta(c, i, j): # mossa 2-opt: inverti c[i..j]
a, b = c[i - 1], c[i]
e, f = c[j], c[(j + 1) % len(c)]
return d(a, e) + d(b, f) - d(a, b) - d(e, f)
def horolezec(c):
n = len(c)
while True:
tahy = [(i, j) for i in range(1, n - 1) for j in range(i + 1, n)]
i, j = min(tahy, key=lambda t: delta(c, *t)) # discesa più ripida
if delta(c, i, j) >= 0: # nulla accorcia il giro
return c # minimo locale
c = c[:i] + c[i:j + 1][::-1] + c[j + 1:]
La prima città la lasciamo al suo posto (i ≥ 1) — il giro non ha inizio, quindi spostarla non porterebbe nulla di nuovo. Per n = 13 le coppie 1 ≤ i < j ≤ 12 danno esattamente 12 · 11 / 2 = 66 mosse.
Da un giro casuale lungo 2 402 km l’hill climbing arriva in 8 passi a 1 065,8 km — e lì si ferma. All’ottimo mancano solo 5 km, ma nessuna singola mossa 2-opt accorcia più il giro. L’hill climbing è in un minimo locale e non lo sa:
4. Dove si blocca l’hill climbing
Su cento partenze casuali, l’hill climbing è finito nell’ottimo 61 volte. Negli altri 39 casi si è bloccato altrove, nel peggiore a 1 162,6 km — cento chilometri più in là. Le trappole sono tre:
- Minimo locale — una conca da cui ogni passo porta in salita.
- Plateau — tutti i vicini sono ugualmente buoni, quindi l’hill climbing non sa dove andare.
- Cresta — una buona direzione esiste, ma non segue nessuna singola mossa; ci si arriva solo passando per soluzioni peggiori.
Esempio — perché l’hill climbing non esce da 1 065,8 km
L’hill climbing dalla prima partenza è finito sul giro Zlín → Ostrava → Olomouc → Pardubice → Hradec Králové → Liberec → Ústí nad Labem → Karlovy Vary → Plzeň → Praha → České Budějovice → Jihlava → Brno → Zlín. Calcoliamo il Δ di tutte le 66 mosse 2-opt: una di esse (l’inversione di tutto tranne la prima città) dà lo stesso giro nel verso opposto e Δ = 0, tutte le altre allungano il giro. La meno costosa inverte la coppia Pardubice – Hradec Králové:
a = Olomouc, b = Pardubice, e = Hradec Králové, f = Liberec
Δ = d(a, e) + d(b, f) − d(a, b) − d(e, f)
= 122,9 + 95,9 − 116,8 − 83,0 = +19,0 km
Ogni singola mossa allunga quindi il giro di almeno 19,0 km — eppure l’ottimo è più corto di appena 5,4 km. La strada per arrivarci passa per giri peggiori, e quelli l’hill climbing non li accetta mai.
Il rimedio più semplice è il riavvio casuale: far ripartire l’hill climbing da un altro punto e tenere il risultato migliore. Se una partenza riesce con probabilità 0,61, allora su cinque partenze almeno una riesce con probabilità 1 − 0,395 ≈ 99 %. Per un problema piccolo basta. In uno grande le conche sono milioni e servirebbero troppi riavvii.
Pr = 1 − (1 − p)r
- Pr
- la probabilità che almeno una delle r partenze trovi l’ottimo — la calcoliamo tramite il complementare, perché «almeno una» ha molte forme, mentre «nessuna» una sola
- 1 − p
- la probabilità che una partenza fallisca (da noi 0,39 su cento tentativi)
- r
- il numero di partenze all’esponente: le partenze sono indipendenti (ognuna ha un seme casuale diverso), quindi le probabilità di fallimento si moltiplicano
5. La ricottura simulata
Algoritmo — ricottura simulata
Parti da una soluzione casuale s con temperatura iniziale T0. A ogni iterazione:
- scegli un vicino casuale s′ ∈ N(s) e calcola Δ = f(s′) − f(s);
- se Δ ≤ 0, passa a s′; altrimenti passaci con probabilità e−Δ/T (criterio di Metropolis);
- abbassa la temperatura secondo lo schema di raffreddamento, per esempio T ← α · T con 0 < α < 1.
Restituisci la soluzione migliore che hai visto lungo il cammino.
Un hill climbing che ogni tanto si concede un passo nella direzione sbagliata. All’inizio, finché fa «caldo», di passi così ne fa molti — salta da una conca all’altra ed esplora tutto il paesaggio. Man mano che si raffredda diventa sempre più prudente, e alla fine scende soltanto nella valle più profonda che ha trovato lungo la strada. Un piccolo peggioramento lo accetta più facilmente di uno grande.
P(accettare) = min(1, e−Δ / T)
- P(accettare)
- con quale probabilità passiamo al vicino proposto; nel programma estraiamo u in modo uniforme da [0, 1) e accettiamo la mossa se u < P
- min(1, …)
- per un miglioramento (Δ ≤ 0) l’esponenziale è ≥ 1 e la probabilità non può superare 1 — un passo migliore si accetta quindi sempre, come nell’hill climbing
- Δ
- di quanto è peggiore il vicino, in km. Sta all’esponente con il segno meno, quindi ogni chilometro di peggioramento in più moltiplica la probabilità per lo stesso numero minore di 1 — i grandi peggioramenti sono esponenzialmente più rari dei piccoli
- T
- la temperatura, nelle stesse unità di Δ (km). Divide Δ e così ne fissa la scala: un peggioramento di T km passa con probabilità 1/e ≈ 0,37 a qualunque temperatura. Una T alta rende «piccoli» i grandi peggioramenti, T → 0 li vieta tutti
La regola per accettare un passo peggiore viene dalla fisica: nel 1953 Nicholas Metropolis e i suoi colleghi la usarono per simulare atomi in equilibrio termico, dove la probabilità di uno stato con energia E è proporzionale a e−E/kT. Per l’ottimizzazione la adattarono nel 1983, indipendentemente, Kirkpatrick, Gelatt e Vecchi dell’IBM — e due anni dopo, anche lui in modo indipendente, il fisico slovacco Vladimír Černý, proprio sul problema del commesso viaggiatore.
import math, random
def zihani(c, T0=200, Tk=0.5, K=10_000):
alfa = (Tk / T0) ** (1 / K) # raffreddamento geometrico
T, delka = T0, delka_okruhu(c)
nej, nej_delka = c, delka
for k in range(K):
i, j = sorted(random.randint(1, len(c) - 1) for _ in range(2))
if i != j: # i = j: nessuna mossa
D = delta(c, i, j)
if D <= 0 or random.random() < math.exp(-D / T):
c = c[:i] + c[i:j + 1][::-1] + c[j + 1:]
delka += D
if delka < nej_delka:
nej, nej_delka = c, delka
T *= alfa
return nej
Ecco come va davvero: le prime sei iterazioni della nostra esecuzione e sei iterazioni dalla sua metà. p è la probabilità di accettazione min(1, e−Δ/T), u il numero estratto; una mossa peggiorativa passa se u < p.
| k | T | Δ (km) | p | u | Accettata | Lunghezza (km) |
|---|---|---|---|---|---|---|
| 1 | 200,0 | −310,0 | 1,000 | — | sì | 1 941,4 |
| 2 | 199,9 | +26,5 | 0,876 | 0,293 | sì | 1 967,9 |
| 3 | 199,8 | −49,2 | 1,000 | — | sì | 1 918,7 |
| 4 | 199,6 | −111,2 | 1,000 | — | sì | 1 807,5 |
| 5 | 199,5 | +146,6 | 0,480 | 0,144 | sì | 1 954,1 |
| 6 | 199,4 | −127,8 | 1,000 | — | sì | 1 826,3 |
| 5001 | 10,0 | +147,3 | 4,0 · 10−7 | 0,065 | no | 1 060,4 |
| 5002 | 10,0 | +86,2 | 1,8 · 10−4 | 0,838 | no | 1 060,4 |
| 5003 | 10,0 | — (i = j) | — | — | no | 1 060,4 |
| 5004 | 10,0 | +73,0 | 6,6 · 10−4 | 0,660 | no | 1 060,4 |
| 5005 | 10,0 | +82,4 | 2,6 · 10−4 | 0,747 | no | 1 060,4 |
| 5006 | 10,0 | +212,1 | 5,8 · 10−10 | 0,262 | no | 1 060,4 |
All’inizio, con T ≈ 200, passa anche una mossa che allunga il giro di 146,6 km — la probabilità è 0,48 ed è uscito u = 0,14. A metà dell’esecuzione T = 10 e il giro è già nell’ottimo; le mosse che lo allungherebbero di 70 chilometri o più hanno una probabilità sotto l’uno per mille e vengono tutte rifiutate. A volte i due numeri casuali cadono nello stesso punto (i = j) e l’iterazione non propone nulla — in tutta l’esecuzione è successo 824 volte.
Teorema — distribuzione di Boltzmann (formulazione odierna)
Se teniamo fissa la temperatura T e proponiamo i vicini in modo simmetrico (il vicino s′ viene proposto da s con la stessa probabilità con cui s viene proposto da s′ — per il 2-opt vale, perché la stessa mossa (i, j) riporta anche indietro), allora il processo di Metropolis è una catena di Markov la cui distribuzione stazionaria è
πT(s) = e−f(s)/T / Z(T)
- πT(s)
- quanto spesso, dopo un lungo vagare alla temperatura T, ci troviamo nella soluzione s
- e−f(s)/T
- il peso della soluzione: più è corto il giro f(s), più è grande. È esattamente il peso che il criterio di Metropolis bilancia — il rapporto tra i pesi di due vicini è e−Δ/T
- Z(T)
- la somma dei pesi su tutte le soluzioni; dividiamo per essa perché le probabilità sommino a 1
Dimostrazione (condizione di bilancio dettagliato): per due vicini con f(s′) = f(s) + Δ, Δ > 0, il flusso da s a s′ è proporzionale a π(s) · e−Δ/T e il flusso inverso a π(s′) · 1. Per π = πT entrambe le espressioni valgono e−f(s′)/T / Z, i flussi si pareggiano e la distribuzione non cambia più.
ottimo (1 060,4 km) contro la trappola dell’hill climbing (1 065,8 km): rapporto delle frequenze e5,38/T
T = 100: 1,06 T = 10: 1,71 T = 1: 217 T = 0,5: 47 089
A temperatura alta la ricottura si trova nell’ottimo quasi altrettanto spesso che nella trappola più lunga di cinque chilometri — non li distingue. Man mano che la temperatura scende, il peso si sposta sui giri più corti: a T = 1 l’ottimo è duecento volte più frequente, a 0,5 quasi cinquantamila volte. Il raffreddamento quindi «affila» a poco a poco la distribuzione, finché resta solo la valle più profonda. Il problema è che l’equilibrio lo raggiunge solo una catena che ha abbastanza tempo per vagare — da qui il raffreddamento lento.
6. Temperatura e schema di raffreddamento
Che probabilità ha un passo che allunga il giro di 20 km? Dipende dalla temperatura:
| Temperatura T | 200 | 50 | 10 | 2 | 0,5 |
|---|---|---|---|---|---|
| e−20/T | 0,905 | 0,670 | 0,135 | 0,000 05 | ≈ 4 · 10−18 |
A 200 passa quasi ogni passo peggiorativo, a 0,5 nessuno — in quel momento la ricottura si comporta come l’hill climbing. Lo schema di raffreddamento stabilisce per quanto tempo l’algoritmo «vaga» e per quanto «scende». La via d’uscita più economica dalla trappola dell’hill climbing (+19,0 km, vedi sopra) a T = 50 passerebbe con probabilità 0,68, a T = 10 con 0,15 e a T = 2 praticamente mai.
Tk = T0 · αk, α = (TK / T0)1/K
- Tk
- la temperatura all’iterazione k-esima — stabilisce quanto grandi peggioramenti si accettano ancora in quel momento
- T0
- la temperatura iniziale; si sceglie in modo che all’inizio passi la maggior parte dei peggioramenti — da noi 200 km, più di una tipica mossa 2-opt su un giro casuale
- α
- il coefficiente di raffreddamento, appena sotto 1; lo calcoliamo dalla temperatura finale TK e dal numero di iterazioni K, perché l’esecuzione finisca esattamente dove vogliamo
- k
- il numero dell’iterazione all’esponente: ogni iterazione moltiplica la temperatura per lo stesso numero, quindi nello stesso numero di iterazioni la temperatura scende sempre dello stesso rapporto — da 200 a 100 ci vuole quanto da 1 a 0,5
α = (0,5 / 200)1/10 000 = 0,00250,0001 = 0,999401
la temperatura si dimezza ogni ln 0,5 / ln α ≈ 1 157 iterazioni
T1 000 = 109,9, T3 000 = 33,1, T5 000 = √(200 · 0,5) = 10,0
Teorema — convergenza della ricottura
Se la temperatura scende abbastanza lentamente, in modo logaritmico: Tk = c / ln(k + 1) con una costante c abbastanza grande, allora la probabilità che la ricottura termini in un minimo globale tende a uno al crescere del numero di iterazioni (Hajek, 1988).
«Abbastanza grande» significa esattamente c ≥ d*, dove d* è la profondità del minimo locale non globale più profondo: di quanto, come minimo, deve salire un percorso che ne parte prima di arrivare a una soluzione migliore.
se bastasse c = 20 km, la temperatura 0,5 l’avremmo solo quando ln(k + 1) = 20 / 0,5 = 40,
cioè dopo k ≈ e40 ≈ 2,4 · 1017 iterazioni — circa un miliardo di volte più di tutti i 239 500 800 giri
Se raffreddi infinitamente piano, trovi l’ottimo di sicuro. Ma il raffreddamento logaritmico è così lento che ci vorrebbe più tempo che esaminare tutto. In pratica si raffredda quindi in modo geometrico — in fretta, senza garanzie, ma con risultati che di solito bastano.
7. La ricottura sui capoluoghi di regione
Lanciamo la ricottura sullo stesso problema: 10 000 iterazioni, la temperatura scende in modo geometrico da 200 a 0,5. La mappa mostra com’era il giro all’inizio e dopo 1 000, 3 000, 5 000 e 10 000 iterazioni:
Dopo mille iterazioni il giro è ancora caotico (1 985 km) — a temperatura alta la ricottura accetta quasi tutto. Dopo tremila ha già una forma (1 159 km) e dopo cinquemila è nell’ottimo, 1 060,4 km. Delle 1 498 mosse accettate, 695 erano peggiorative; l’hill climbing non ne avrebbe fatta nemmeno una. Il grafico mostra come la lunghezza del giro salta su e giù finché la temperatura non scende:
Il passaggio dal vagare allo scendere si vede anche nel numero di mosse accettate in ciascun migliaio di iterazioni: 597, 411, 232, 104, 35, 35, 26, 21, 26, 11. Nel primo migliaio, quando T è tra 200 e 110, si accetta più della metà delle proposte. Dal quinto migliaio (T sotto 20) ormai solo decine; di queste, le peggiorative sono state 37, di cui 26 piccole, sotto i 3 km.
E non è il caso fortunato di un’esecuzione: su cento esecuzioni con semi diversi, 98 sono finite nell’ottimo e le altre due a meno di 3 km di distanza. Rispetto al 61 % dell’hill climbing da una sola partenza è una grande differenza.
8. Quando conviene la ricottura
A essere onesti: la ricottura ha fatto 10 000 iterazioni, l’hill climbing da una sola partenza solo circa seicento valutazioni. Su un problema piccolo, l’hill climbing con riavvii allo stesso costo andrebbe altrettanto bene. La differenza emerge su un problema più grande. Prendiamo 60 città disposte a caso e diamo a entrambi gli algoritmi lo stesso budget — 200 000 mosse 2-opt valutate:
| Algoritmo | Lunghezza del giro migliore |
|---|---|
| Hill climbing con riavvii casuali | 2 312,5 km |
| Ricottura simulata (tre esecuzioni) | 2 209,8 – 2 269,8 km |
L’hill climbing è rientrato nel budget solo due volte: con 60 città l’intorno conta 1 711 mosse e la discesa più ripida le esamina tutte a ogni passo. La ricottura prova una mossa casuale alla volta e distribuisce lo stesso budget sull’esplorazione di tutto il paesaggio. Ognuna delle sue tre esecuzioni è finita meglio dell’hill climbing.
9. La ricottura nell’intelligenza artificiale e altrove
- Progettazione di chip e orari. Il posizionamento dei componenti su un chip è stato uno dei primi grandi impieghi della ricottura negli anni Ottanta; ancora oggi si usa per orari, percorsi di veicoli o la disposizione di un magazzino.
- Addestramento delle reti neurali. La discesa stocastica del gradiente calcola il gradiente su un piccolo lotto di dati, e così ogni passo è un po’ casuale — come la ricottura, può scivolare fuori da una conca poco profonda. Gli schemi del tasso di apprendimento che lo abbassano gradualmente si chiamano addirittura cosine annealing.
- La temperatura dei modelli linguistici. Quando un modello linguistico sceglie la parola successiva, divide i punteggi delle parole per la temperatura T e con la funzione softmax li trasforma in probabilità proporzionali a ez/T — la stessa formula di Boltzmann. Una temperatura alta significa un testo più fantasioso e rischioso, una bassa uno più prudente e prevedibile.
- Ricottura quantistica. Computer specializzati (per esempio D-Wave) cercano il minimo dell’energia in modo fisico, sfruttando fenomeni quantistici. Se e quando siano più veloci degli algoritmi classici è ancora oggetto di ricerca.
Esempio — la temperatura nella scelta della parola successiva
Il modello assegna a tre candidati per la parola successiva i punteggi z = (2, 1, 0). La probabilità della parola i-esima è pi = ezi/T / ∑j ezj/T — la distribuzione di Boltzmann della sezione sulla ricottura, solo con «energia» −z.
T = 1: (e2, e1, e0) = (7,39; 2,72; 1), somma 11,11 → 0,665; 0,245; 0,090
T = 0,5: (e4, e2, 1) = (54,6; 7,39; 1), somma 62,99 → 0,867; 0,117; 0,016
T = 2: (e1, e0,5, 1) = (2,72; 1,65; 1), somma 5,37 → 0,506; 0,307; 0,186
Una temperatura più bassa sposta la probabilità verso il candidato migliore (per T → 0 è sempre lui), una più alta la distribuisce anche sulle parole meno probabili — proprio come la ricottura a temperatura alta accetta anche giri peggiori.
10. Riepilogo
- Un problema di ottimizzazione cerca la soluzione con il valore migliore della funzione obiettivo; la ricerca locale si muove nell’intorno della soluzione attuale.
- L’hill climbing va sempre verso il vicino migliore e si blocca in un minimo locale — sui capoluoghi di regione in 39 partenze su 100. I riavvii casuali aiutano nei problemi piccoli.
- La ricottura simulata accetta anche passi peggiori con probabilità e−Δ/T; con il calare della temperatura passa dall’esplorazione alla discesa.
- Sui capoluoghi di regione ha trovato l’ottimo in 98 esecuzioni su 100; su un problema più grande ha battuto l’hill climbing con lo stesso budget.
- La stessa formula di Boltzmann vive nella temperatura dei modelli linguistici, e l’idea del raffreddamento negli schemi di apprendimento delle reti neurali.
Vuoi metterci le mani? Fai scrivere a un agente IA una ricottura per il tuo giro — magari tra i posti dove vuoi andare in vacanza — e prova che cosa succede con un raffreddamento troppo rapido.
La vedi diversamente? Scrivi a support@coden-app.com.