La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Dipartimento di Ingegneria dellInformazione Università degli Studi di Parma Intelligenza Artificiale Risoluzione dei Problemi (parte 3) Agostino Poggi.

Presentazioni simili


Presentazione sul tema: "Dipartimento di Ingegneria dellInformazione Università degli Studi di Parma Intelligenza Artificiale Risoluzione dei Problemi (parte 3) Agostino Poggi."— Transcript della presentazione:

1 Dipartimento di Ingegneria dellInformazione Università degli Studi di Parma Intelligenza Artificiale Risoluzione dei Problemi (parte 3) Agostino Poggi Stefano Cagnoni

2 Risoluzione dei Problemi 2 LAlgoritmo A* Lalgoritmo lungo il cammino più vicino al goal (Greedy Search) minimizza il costo, h(n), per raggiungere il goal e spesso permette di ridurre considerevolmente il costo della ricerca, ma non è completo e neppure ottimo. Lalgoritmo di ricerca a costo uniforme minimizza il costo, g(n), del percorso ed è completo e ottimo, ma può essere molto inefficiente. Combinando i due metodi si ottiene un algoritmo, detto A*, che offre i vantaggi di entrambi. Per fare ciò, lalgoritmo A* somma le due funzioni di valutazione: f(n) = g(n) + h(n).

3 Risoluzione dei Problemi 3 Lalgoritmo A* Possiamo definire un lalgoritmo A* come: function A*-Search(problem, Enqueue-by-g+h) { return General-Search(problem, Enqueue-by-g+h); } Si può provare che lalgoritmo A* è ottimo e completo se h è una euristica ammissibile, cioè se non sovrastima mai il costo per raggiungere il goal. Lalgoritmo A* è ottimamente efficiente (optimally efficient) per ogni funzione euristica, cioè non esiste alcun altro algoritmo ottimo che espande un numero di nodi minore dellalgoritmo A*.

4 Risoluzione dei Problemi 4 LAlgoritmo A* Si può dimostrare che lalgoritmo A* è ottimo. Sia OG un goal a costo minimo f* e sia SG un goal con costo f g * > f*. Supponiamo che A* abbia scelto SG e dimostriamo che ciò non è possibile. Sia n un nodo sul percorso ottimo verso OG. Poiché la funzione h è ammissibile, allora risulta: f* f(n) Ma, se è stato scelto SG, f(n) f g * e quindi segue che: f* f g *

5 Risoluzione dei Problemi 5 LAlgoritmo A* Lalgoritmo A* è completo: questo algoritmo espande nodi nellordine dato dai rispettivi valori di f. Quindi se un goal ha valore f*, lalgoritmo A* è completo se non ci sono infiniti nodi con f < f*. Anche se lalgoritmo A* è lalgoritmo di ricerca ottimo che espande il minor numero di nodi, in molti casi la complessità è esponenziale in funzione della lunghezza della soluzione. Si è provato che il numero di nodi espansi cresce esponenzialmente a meno che lerrore della stima h del vero costo h* non cresca più lentamente del logaritmo del costo reale del percorso. Cioè |h(n) - h*(n)| <= O(log h*(n))

6 Risoluzione dei Problemi 6 Scelta dellEuristica Consideriamo un problema molto semplice come 8-puzzle. Una soluzione tipica ha 20 mosse. Dato che il fattore di ramificazione è circa 3, allora una ricerca in profondità esaustiva visiterebbe 3 20 = 3.5 x 10 9 nodi. Il numero di nodi visitati si può limitare eliminando i nodi già visitati, dato che gli stati possibili sono 9! = Tuttavia, sono valori eccessivi per poter risolvere il problema in modo esaustivo. Occorre quindi cercare di limitare la lunghezza della ricerca con delle buone euristiche.

7 Risoluzione dei Problemi 7 Scelta dellEuristica Due euristiche candidate per l8-puzzle sono: h 1 = numero di quadrati fuori posizione. h 2 = Manhattan distance = somma delle distanze dei quadrati dalla loro posizione finale. Da risultati sperimentali si ricava che h 2 è migliore. Questo è ovvio dato che: Entrambe le euristiche non sovrastimano il costo per raggiungere il goal, cioè sono ammissibili. Per ogni configurazione h 2 h 1 Quindi h 2 è una stima migliore del costo per raggiungere il goal.

8 Risoluzione dei Problemi 8 Scelta dellEuristica Ecco un confronto dei costi di IDS e A* con h 1 e h 2 (numero medio di nodi espansi in 100 esperimenti):

9 Risoluzione dei Problemi 9 Scelta dellEuristica Come si può scegliere una euristica? Può un programma compiere questa scelta in modo automatico ? Le due euristiche esaminate per l8-puzzle sono le funzioni di valutazione esatte della distanza dal goal per due versioni semplificate del problema. Quindi si può dire che le soluzioni di un problema P r, ottenuto rilassando le regole di un problema P, sono delle buone euristiche per P. Un altro modo per generare delle buone euristiche è usare delle informazioni statistiche. Ad esempio se so che se h 2 (n) = 14 allora al 90% la reale distanza è 18. allora uso 18.

