Ricerca informata - greedy best-first, A∗ ed euristiche
In questa pagina 8
Le strategie di Ricerca nello spazio degli stati - formulazione dei problemi e ricerca non informataUn agente risolutore di problemi è un agente basato su obiettivi con rappresentazione atomica: formula un problema (stato iniziale, azioni, modello di transizione, test dell'obiettivo, costo dei passi) e cerca una sequenza di azioni che porta a uno stato obiettivo costruendo un albero di ricerca. Le strategie non informate usano solo la definizione del problema e si distinguono per l'ordine di espansione della frontiera: ampiezza (coda FIFO), costo uniforme (coda con priorità sul costo g), profondità (pila LIFO), profondità limitata, approfondimento iterativo e ricerca bidirezionale. Si confrontano per completezza, ottimalità, tempo e spazio in funzione di b, d, m; tutte sono casi di best-first search con una diversa funzione di valutazione f.Ricerca nello spazio degli stati - formulazione dei problemi e ricerca non informata → non sanno quanto sia lontano l'obiettivo. Qui si aggiunge quell'informazione sotto forma di una funzione euristica, e si ottiene una ricerca che si "orienta" verso l'obiettivo. Poi si passa ai problemi in cui il cammino non conta, risolti con la ricerca locale. Fonte: slide del corso di Intelligenza Artificiale, Ing. dell'Informazione UniPD, con il laboratorio 3.
Ricerca informata e funzione euristica
L'idea: associare a ogni nodo una funzione euristica , la stima del costo del cammino più economico da a un obiettivo, ed espandere il nodo più "desiderabile". L'implementazione è la stessa dell'ampiezza e del costo uniforme: la frontiera è una coda con priorità ordinata per desiderabilità decrescente. Due casi speciali: greedy best-first e A∗.
Esempio che ritorna in tutta la nota: la mappa della Romania con obiettivo Bucarest e come euristica la distanza in linea retta (straight-line distance) da Bucarest:
| città | città | ||
|---|---|---|---|
| Arad | 366 | Mehadia | 241 |
| Bucarest | 0 | Neamt | 234 |
| Craiova | 160 | Oradea | 380 |
| Drobeta | 242 | Pitesti | 100 |
| Eforie | 161 | Rimnicu Vilcea | 193 |
| Fagaras | 176 | Sibiu | 253 |
| Giurgiu | 77 | Timisoara | 329 |
| Hirsova | 151 | Urziceni | 80 |
| Iasi | 226 | Vaslui | 199 |
| Lugoj | 244 | Zerind | 374 |
Greedy best-first search
Definizione. La ricerca greedy best-first espande il nodo che sembra più vicino all'obiettivo: , con stima del costo da all'obiettivo più vicino.
Esempio: da Arad a Bucarest con (grafo con tabella dei raggiunti):
| passo | si espande | frontiera dopo l'espansione (città, ) |
|---|---|---|
| 1 | Arad (366) | Sibiu 253, Timisoara 329, Zerind 374 |
| 2 | Sibiu (253) | Fagaras 176, Rimnicu Vilcea 193, Timisoara 329, Zerind 374, Oradea 380 |
| 3 | Fagaras (176) | Bucarest 0, Rimnicu Vilcea 193, Timisoara 329, Zerind 374, Oradea 380 |
| 4 | Bucarest (0) | obiettivo |
Cammino Arad Sibiu Fagaras Bucarest, costo , con 4 espansioni. Il cammino ottimo costa (via Rimnicu Vilcea e Pitesti): greedy è veloce ma sceglie la strada che "sembra" più corta, senza guardare il costo già speso.
Proprietà:
- Completa: solo in spazi finiti e senza cicli (con la tabella dei raggiunti in spazi finiti sì; su alberi può girare in tondo).
- Tempo: nel caso peggiore, ma una buona euristica lo migliora molto.
- Spazio: , tiene in memoria tutti i nodi.
- Non ottima.
A∗ search
Definizione. A∗ usa la funzione di valutazione dove è il costo finora speso per arrivare a , la stima del costo restante e la stima del costo totale di un cammino che passa per . Idea: evitare di espandere cammini già costosi.
Con si ottiene il costo uniforme; con il greedy.
Esempio: da Arad a Bucarest con . Ogni nodo è scritto come ; la frontiera è ordinata per .
| passo | si espande () | nodi generati () |
|---|---|---|
| 1 | Arad () | Sibiu ; Timisoara ; Zerind |
| 2 | Sibiu (393) | Rimnicu Vilcea ; Fagaras ; Oradea (Arad è già raggiunta con e non rientra; nella versione ad albero rientrerebbe con ) |
| 3 | Rimnicu Vilcea (413) | Pitesti ; Craiova |
| 4 | Fagaras (415) | Bucarest |
| 5 | Pitesti (417) | Bucarest , sostituisce quello da |
| 6 | Bucarest (418) | obiettivo |
I costi vengono dai passi: Rimnicu Vilcea , Fagaras , Pitesti , Bucarest via Fagaras , via Pitesti . Soluzione Arad Sibiu Rimnicu Vilcea Pitesti Bucarest, costo 418, ottima, con 6 espansioni (il costo uniforme ne fa 13, il greedy 4 ma sbaglia). Al passo 4 A∗ espande Fagaras perché e genera Bucarest con ; non lo sceglie subito perché Pitesti () e poi Bucarest via Pitesti () hanno minore.
Il codice del laboratorio è la best_first_search della nota precedente con f = g + h:
def astar_search(problem, h=None):
"""Search nodes with minimum f(n) = g(n) + h(n)."""
h = h or problem.h
return best_first_search(problem, f=lambda n: g(n) + h(n))Euristica ammissibile e consistente
Definizione. Un'euristica è ammissibile se , per ogni obiettivo e non sovrastima mai il costo vero: , con costo del cammino ottimo da all'obiettivo. È consistente (o monotona) se per ogni nodo , ogni azione e successore
(È una disuguaglianza triangolare: stimare da non può costare più che fare un passo e poi stimare da .) Consistente ammissibile: lungo un cammino ottimo , con i passi di costo , si applica la consistenza a ogni passo e si somma: perché . Non vale il viceversa in generale.
La distanza in linea retta è ammissibile: nessuna strada è più corta della retta. È anche consistente: per esempio Arad Sibiu: ; Sibiu Rimnicu Vilcea: . Su tutte le 23 strade della mappa, nei due versi, la disuguaglianza è verificata con un programma.
Ottimalità di A∗
Teorema. Se è ammissibile, A∗ (versione ad albero) è ottima. Se è consistente, anche la versione su grafo con tabella dei raggiunti è ottima.
Dimostrazione (versione ad albero). Sia un obiettivo non ottimo già generato, e un nodo non espanso su un cammino ottimo verso l'obiettivo ottimo . Allora Quindi : A∗ non seleziona mai finché esiste un nodo come sul cammino ottimo, dunque il primo obiettivo estratto è ottimo.
Con la consistenza, inoltre, non decresce mai lungo un cammino: . A∗ espande quindi i nodi in ordine non decrescente di e, quando un nodo è espanso per la prima volta, ha già il costo minimo: la tabella dei raggiunti non perde soluzioni ottime. Le espansioni formano i contorni : il contorno contiene i nodi con , . A differenza dei contorni dell'ampiezza (cerchi attorno alla partenza), quelli di A∗ si allungano verso l'obiettivo; più è accurata, più sono stretti.
Proprietà:
- Completa: sì, a meno di infiniti nodi con .
- Tempo: nel caso peggiore, ma dipende da quanto è buona .
- Spazio: , tiene in memoria tutti i nodi.
- Ottima: sì, non si passa al contorno prima di aver finito .
A∗ pesato
Un'euristica che sovrastima (non ammissibile) può far perdere la soluzione ottima, ma può espandere molti meno nodi. A∗ pesato (weighted A∗):
È una generalizzazione di tutte le strategie viste:
| strategia | ||
|---|---|---|
| costo uniforme (Dijkstra) | ||
| A∗ | ||
| A∗ pesato | ||
| greedy best-first |
Nelle slide, in un esempio di pianificazione di percorso, con lo spazio di ricerca si riduce di un fattore 7 con un costo finale maggiore del 5%. Sul puzzle dell'8 dell'esempio sotto (soluzione ottima di 26 mosse), con : genera 6130 nodi; (valore predefinito del laboratorio) trova ancora 26 mosse con 1202 nodi; trova 30 mosse con 638 nodi, cioè circa 10 volte meno nodi con il 15% di cammino in più. Sulla Romania da Arad a Bucarest, già con il cammino diventa quello del greedy (costo 450 invece di 418).
Qualità delle euristiche
Fattore di diramazione effettivo
Un modo di caratterizzare la qualità di un'euristica è il fattore di diramazione effettivo (effective branching factor). Se A∗ genera in totale nodi per un problema con soluzione a profondità , è il fattore di diramazione di un albero uniforme di profondità con nodi: Si misura sperimentalmente su un campione di problemi, e un'euristica ben progettata ha vicino a 1. L'equazione si risolve numericamente (non ha formula chiusa per grande).
Esempio. , : , cioè , da cui . Con e la risoluzione numerica dà (riga della tabella delle slide, più sotto).
Il puzzle dell'8
Due euristiche per il puzzle dell'8:
- = numero di tessere fuori posto;
- = distanza di Manhattan totale: per ogni tessera, il numero di caselle (righe più colonne) che la separano dalla posizione finale.
Lo stato delle slide ha righe e l'obiettivo è . Con (riga, colonna) da in alto a sinistra:
| tessera | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| posizione in | ||||||||
| posizione finale | ||||||||
| distanza |
Tutte le 8 tessere sono fuori posto: . E Entrambe sono ammissibili: ogni mossa sposta una tessera di una sola casella, quindi servono almeno mosse (e almeno ).
Dati medi delle slide (100 puzzle per ogni lunghezza della soluzione):
| nodi BFS | nodi A∗() | nodi A∗() | BFS | A∗() | A∗() | |
|---|---|---|---|---|---|---|
| 6 | 128 | 24 | 19 | 2,01 | 1,42 | 1,34 |
| 10 | 1033 | 116 | 48 | 1,85 | 1,43 | 1,27 |
| 14 | 6783 | 678 | 174 | 1,77 | 1,47 | 1,31 |
| 20 | 91493 | 9905 | 1318 | 1,69 | 1,50 | 1,34 |
| 28 | 463234 | 202565 | 22055 | 1,53 | 1,49 | 1,36 |
Sullo stato (soluzione ottima di 26 mosse), con un programma che genera i nodi con la tabella dei raggiunti: ampiezza 177 809 nodi (), A∗() 62 570 (), A∗() 6 130 ().
Dominanza. Se per ogni (entrambe ammissibili), domina ed è migliore: A∗ con espande al più i nodi che espande con . Perché A∗ espande ogni nodo con , cioè con : con più grande la condizione è soddisfatta da meno nodi.
Qui perché una tessera fuori posto dista almeno una casella. Un'euristica ammissibile si può ottenere dal costo esatto di un problema rilassato (con meno vincoli): è il costo esatto se ogni tessera può saltare dovunque in una mossa, se può muoversi di una casella anche su una casella occupata. Tra più euristiche ammissibili conviene il massimo (ammissibile e dominante su tutte).
Il pancake sorting del laboratorio e l'euristica del gap
Nel laboratorio 3 (extra), Esercizio - Route finding sulla Romania e pancake sorting con euristica del gap (laboratorio 3), si ordina una pila di frittelle con una spatola che inverte le prime frittelle (stato = tupla delle taglie dall'alto in basso). L'euristica del gap conta le coppie di frittelle vicine con taglie che differiscono per più di 1: sono coppie che andranno separate. Per : coppie no, sì, sì, sì, sì: . A∗ trova una soluzione ottima di 5 inversioni. Ogni inversione cambia al più un'adiacenza, quindi non sovrastima; con una ricerca esaustiva (ampiezza all'indietro dall'obiettivo) risulta ammissibile e consistente per tutte le permutazioni con .
Ricerca locale e problemi di ottimizzazione
In molti problemi il cammino è irrilevante: la soluzione è lo stato obiettivo stesso. Lo spazio degli stati è l'insieme delle configurazioni "complete" e si cerca la configurazione ottima (come nel TSP) o che soddisfa dei vincoli (un orario). Si usano algoritmi di miglioramento iterativo: si tiene un solo stato "corrente" e si prova a migliorarlo.
Gli algoritmi di ricerca locale partono da uno stato e passano a stati vicini, senza tenere traccia dei cammini né degli stati già raggiunti. Usano poca memoria, ma possono non esplorare mai la parte dello spazio in cui sta la soluzione. Esempi:
- TSP: si parte da un giro completo qualsiasi e si fanno scambi a coppie di lati; i metodi locali arrivano entro l'1% dall'ottimo molto in fretta anche con migliaia di città;
- regine: regine su una scacchiera senza due sulla stessa riga, colonna o diagonale; si sposta una regina alla volta per ridurre i conflitti; si risolve quasi istantaneamente anche per molto grandi.
Paesaggio degli stati e hill climbing
Conviene pensare al paesaggio dello spazio degli stati (state space landscape): ogni stato ha un valore (da massimizzare), e ricerca locale significa salire sul paesaggio.
Grafico interattivo: Paesaggio con più massimi locali: da x = 0,5 la salita si ferma in x = 0,74 (valore 1,18); il massimo globale è in x = 8,76 (valore 2,39)
Definizione (hill climbing). L'ascesa del colle (hill climbing, anche greedy local search) parte da uno stato e passa sempre al vicino di valore più alto; si ferma quando nessun vicino è migliore e restituisce lo stato corrente, un massimo locale.
function Hill-Climbing(problem) returns a state that is a local maximum
current <- Make-Node(Initial-State[problem])
loop do
neighbor <- a highest-valued successor of current
if Value[neighbor] <= Value[current] then return State[current]
current <- neighborProblemi: si ferma sui massimi locali (stati migliori di tutti i vicini ma non il migliore in assoluto) e sui plateau (zone piatte: se sono un massimo locale piatto la ricerca non sa dove andare, se sono una spalla si può uscire). Rimedi:
- mosse laterali casuali (sideways moves): permettono di uscire dalle spalle, ma possono girare all'infinito sui massimi piatti, quindi servono con un limite;
- hill climbing con riavvii casuali (random restart): si rilancia da stati iniziali casuali; è banalmente completo, perché prima o poi parte vicino alla soluzione.
Esempio: 8 regine. Stato = una regina per colonna (la riga di ciascuna), valore con = numero di coppie di regine che si attaccano; vicini = muovere una regina dentro la sua colonna ( vicini). Lo stato della slide ha le regine nelle righe (colonne da sinistra, righe dall'alto a partire da 0) e . La slide mostra per ognuno dei vicini: il minimo è , raggiunto da 8 mosse; l'ascesa ne sceglie una. Una configurazione come quella con le regine nelle righe ha (l'unica coppia che si attacca è quella cerchiata nella slide) ma tutti i suoi vicini hanno : è un minimo locale in cui la ricerca si blocca.
I numeri dell'esempio si verificano con questo codice:
import random, math
def h(q): # q[c] = riga della regina nella colonna c; coppie di regine che si attaccano
return sum(q[i] == q[j] or abs(q[i] - q[j]) == j - i
for i in range(8) for j in range(i + 1, 8))
def successori(q): # muovere una regina dentro la sua colonna: 8 * 7 = 56 vicini
return [q[:c] + [r] + q[c + 1:] for c in range(8) for r in range(8) if r != q[c]]
def hill_climbing(q):
passi = 0
while True:
migliore = min(h(n) for n in successori(q))
if migliore >= h(q): # nessun vicino migliore: minimo locale
return q, passi
q = random.choice([n for n in successori(q) if h(n) == migliore])
passi += 1
q = [4, 5, 6, 3, 4, 5, 6, 5] # stato della slide
print(h(q), min(h(n) for n in successori(q)), sum(h(n) == 12 for n in successori(q))) # 17 12 8Da 2000 stati iniziali casuali (random.seed(0)) l'ascesa più ripida arriva a nel 13,8% dei casi, in circa 4,1 passi; nel resto dei casi si blocca. Con i riavvii servono in media lanci, e lo spazio di stati si risolve in un attimo.
Simulated annealing
Idea. Uscire dai massimi locali ammettendo qualche mossa "cattiva", con una dimensione e una frequenza che calano gradualmente. Come l'hill climbing, ma si sceglie un successore casuale e lo si accetta se migliora; se peggiora lo si accetta con una probabilità che decresce con il peggioramento e con una temperatura decrescente.
Con , quindi per una mossa peggiorativa, la probabilità di accettarla è
(Nel pseudocodice delle slide compare con = nuovo meno vecchio: per una mossa peggiorativa darebbe un valore maggiore di 1. Nella formula la è invece il peggioramento preso positivo. Il segno corretto è quello scritto qui sopra.)
function Simulated-Annealing(problem, schedule) returns a solution state
current <- Make-Node(Initial-State[problem])
for t <- 1 to infinity do
T <- schedule[t]
if T = 0 then return current
next <- a randomly selected successor of current
DE <- Value[next] - Value[current]
if DE > 0 then current <- next
else current <- next only with probability e^(DE/T)Come si comporta la probabilità :
| peggioramento | ||||
|---|---|---|---|---|
| 1 | ||||
| 3 |
(Per esempio e .) A temperatura alta quasi ogni mossa è accettata (esplorazione, come una passeggiata casuale); a temperatura bassa solo i miglioramenti (come hill climbing). Se cala abbastanza lentamente, l'algoritmo raggiunge lo stato migliore con probabilità . È usato nel disegno di circuiti VLSI, nella pianificazione di voli, ecc.
Grafico interattivo: Probabilità di accettare una mossa peggiorativa di entità x: con T = 2 passano anche peggioramenti grandi, con T = 0,5 quasi solo quelli piccoli
def simulated_annealing(q, T=2.0, alpha=0.995, Tmin=1e-3):
while T > Tmin:
if h(q) == 0: return q
c, r = random.randrange(8), random.randrange(8)
n = q[:c] + [r] + q[c + 1:]
dE = h(q) - h(n) # valore = -h: dE > 0 se n è migliore
if dE > 0 or random.random() < math.exp(dE / T):
q = n
T *= alpha
return qQui il piano di raffreddamento è (circa 1500 passi fino a ). Su 500 partenze casuali (random.seed(0)) trova una soluzione delle 8 regine nell'81,6% dei casi, contro il 13,8% dell'hill climbing senza riavvii.
Local beam search
Si parte da stati invece di uno e a ogni passo si tengono i migliori successori di tutti. Non equivale a riavvii indipendenti: ogni selezione influenza la successiva, e le ricerche che trovano stati buoni "reclutano" le altre. Problema: spesso tutti i stati finiscono sulla stessa collina. Rimedio: stochastic beam search, che sceglie i successori a caso con probabilità maggiore per i migliori (analogia con la selezione naturale).
Algoritmi genetici
Simili alla stochastic beam search, ma i successori si generano da coppie di stati. Ispirati alla selezione naturale: una popolazione di individui (stati) in cui i più adatti (fitness più alta) producono prole (stati successori) che popola la generazione successiva, con un processo detto ricombinazione. Gli stati devono essere codificati come stringhe. Tre passi:
- selezione: si scelgono i genitori con probabilità proporzionale alla fitness;
- ricombinazione (crossover): si sceglie a caso un punto di taglio, si spezzano le due stringhe genitori e si ricombinano le parti per formare due figli;
- mutazione: si cambia a caso qualche elemento dei figli, con una certa probabilità (tasso di mutazione).
Esempio: 8 regine. Individuo = stringa di 8 cifre (la riga di ogni colonna). Fitness = coppie che non si attaccano ( è il massimo). Popolazione di 4: con fitness ; con ; con ; con . Somma : probabilità di selezione , , , . Crossover tra il secondo e il primo genitore al punto 3: e danno i figli con fitness e con fitness .
Qui i figli non sono migliori del miglior genitore: l'algoritmo funziona perché, su molte generazioni, selezione e ricombinazione combinano blocchi buoni e la mutazione mantiene la diversità. Varianti: strategie evolutive, programmazione genetica.
Ricerca avversaria (oltre le slide)
Le slide del corso non trattano i giochi a due giocatori; si dà qui il minimo di base. In un gioco a somma zero con due giocatori che si alternano, MAX (che vuole il valore più alto) e MIN (il più basso), il valore minimax di un nodo è l'utilità del nodo se è terminale, il massimo dei valori dei figli se tocca a MAX, il minimo se tocca a MIN. La mossa di MAX è quella verso il figlio di valore massimo.
Esempio. Radice MAX con tre figli MIN di foglie , , . I valori dei figli sono , , ; la radice vale : MAX gioca verso il secondo figlio.
Potatura alfa-beta: si tengono (miglior valore garantito a MAX finora) e (il migliore per MIN) e si smette di esplorare un nodo quando non può cambiare la decisione. Nell'esempio: il primo figlio dà , ; il secondo, con le foglie , , , vale , ; nel terzo la prima foglia è , quindi il figlio vale al più e non può battere : le foglie e non si valutano. Il risultato (radice ) è lo stesso con foglie valutate su (verificato con un programma).
Domande d'esame
- Da Arad a Bucarest con : quali città espande A∗ e in quale ordine? Che costo ha la soluzione? Arad (366), Sibiu (393), Rimnicu Vilcea (413), Fagaras (415), Pitesti (417), Bucarest (418). Soluzione Arad, Sibiu, Rimnicu Vilcea, Pitesti, Bucarest, costo 418.
- Per lo stato del puzzle dell'8 delle slide calcolare e . , .
- A∗ genera nodi per una soluzione a profondità : quanto vale ? , .
- Perché un'euristica consistente è ammissibile? Vale il contrario? Si sommano le disuguaglianze lungo il cammino ottimo fino all'obiettivo, dove : . Il contrario non vale in generale.
- Quale valore di rende A∗ pesato uguale al greedy? E al costo uniforme? (cioè ); (cioè ).
- Probabilità di accettare con il simulated annealing una mossa con a e a . e .
- Perché l'hill climbing può non trovare una soluzione e come si rimedia? Si blocca su massimi locali e plateau; si rimedia con riavvii casuali, mosse laterali o simulated annealing.
Versione ripasso
- Funzione euristica : stima del costo da all'obiettivo; la frontiera è una coda con priorità per desiderabilità (Ricerca nello spazio degli stati - formulazione dei problemi e ricerca non informataUn agente risolutore di problemi è un agente basato su obiettivi con rappresentazione atomica: formula un problema (stato iniziale, azioni, modello di transizione, test dell'obiettivo, costo dei passi) e cerca una sequenza di azioni che porta a uno stato obiettivo costruendo un albero di ricerca. Le strategie non informate usano solo la definizione del problema e si distinguono per l'ordine di espansione della frontiera: ampiezza (coda FIFO), costo uniforme (coda con priorità sul costo g), profondità (pila LIFO), profondità limitata, approfondimento iterativo e ricerca bidirezionale. Si confrontano per completezza, ottimalità, tempo e spazio in funzione di b, d, m; tutte sono casi di best-first search con una diversa funzione di valutazione f.Ricerca nello spazio degli stati - formulazione dei problemi e ricerca non informata →). Romania: (distanza in linea retta da Bucarest): Arad 366, Sibiu 253, Fagaras 176, Rimnicu Vilcea 193, Pitesti 100, Timisoara 329, Zerind 374, Oradea 380.
- Greedy best-first: . Arad Bucarest: Arad, Sibiu, Fagaras, Bucarest, costo 450 (4 espansioni, ottimo 418). Completa solo in spazi finiti senza cicli, tempo e spazio , non ottima.
- A∗: ( costo speso, stima restante, stima totale per ). Arad Bucarest: Arad 366; Sibiu ; Rimnicu Vilcea ; Fagaras ; Pitesti ; Bucarest via Fagaras , poi via Pitesti lo sostituisce. Costo 418, 6 espansioni (UCS ne fa 13). Codice:
best_first_search(problem, f=lambda n: g(n) + h(n)). - Ammissibile: , , (non sovrastima). Consistente: (disuguaglianza triangolare); consistente ammissibile (si somma lungo il cammino ottimo, ), non viceversa. è consistente: , .
- Ottimalità di A∗ (ammissibile, albero): , quindi non viene mai scelto. Con consistente non decresce lungo i cammini, A∗ espande in ordine di (contorni che si allungano verso l'obiettivo) e il primo di un nodo è il minimo. Completa (se non ci sono infiniti nodi con ), tempo e spazio , ottima.
- A∗ pesato: , : può perdere l'ottimo ma espande meno nodi. costo uniforme, A∗, greedy. Slide: riduce lo spazio di un fattore 7 con il 5% di costo in più. Puzzle dell'8 (stato , ): dà 26 mosse e 6130 nodi, dà 26 mosse e 1202 nodi, dà 30 mosse e 638 nodi.
- Fattore di diramazione effettivo: ( nodi generati, profondità della soluzione); vicino a 1 è buono. , : .
- Puzzle dell'8: tessere fuori posto, distanza di Manhattan; (): , (tessere 1..8). Dominanza: implica che A∗() espande al più i nodi di A∗() (espande ). Su : BFS 177 809, A∗() 62 570, A∗() 6 130 nodi ( 1,53; 1,46; 1,33). Euristiche da problemi rilassati; tra più ammissibili si prende il massimo. Tabella delle slide: per BFS 128, A∗() 24, A∗() 19 nodi.
- Pancake, euristica del gap: coppie vicine con taglie che differiscono per più di 1; ha , ottimo 5 inversioni; ammissibile e consistente per (Esercizio - Route finding sulla Romania e pancake sorting con euristica del gap (laboratorio 3)).
- Ricerca locale: conta lo stato, non il cammino; un solo stato corrente, poca memoria, ma può non esplorare la soluzione; paesaggio con massimi locali, plateau e spalle. TSP con scambi a coppie, regine spostando una regina per volta.
- Hill climbing: passa al vicino migliore, si ferma in un massimo locale. Rimedi: mosse laterali (con un limite), riavvii casuali (banalmente completo). 8 regine: ha , 56 vicini, minimo in 8 mosse; minimo locale con vicini ; da stati casuali risolve il 13,8% in circa 4,1 passi, quindi circa 7 riavvii.
- Simulated annealing: successore casuale, accettato se migliora, altrimenti con probabilità (); cala con un piano di raffreddamento; con che scende abbastanza piano raggiunge l'ottimo con probabilità . Temperatura alta: esplora; bassa: hill climbing. , , . Sulle 8 regine () risolve l'81,6% dei casi. Il segno nel pseudocodice delle slide va letto così.
- Local beam search: stati, si tengono i migliori successori comuni (le ricerche si "reclutano"); rischio: tutti sulla stessa collina; stochastic beam search sceglie a caso con bias verso i migliori.
- Algoritmi genetici: popolazione di stringhe, selezione con probabilità proporzionale alla fitness, crossover a un punto di taglio, mutazione. 8 regine: fitness ; e al taglio 3 danno figli con fitness 18 e 20.
- Minimax e alfa-beta (oltre le slide): MAX prende il massimo, MIN il minimo; foglie , , danno e radice 5; con la potatura le foglie e non si valutano ( foglie su ).
- Greedy e A∗ a confronto sulla Romania (Arad Bucarest): greedy 4 espansioni, costo 450; A∗ 6 espansioni, costo 418; costo uniforme 13 espansioni, costo 418; con o il cammino torna quello del greedy (450).
- Schemi di codice:
hill_climbing:migliore = min(h(n) for n in successori(q)), semigliore >= h(q)si ferma, altrimenti si sceglie a caso tra i migliori.simulated_annealing:nsuccessore casuale,dE = h(q) - h(n)(valore ), si accetta sedE > 0 or random.random() < math.exp(dE / T), poiT *= alpha(qui , ). - Accettazione nel simulated annealing: peggioramento 1: (), (), (); peggioramento 3: , , . A bassa la probabilità di una mossa cattiva diventa trascurabile.
- Ricerca avversaria: valore minimax di un nodo terminale = utilità, di un nodo MAX = massimo dei figli, di un nodo MIN = minimo dei figli; alfa-beta tiene (miglior valore garantito a MAX) e (a MIN) e taglia quando in un nodo MIN o in un nodo MAX.
- Errori tipici: usare e aspettarsi l'ottimo; dimenticare che A∗ chiede ammissibile (e consistente per la ricerca su grafo); confondere con il fattore di diramazione massimo; scrivere il segno sbagliato nella probabilità del simulated annealing; credere che l'hill climbing sia completo.
Esercizi su questo argomento
- Esercizio - Algoritmi di ricerca in Python con Problem, Node e best-first search (laboratorio 3)
- Esercizio - Confronto degli algoritmi di ricerca con CountCalls, report e grafici (laboratorio 3)
- Esercizio - Euristiche ammissibili (esempio d'esame 2)
- Esercizio - Euristiche dell'8-puzzle e fattore di diramazione effettivo (slide del corso)
- Esercizio - Formulazione delle 8 regine, hill climbing e simulated annealing (slide del corso)
- Esercizio - Ricerca di costo uniforme, greedy e A* sulla mappa della Romania (slide del corso)
- Esercizio - Route finding sulla Romania e pancake sorting con euristica del gap (laboratorio 3)