Intelligenza Artificiale

Slides:



Advertisements
Presentazioni simili
Algoritmi e Strutture Dati
Advertisements

Strutture dati per insiemi disgiunti
Ricorrenze Il metodo di sostituzione Il metodo iterativo
INFORMATICA Algoritmi fondamentali
Informatica Generale Alessandra Di Pierro
Grafi Algoritmi e Strutture Dati. Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati 2/ed 2 Copyright © The McGraw.
Algoritmi e Strutture Dati
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Intelligenza Artificiale Simbolica
Cammini minimi con una sorgente
RB-alberi (Red-Black trees)
Breath-first search Visita in ampiezza di un grafo Algoritmo Esempio
Strutture dati elementari
Alberi binari di ricerca
Breath-first search Visita in ampiezza di un grafo Algoritmo Esempio
Cammini minimi con sorgente singola
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Sistemi basati su conoscenza Metodi di ricerca informata Prof. M.T. PAZIENZA a.a
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Intelligenza Artificiale 1 Gestione della conoscenza lezione 5 Prof. M.T. PAZIENZA a.a
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Esercizi su alberi binari
Informatica di base A.A. 2003/2004 Algoritmi e programmi
1 Capitolo 2: Semplificazione, Ottimizzazione e Implicazione.
1 Esempi di consistenza sui limiti Non consistente sui limiti, considera Z=2, poi X-3Y=10 Ma il dominio qui sotto e consistente sui limiti: Confrontare.
Algoritmo di Ford-Fulkerson
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 9 Il problema della gestione di insiemi disgiunti (Union-find) Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
Algoritmi e Strutture Dati
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Problemi e algoritmi Anno Accademico 2009/2010.
Algoritmi e Strutture Dati (Mod. A)
Trovare il percorso minimo da b ad ogni altro vertice
Algoritmi e strutture dati
Algoritmi e Strutture Dati
Ingegneria della conoscenza e sistemi esperti Dario Bianchi, 1999 Risoluzione di problemi e ricerca.
Intelligenza Artificiale Risoluzione di Problemi
Algoritmi e Programmazione (in C) Stefano Cagnoni e Monica Mordonini
Anche la RB-Delete ha due fasi: Nella prima viene tolto un nodo y avente uno dei sottoalberi vuoto sostituendolo con la radice dellaltro sottoalbero. Per.
Elementi di Informatica di base
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
Strutture dati per insiemi disgiunti
Radix-Sort(A,d) // A[i] = cd...c2c1
Lezioni di Ricerca Operativa Corso di Laurea in Informatica
Passo 3: calcolo del costo minimo
Algoritmi e Strutture Dati
Grafi Rappresentazione mediante liste di adiacenza:
Cammini minimi da un sorgente
Sessione live Testing. Esercizio Quesito 1 Soluzione 1.
Implementazione di dizionari Problema del dizionario dinamico Scegliere una struttura dati in cui memorizzare dei record con un campo key e alcuni altri.
Ricerca euristica Maria Simi a.a. 2008/2009 Ricerca euristica  La ricerca esaustiva non è praticabile in problemi di complessità esponenziale  Noi.
Sistemi basati su conoscenza Metodi di ricerca informata Prof. M.T. PAZIENZA a.a
Sistemi basati su conoscenza Metodi di ricerca informata Prof. M.T. PAZIENZA a.a
Dipartimento di Ingegneria dell’Informazione Università degli Studi di Parma Intelligenza Artificiale Risoluzione dei Problemi (parte 2) Agostino Poggi.
Intelligenza Artificiale Risoluzione di Problemi
Dipartimento di Ingegneria dell’Informazione Università degli Studi di Parma Intelligenza Artificiale Risoluzione dei Problemi Agostino Poggi Stefano Cagnoni.
Master Bioinformatica 2002: Visite di Grafi Algoritmi di visita Scopo: visitare tutti i vertici di un grafo per scoprirne proprietà di vario tipo. Alcune.
Algoritmi e Programmazione (in C) Stefano Cagnoni e Monica Mordonini
Algoritmi golosi Tecniche di soluzione dei problemi viste finora:
Complessità Computazionale
Ricerca euristica Maria Simi a.a. 2013/2014 Ricerca euristica  La ricerca esaustiva non è praticabile in problemi di complessità esponenziale  Noi.
Transcript della presentazione:

