Iterative deepening depth-first search: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m sposto navbox in fondo |
Aggiunta fonte, ristrutturata la voce, aggiunto dettagli e algoritmo |
||
Riga 1:
{{F|programmazione|febbraio 2013}}
'''Iterative deepening depth-first search''' o '''IDDFS''' è una strategia di
È una strategia di ricerca particolarmente efficace, poichè ad ogni iterazione, visita i nodi nell'[[albero di ricerca]] nello stesso ordine di una [[ricerca depth-first]], ma in questo caso l'ordine cumulativo nel quale i nodi sono visitati per primi (assumendo l'assenza di [[pruning]]) è effettivamente una [[ricerca in ampiezza]].
La ricerca iterative deepening depth-first combina l'efficienza in spazio della [[ricerca depth-first]] e la completezza della [[ricerca breadth-first]] (quando il [[branching factor]] è finito). La ricerca è ottimale quando il costo del percorso è una funzione non-decrescente (monotona) della profondità del nodo.▼
== Valutazione della strategia ==
La [[complessità in spazio]] dell'IDDFS è ''O(bd)'', dove <math>b</math> è il branching factor. L'iterative deepening visita più volte lo stesso stato e ciò potrebbe sembrare dispendioso, ma in fin dei conti non lo è tanto, in quanto in un albero la maggior parte dei nodi sono nel livello più basso, quindi non preoccupa molto il fatto che i livelli superiori siano visitati più volte.▼
=== Ottimalità e completezza ===
▲La ricerca iterative deepening depth-first combina l'efficienza in spazio della [[ricerca depth-first]] e la completezza della [[Ricerca in ampiezza|ricerca breadth-first]] (quando il [[branching factor]] è finito).
=== Complessità spaziale e temporale ===
{{vedi anche|Teoria della complessità computazionale}}
▲La
Il maggior vantaggio in questo algoritmo nella ricerca su alberi è che le prime ricerche tendono a migliorare le euristiche maggiormente utilizzate, come la [[euristica killer]] e la [[potatura alfa-beta]], e quindi si ha una stima più accurata del peso dei vari nodi alla fine della ricerca in profondità, e il completamento della ricerca avviene più velocemente in quanto effettuata in un ordine migliore.
Infatti la
In una ricerca iterative deepening i nodi posti in basso sono espansi una volta, quelli successivi all'ultimo livello sono espansi due volte, e così via, sino alla radice dell'albero di ricerca, che è espanso d + 1 volte. Così il numero totale di espansioni in una ricerca iterative deepening è
Riga 22 ⟶ 29:
Maggiore è il [[branching factor]], minore è l'overhead dell'espansione iterata degli stati intermedi, ma anche quando il branching factor è 2, l'iterative deepening spende solo il doppio in tempo rispetto ad una ricerca breadth-first completa. Ciò significa che la complessità in tempo dell'iterative deepening è circa <math>O(b^{d})</math>, e la complessità in spazio è <math>O(bd)</math>. In generale, l'iterative deepening è la ricerca preferita quando c'è un vasto spazio di ricerca e la profondità della soluzione non è nota a priori.
== Algoritmo ==
Questo algoritmo (in pseudocodice) è una possibile implementazione della strategia di iterive deepening: sfrutta l'algoritmo di [[Depth-limited search |ricerca in profondità limitata]] incrementando a ogni iterazione la profondità massima a cui cercare.
'''''IterativeDeepening'''''(''root'', ''goal''){
'''for'''(profondità = 1; root != goal; i++) '''''=> :''''' root = ''DLS''(root, goal, profondità)
}
'''''DepthLimitedSearch'''''(''nodo'', ''goal'', ''profondità''){
'''if'''(profondità >= 0):
|'''if'''(nodo ''=='' goal) '''''=> :''''' ''return''(nodo)
|'''foreach'''(child '''in''' ''visita''(nodo)) '''''=> :''''' ''DepthLimitedSearch''(child, goal, profondità-1)
}
== Note ==
{{reflist}}
{{Algoritmi ricerca grafi}}
|