10 Risoluzione dei Problemi 10 A* Iterativo in Profondità (Iterative Deepening A* - IDA*) Lalgoritmo A* nei casi peggiori richiede molta memoria. Si può usare la tecnica della ricerca iterativa in profondità per limitare la memoria necessaria. In questo caso il limite non è la profondità del nodo, ma il costo f: ad ogni ciclo vengono espansi solo i nodi con costo minore del limite e viene aggiornato il limite per il prossimo ciclo al minimo valore f dei nuovi nodi generati. Come A* è completo ed ottimo e dato che si basa su una ricerca in profondità ha una complessità spaziale di bd.

11 Risoluzione dei Problemi 11 A* Iterativo in Profondità - IDA* La complessità temporale dipende dal numero di valori che la funzione euristica può assumere dato che questo numero determina il numero di iterazioni. In alcuni casi, ad esempio la Manhattan distance per il problema dell8-puzzle, la funzione euristica assume pochi valori. In altri casi, ad esempio, la distanza euclidea per il problema del commesso viaggiatore, la funzione euristica assume molti valori con limite massimo il numero di nodi N: N = O(N 2 )

12 Risoluzione dei Problemi 12 A* Iterativo in Profondità - IDA* Un modo per superare questo limite è incrementare il limite di costo di rendendo il numero di cicli proporzionale a 1/. Questo algoritmo è detto -ammissibile. Che problemi può avere rispetto allalgoritmo IDA*? Lalgoritmo non è ottimo perché può ritornare una soluzione che può essere peggiore di quella ottima, ma al massimo di.

13 Risoluzione dei Problemi 13 A* Iterativo in Profondità - IDA* Possiamo definire lalgoritmo IDA* come segue: function IDA*(problem) { root = Make-Node(Initial-State(problem)); f-limit = f-Cost(root) while true { solution, f-limit = DFS-Contour(root, f-limit); if solution return solution; if (f-limit = = ) return failure; }

14 Risoluzione dei Problemi 14 A* Iterativo in Profondità - IDA* Dove la funzione DFS-Contour è definita come segue: function DFS-Contour(problem, node, f-limit) { next-f = ; if (f-Cost(node) > f-limit) return null, f-limit; if Goal(State(node), problem) return node, f-limit; for each son in Expand(node, problem) { solution, new-f = DFS-Contour(son, f-limit); if solution return solution, f-limit; next-f = Min(next-f, new-f); } return null, next-f; }

15 Risoluzione dei Problemi 15 SMA* (Simplified Memory - Bounded A*) Lalgoritmo IDA* non ha memoria e quindi non può evitare il problema degli stati ripetuti. E possibile modificare lalgoritmo per evitare ripetizioni allinterno dello stesso percorso, ma non in percorsi differenti. Lalgoritmo SMA* supera questo problema e può lavorare con una quantità di memoria limitata. Lalgoritmo opera in modo simile a A*, tuttavia quando non cè più memoria a disposizione: Rilascia la memoria del nodo meno promettente. Memorizza nel nodo padre il costo del percorso migliore che partiva dal nodo rimosso.

16 Risoluzione dei Problemi 16 SMA* I nodi rimossi sono rigenerati solo nel caso in cui tutti i percorsi attivi assumano un valore peggiore del valore di un percorso rimosso. Lalgoritmo SMA* ha le seguenti proprietà: Utilizza la memoria a disposizione. Evita di rigenerare nodi nei limiti della memoria a disposizione. È completo se la memoria è sufficiente a contenere il percorso che comprende la soluzione. È ottimo se la memoria è sufficiente a contenere il percorso della soluzione, altrimenti ritorna la migliore soluzione che può raggiungere con la memoria a disposizione. È ottimamente efficiente se può memorizzare tutto lalbero di ricerca.

17 Risoluzione dei Problemi 17 SMA* Se la memoria è sufficiente lalgoritmo SMA* risolve dei problemi più difficili di quelli risolti da A*. Tuttavia, con problemi molto difficili, risolvibili da A* se avesse a disposizione una memoria illimitata, la necessità di ripetere più volte la generazione di nodi rende il problema intrattabile dal punto di vista temporale.

18 Risoluzione dei Problemi 18 SMA* 0+12= = = = =24 8+5= = = = =35 A K B G I J E F D C H 10+8=18

19 Risoluzione dei Problemi 19 SMA* 12 A 13(15) A H G A B G 15 (15) 24( ) A I G A B 24( ) G A B 15(24) 15 A B C 25 15(24) 20 ( ) A B D

20 Risoluzione dei Problemi 20 SMA* Possiamo definire lalgoritmo SMA* come segue: function SMA*(problem) { queue = Make-Queue(Make-Node(Initial-State(problem))); while true { if Empty(queue) return failure; n = Remove-Front(queue); if Goal(State(n), problem) return n s = Next-Successor(n); manage s Enqueue-by-f(s, queue); }

21 Risoluzione dei Problemi 21 SMA* Il codice che gestisce s ha la forma: if s is not a goal and is at maximum depth f(s) = ; else f(s) = Max(g(s) + h(s), f(n)); if all ns successors have been generated (n è il padre di s) update ns f and those of its ancestors if necessary if all ns successors are in memory Remove(n, queue); if memory is full { delete the shallowest highest-f-cost node from queue remove it from its parents successor list insert its parent on queue if necessary }


Scaricare ppt "Dipartimento di Ingegneria dellInformazione Università degli Studi di Parma Intelligenza Artificiale Risoluzione dei Problemi (parte 3) Agostino Poggi."

Presentazioni simili


Annunci Google