Intelligenza Artificiale Risoluzione dei Problemi (parte 3) Agostino Poggi Stefano Cagnoni

L’Algoritmo A* L’algoritmo 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. L’algoritmo 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ò, l’algoritmo A* somma le due funzioni di valutazione: f(n) = g(n) + h(n).

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

L’Algoritmo A* Si può dimostrare che l’algoritmo A* è ottimo. Sia OG un goal a costo minimo f* e sia SG un goal con costo fg* > 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)  fg* e quindi segue che: f*  fg*

L’Algoritmo A* L’algoritmo A* è completo: questo algoritmo espande nodi nell’ordine dato dai rispettivi valori di f. Quindi se un goal ha valore f*, l’algoritmo A* è completo se non ci sono infiniti nodi con f < f*. Anche se l’algoritmo A* è l’algoritmo 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 l’errore 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))

Scelta dell’Euristica 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 320 = 3.5 x 109 nodi. Il numero di nodi visitati si può limitare eliminando i nodi già visitati, dato che gli stati possibili sono 9! = 362880. 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.

Scelta dell’Euristica Due euristiche candidate per l’8-puzzle sono: h1 = numero di quadrati fuori posizione. h2 = Manhattan distance = somma delle distanze dei quadrati dalla loro posizione finale. Da risultati sperimentali si ricava che h2 è migliore. Questo è ovvio dato che: Entrambe le euristiche non sovrastimano il costo per raggiungere il goal, cioè sono ammissibili. Per ogni configurazione h2  h1 Quindi h2 è una stima migliore del costo per raggiungere il goal. Dato che i quadrati non si possono muovere in diagonale, la distanza corrisponde alla Manhattan distance.

Scelta dell’Euristica Ecco un confronto dei costi di IDS e A* con h1 e h2 (numero medio di nodi espansi in 100 esperimenti):

Scelta dell’Euristica Come si può scegliere una euristica? Può un programma compiere questa scelta in modo automatico ? Le due euristiche esaminate per l’8-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 Pr, 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 h2(n) = 14 allora al 90% la reale distanza è 18. allora uso 18. Nel 1993 è stato realizzato un programma Absolver cheha trovato una nuova euristica per l’8-puzzle migliore di quelle conosciute e una prima euristica utile per il famoso Cubo di Rubik L’uso di informazioni statistiche può non garantire l’assiminilità dell’euristica.

A* Iterativo in Profondità (Iterative Deepening A* - IDA*) L’algoritmo 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.

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 dell’8-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: 1 + 2 + ... + N = O(N2)

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 all’algoritmo IDA*? L’algoritmo non è ottimo perché può ritornare una soluzione che può essere peggiore di quella ottima, ma al massimo di .

A* Iterativo in Profondità - IDA* Possiamo definire l’algoritmo 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; }

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;

SMA* (Simplified Memory-Bounded A*) L’algoritmo IDA* non ha memoria e quindi non può evitare il problema degli stati ripetuti. E’ possibile modificare l’algoritmo per evitare ripetizioni all’interno dello stesso percorso, ma non in percorsi differenti. L’algoritmo SMA* supera questo problema e può lavorare con una quantità di memoria limitata. L’algoritmo 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.

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. L’algoritmo 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 l’albero di ricerca.

SMA* Se la memoria è sufficiente l’algoritmo 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.

SMA* A 0+12=12 B G 10+5=15 8+5=13 D C 20+0=20 I 20+5=25 H 24+0=24 10+8=18 E F K 30+5=35 30+0=30 24+5=29 24+0=24 J

SMA* 12 A 12 15 A B A A 13 13(15) B G G 15 13 13 A H 15 18  B 15 (15) 4 13 13(15) B G G 15 13 13 A H 15 18  B 15 (15) 24() A I G 24 G 15 24() A A 6 15(24) 15(24) B B 15 20 () C D 25  20 5 7 8

SMA* Possiamo definire l’algoritmo 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); }

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 n’s successors have been generated’ (n è il padre di s) ‘update n’s f and those of its ancestors if necessary’ if ‘all n’s successors are in memory’ Remove(n, queue); if ‘memory is full’ { ‘delete the shallowest highest-f-cost node from queue’ ‘remove it from its parent’s successor list ‘insert its parent on queue if necessary’ }