Politecnico di Milano
Marcello Pogliani
marcello.pogliani - at - gmail - dot - com
∗
Questo documento raccoglie gli appunti da me raccolti durante le lezioni del corso. Non sono stati
rivisti attentamente: possono contenere errori oppure imprecisioni dovute sia alla fretta con la
quale sono stati redatti che alla mia scarsa conoscenza della materia - del resto, sono appunti
scritti durante lo studio. Per quanto mi riguarda, è possibile distribuire, modificare, etc, etc que-
sto documento, purché venga citata la fonte. Spero di non aver violato il copyright di nessuno :)
Nota: Alcuni esempi e figure citati durante le lezioni e qui riportati sono tratti da [3]. In
particolare, alcune figure sono tratte dai file resi disponibili su [2].
†
Il programma completo del corso è disponibile sul sito ufficiale [1]
Indice
1 Introduzione 5
1.1 Concetti fondamentali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Agenti intelligenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2.1 Tipologie di ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.2 Tipologie di agente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.3 Rappresentazione dello stato . . . . . . . . . . . . . . . . . . . . . . . 8
6 Pianificazione 41
6.1 STRIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.2 Pianificazione in avanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.3 Pianificazione all’indietro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.4 Pianificatori nello spazio dei piani . . . . . . . . . . . . . . . . . . . . . . . . . 44
1 Introduzione
azione
a
Agente Ambiente
p
percezione
ed è razionale, dove per razionale si intende fare la cosa giusta con le informazioni
a disposizione. Nel seguito faremo riferimento a quest’ultima definizione: macchine
“intelligenti” sono quelle capaci di agire razionalmente secondo qualche definizione di
razionalità.
Il corso è centrato attorno alla visione di una entità (agente razionale). Un agente è
una macchina che interagisce con un ambiente: è capace di percepire parte dello stato
dell’ambiente con i sensori e di intervenire sull’ambiente tramite i suoi attuatori. In questo
corso, cercheremo di realizzare un agente che sia intelligente, ossia che reagisca razionalmente
nel proprio ambiente.
Discipline che hanno forti relazioni con l’IA sono la filosofia (le macchine possono pensa-
re? cosa vuol dire il pensiero nelle macchine? ...), oltre alla matematica (logica matemati-
ca), psicologia, economia, linguistica (comprensione del linguaggio naturale, ...), scienza del
controllo, informatica.
f : P∗ → A
A B
indica in che stanza si trova l’agente stesso, e l’altro che indica se la stanza è pulita oppure sporca.
Le azioni che può effettuare sono: muoversi a destra (r), muoversi a sinistra (l), aspirare (s), non fare
niente (n). Questo può essere formalizzato come
P∗ A
[A, pulita] r
[A, sporca] s
[B, pulita] l
[B, sporca] s
[A, pulita][A, pulita] r
[A, pulita][A, sporca] s
... ...
Gli agenti a cui verrà fatto riferimento devono essere razionali. Una possibile definizione di
razionalità che può essere applicata in questo contesto è:
Definizione (Razionalità). Per ogni possibile sequenza di percezioni, un agente è detto
razionale se sceglie l’azione che massimizza il valore atteso della misura di performance date
le percezioni fino a quel momento e la conoscenza dell’agente
La misura di prestazioni è definita dal progettista e rappresenta lo scopo dell’agente. In
generale, questa misura va sempre definita sugli stati del mondo, e non sulle azioni dell’a-
gente. Secondo la definizione appena data, dunque, essere razionali non vuol dire né essere
onniscenti (“data la conoscenza dell’agente”) né avere conoscenza del futuro (l’obiettivo è
massimizzare il valore atteso della misura di prestazioni).
Per costruire la funzione agente è necessario conoscere, oltre all’insieme delle percezioni P
(i sensori), e l’insieme delle azioni A (gli attuatori), la misura di performance da adottare
e il tipo di ambiente in cui l’agente si trova ad operare. In alcune applicazioni, l’imsieme
delle percezioni e delle azioni sono dati (ad esempio nel caso di un agente giocatore di
scacchi), mentre altre volte sono da progettare (ad esempio nel caso di un robot utilizzato
per l’esplorazione di Marte).
p(t) p(t)
Agente
Agente
aspetto stato aspetto
corrente corrente
del mondo del mondo
Ambiente come evolve
Ambiente
il mondo
cosa fanno
le azioni
s(t) s(t)
(a) agente reattivo semplice (b) agente reattivo basato su modello
p(t) p(t)
Agente Agente
Ambiente
il mondo il mondo
come cambia come cambia
cosa fanno il mondo se cosa fanno il mondo se
le azioni eseguo a le azioni eseguo a
utilità soddisfazione
azione di essere in s
obiettivi
da eseguire
azione
s(t) s(t)
(c) agente basato su obiettivi (d) agente basato sull’utilità
Secondo questo schema, l’algoritmo che viene utilizzato per risolvere il problema non è scritto
dal progettista, ma viene trovato automaticamente dall’agente. In questo senso, si può
affermare che l’intelligenza artificiale si occupa di meta-algoritmi (algoritmi che generano
altri algoritmi). Ha senso applicare questo approccio quando l’algoritmo per risolvere il
problema non è ovvio. Se non diversamente specificato, si considereranno ambienti statici,
discreti, deterministici, completamente osservabili e noti.
lo stato iniziale È la configurazione iniziale del problema. Ad esempio, nel gioco dell’otto,
è la configurazione iniziale delle tessere nella griglia, come la seguente:
1 5 4
8 2 6
3 7
la funzione azioni È una funzione che prende come argomento uno stato e restituisce un
insieme di azioni possibili applicabili a quello stato:
Azioni(s) = { a1 , a2 , . . . }
10 RISOLUZIONE DEI PROBLEMI TRAMITE RICERCA
Risultato(s, a) = s0
1 5 4
8 2
3 7 6
Spazio degli stati L’insieme di stato iniziale, funzione azioni e funzione risultato
definisce lo spazio degli stati, ossia un grafo i cui nodi corrispondono agli stati e i cui
archi corrispondono alle azioni.
É importante osservare che alla macchina non viene fornita una rappresentazione espli-
cita dell’intero grafo, ma soltanto le regole per costruirlo, ossia lo spazio degli stati
viene fornito implicitamente. La macchina opererà esplorando il grafo: a un certo
punto, verrà generato uno stato che contiene la soluzione cercata. La soluzione al
problema è il cammino che nello spazio degli stati porta dallo stato iniziale a questo
stato, ovvero le mosse che devono essere compiute per raggiungere l’obiettivo a partire
dalla configurazione iniziale. Il problema sta nel riuscire a trovare questo cammino
senza espandere completamente lo spazio degli stati, che può essere molto ampio1 : è
quindi importante avere una rappresentazione implicita dello spazio degli stati.
il test obiettivo Distingue gli stati terminali dagli stati non terminali. Questo test può
essere implementato elencando esplicitamente gli stati finali (questo tipo di implemen-
tazione risulta semplice, ad esempio, nel gioco dell’otto in cui vi è un solo stato finale),
oppure specificando una proprietà che gli stati finali devono soddisfare.
il costo di cammino Si tratta del costo per ogni cammino presente nello spazio degli stati.
In pratica, viene definito come la somma del costo di ogni passo che lo compone.
5 B
5
A
E stato iniziale: A
1 stato finale: E
1
C D
1
Ricerca in ampiezza La strategia di ricerca in ampiezza estrae sempre, tra tutti i nodi
presenti nella frontiera, quello meno profondo. Per la regola con cui sono scelti i nodi, prima
di espandere i nodi di livello n + 1 vengono espansi tutti i nodi di livello n, utilizzando una
coda FIFO per la frontiera.
La strategia di ricerca in ampiezza è completa (se il numero di successori di un nodo è
finito, ossia se il branching factor b è un numero finito) e non è ottima3 . La complessità
temporale, calcolata come numero di nodi generati nel caso di Ricerca-albero è data da
mentre la complessità spaziale (nodi da tenere in memoria nel caso pessimo) è pari alla
complessità temporale (finché non si trova la soluzione, vanno tenuti in memoria tutti i
nodi). Se al posto dell’algoritmo generale si applica il test obiettivo appena viene generato
un nodo (prima di inserirlo nella frontiera), la complessità si riduce a O(bd )
Esempio 2.4: Per lo spazio di stati della figura 2.1, la strategia di ricerca in ampiezza produce il seguente
albero:
A Andamento della frontiera (nodo, profondità):
• (A, 0)
B C • (B, 1) (C, 1)
• (C, 1) (A, 2) (E, 2)
A E A D • (A, 2) (E, 2) (D, 2) (A, 2)
• (E, 2) (D, 2) (A, 2) (B, 3) (C, 3)
B C B C C E • (E, 2) (D, 2) (B, 3) (C, 3) (B, 3) (C, 3)
• (E, 2) (B, 3) (C, 3) (B, 3) (C, 3) (C, 3) (E, 3)
All’ultima iterazione viene considerato il nodo E di profondità 2, il test obiettivo ha successo e l’algorit-
mo termina. Nell’esempio, per risolvere l’ambiguità che si presenta nel caso più nodi abbiano la stessa
profondità, i nodi sono stati estratti in ordine lessicografico. Utilizzando l’algoritmo Ricerca-Grafo
invece di Ricerca-Albero, il nodo A non si sarebbe espanso due volte oltre alla radice.
Costo uniforme La strategia a costo uniforme sceglie dalla frontiera il nodo che ha costo
di cammino più basso. Questa strategia è completa solo se tutti i costi sono strettamente
∗
positivi e ottima. Sia la complessità temporale che quella spaziale è data da O(bdc /εe ), dove
ε è un lower bound positivo sul costo di passo4 .
Ricerca in profondità La ricerca in profondità sceglie dalla frontiera il nodo più lontano
dalla radice (a profondità maggiore). Per la frontiera, questa strategia utilizza una coda
LIFO.
A (continua all’infinito)
B C
A E
A E
B C
...
Figura 2.2: Albero prodotto dalla ricerca in profondità per lo spazio degli stati di figura 2.1
La ricerca in profondità non è completa (diventa completa se i nodi non sono infiniti
utilizzando l’eliminazione degli stati ripetuti, quindi Ricerca-grafo invece che Ricerca-
albero) e non è ottima. In generale, la complessità temporale è O(bm ) (nell’esempio,
m = ∞) e la complessità spaziale è O(b · m) (in generale è necessario mantenere attivo
soltanto il nodo corrente dell’albero, quindi m livelli con b nodi per livello nel caso peggiore).
4 c∗ /ε è il costo della soluzione nel caso peggiore dunque rappresenta la profondità della soluzione
14 RISOLUZIONE DEI PROBLEMI TRAMITE RICERCA
Questa strategia ammette una variante, denominata backtracking, in cui invece di generare
tutti i b successori di un nodo ne viene generato uno alla volta. Il vantaggio è che la sua
complessità spaziale è O(m), non considerando la struttura dati supplementare per tener
traccia del prossimo successore da generare per ogni nodo.
Profondità limitata Questa strategia di ricerca è uguale alla ricerca in profondità, con
la differenza che è definito un limite l per cui, prima di espandere un nodo dopo avere
applicato il test obiettivo, se questo nodo si trova a profondità l non viene espanso. Per
applicare questa strategia è necessario modificare la struttura dati del nodo aggiungendo
l’informazione sulla profondità. La ricerca a profondità limitata è completa se l ≥ d, non è
ottima, ha complessità temporale di O(bl ) e complessità spaziale di O(b · l).
Ricerca greedy Un primo modo per definire la funzione di valutazione è definirla come la
funzione euristica f (n) = h(n), h(n) ≥ 0, che rappresenta una stima del costo per andare
dal nodo n al nodo di goal più vicino. In questo caso la strategia di ricerca è detta greedy
best first. Si noti che, formalmente, la funzione euristica è definita sui nodi. Tuttavia, nei
problemi pratici è più semplice definire la funzione euristica sugli stati: questo significa che
tutti i nodi che corrispondono allo stesso stato hanno lo stesso valore della funzione euristica.
Viene costruito come al solito l’albero di ricerca. Nella frontiera si utilizza un ordinamento
basato sulla funzione f .
Esempio 2.5: Albero generato dallo spazio degli stati della figura 2.3 utilizzando la ricerca greedy best
first.
L’ultimo nodo ad essere espanso è E in quanto ha il valore minore della funzione di valutazione (0). Il
test obiettivo fornisce esito positivo, e l’algoritmo termina restituendo la soluzione A − B − E.
5 come nel caso della ricerca in ampiezza, trova sempre la soluzione più vicina alla radice
STRATEGIE DI RICERCA 15
h(B) = 2
2 B 6
2 2
C D
h(C) = 3 2 h(D) = 2
Figura 2.3: Uno spazio degli stati in cui sono indicati i valori della funzione euristica.
Questa strategia non è completa (si può ciclare all’infinito tra gli stessi stati se le euristiche
sono definite in modo opportuno) e quindi non è nemmeno ottima. È invece completa ma
non ottima utilizzando Ricerca-grafo. La sua complessità è O(bn ) (sia temporale che
spaziale).
Ricerca A* Si può definire un’altra funzione di valutazione come f (n) = g(n) + h(n),
somma del costo del cammino per arrivare al nodo n e della stima del costo per arrivare da
n al nodo di goal (funzione euristica). Questa funzione rappresenta la stima del costo di una
soluzione che passa per n. La strategia di ricerca che utilizza questa funzione è detta A∗ .
Esempio 2.6: Albero generato dallo spazio degli stati della figura 2.3 utilizzando la ricerca A*.
L’ultimo nodo ad essere espanso è E in quanto ha il valore minore della funzione di valutazione (6). Il
test obiettivo fornisce esito positivo, e l’algoritmo termina restituendo la soluzione A − C − D − E di
costo pari a 6.
Con la ricerca A∗ viene scelto quello che globalmente è il nodo più promettente, secondo
la combinazione del costo sostenuto per arrivare a quel nodo più il costo stimato per arrivare
al goal.
Definizione (Euristica ammissibile). Una funzione euristica è ammissibile quando, per ogni
nodo n
h(n) ≤ h∗ (n)
dove h∗ (n) è il costo reale per arrivare da n allo stato obiettivo
Una funzione euristica è ammissibile, dunque, quando non sovrastima mai il costo per
arrivare al goal. Ci sono diverse tecniche per calcolare funzioni euristiche ammissibili, senza
conoscere il valore di h∗ (n) (ad esempio, per problemi geografici, un’euristica ammissibile
per problemi in cui il costo è il calcolo della distanza tra luoghi - con ostacoli - può essere
la distanza in linea d’aria tra due luoghi). Per qualsiasi tipo di problema, un’euristica
16 RISOLUZIONE DEI PROBLEMI TRAMITE RICERCA
sicuramente ammissibile è 0 per tutti gli stati: in questo caso, la ricerca A∗ si riduce alla
ricerca a costo uniforme. In un nodo di goal, h(n) = 0. Si può dimostrare la proprietà
seguente: A∗ è ottimo se viene utilizzato l’algoritmo Ricerca-albero e h è una euristica
ammissibile.
Idea della dimostrazione: Siano n e G2 due nodi della frontiera, tali che G2 sia un nodo
di goal subottimo e n un nodo che sta sul percorso ottimo per arrivare al goal (nota: questo
nodo esiste sempre se nella frontiera è presente un nodo di goal subottimo). f (G2 ) =
g(G2 ) > c∗ essendo G2 un nodo di goal subottimo, ed essendo c∗ è il costo del cammino
ottimo. f (n) = g(n) + h(n) ≤ c∗ essendo g(n) + h(n) una funzione che non sovrastima il
costo ottimo per arrivare al goal. Allora
Questo significa che non verrà mai scelto dall’algoritmo di ricerca A∗ un nodo di goal
subottimo.
Definizione (Euristica consistente). Una funzione euristica è consistente quando per ogni
coppia di nodi n e n0 tali che n0 sia successore di n,
pertanto
f (n0 ) ≥ f (n)
per qualsiasi coppia n, n0 t.c. n0 successore di n. Se l’euristica è consistente, la funzione di
valutazione del successore non è mai più piccola della funzione di valutazione del padre: la
funzione di valutazione in un path dell’albero di ricerca è sempre non decrescente. Inoltre, si
può dimostrare che se l’euristica è consistente, A∗ espande i nodi in ordine non decrescente di
f (n). Questo implica che tutte le volte che viene espanso un nodo, si è trovato un cammino
ottimo fino allo stato corrispondente a quel nodo. In particolare, la prima volta che viene
espanso un nodo di goal, si è trovato un cammino ottimo per quel nodo.
Sul funzionamento di A∗ si può dimostrare che l’algoritmo espande
• tutti i nodi con f (n) < c∗
• qualche nodo con f (n) = c∗
• nessun nodo con f (n) > c∗
Si dice che A∗ è ottimamente efficiente: a parità di euristica, non esiste alcun altro algo-
ritmo che espanda meno nodi di A∗ e che garantisca di trovare la soluzione ottima. Sia la
∗
complessità temporale che quella spaziale di A∗ ha la forma O((h −h)×l ). Esistono delle
versioni che utilizzano un quantitativo di memoria limitato (fissato) a spese della complessità
temporale.
3 Ricerca con avversari
Il problema della ricerca con avversari si riscontra tipicamente in giochi come la dama o gli
scacchi. È l’unica tipologia di ambiente multiagente (in particolare, si tratta di un ambiente
in cui operano due soli agenti) che verrà considerato. In questo contesto non è più definito il
concetto di soluzione del problema di ricerca, che viene sostituito dal concetto di strategia:
una strategia indica che cosa il giocatore deve fare rispetto a tutte le possibili azioni che può
compiere l’avversario.
È possibile classificare i giochi, caso tipico della ricerca con avversari, secondo vari aspetti:
• una prima classificazione distingue in giochi deterministici (che quindi non coinvolgono
elementi come il lancio di dadi, carte da estrarre, . . . ) e giochi con casualità.
• una funzione Giocatore(s) che, dato uno stato s, restituisce un valore tra min e max,
corrispondente al giocatore che deve effettuare una mossa in s.
• una funzione Azioni(s) che restituisce l’insieme di mosse legali nello stato s
• il test di terminazione che, dato uno stato, indica se è uno stato finale del gioco. Il
test di terminazione sostituisce quello che nella formulazione del problema di ricerca
era il test obiettivo. A differenza di come era stato definito il test obiettivo (che non
impedisce di effettuare ulteriori azioni), se viene soddisfatto il test di terminazione non
è possibile effettuare ulteriori azioni
• una funzione Utilità(s, p) che ha come parametri uno stato terminale s e uno dei
due giocatori p, e indica qual è l’utilità del giocatore p per lo stato s. Un esempio di
funzione utilità potrebbe ritornare +1 per il giocatore che vince, −1 per il giocatore
che perde, 0 in caso di pareggi).
18 RICERCA CON AVVERSARI
Questa formalizzazione definisce implicitamente lo spazio degli stati, che è necessario esplo-
rare con l’artificio dell’albero di ricerca, detto in questo contesto albero di gioco. Ad esempio,
nella figura 3.1 è rappresentata una porzione dell’albero di gioco per il tris. Si può notare,
come prima differenza con i problemi di ricerca classici definiti nelle sezioni precedenti, che
per poter definire una formalizzazione di un gioco è necessario entrare più profondamente
nella struttura dello stato: non è quindi in generale sufficiente avere degli stati identificati
semplicemente da una lettera.
Definizione (Gioco a somma zero). Un gioco si definisce a somma zero se la somma delle
utilità dei giocatori è pari a 0 per ogni stato terminale.
Considerando soltanto giochi a somma zero, si può definire soltanto un valore della fun-
zione utilità (che quindi non dipende dal giocatore), corrispondente all’utilità di max, e
assumere che il giocatore max vuole massimizzare l’utilità, mentre min vuole minimizzarla.
Per questo motivo, nell’esempio di figura 3.1 è rappresentata soltanto l’utilità di max.
• il valore minimax di un nodo terminale è pari alla sua utilità per max
• il valore minimax di un nodo min è il più piccolo tra i valori minimax dei suoi figli
• il valore minimax di un nodo max è il più grande tra i valori minimax dei suoi figli
Se non è stato ancora generato l’albero di gioco, invece, è possibile calcolare il valore minimax
direttamente durante la visita (o la costruzione) dell’albero in profondità. La figura 3.2
rappresenta un albero per un gioco fittizio, in cui si è indicato per ogni nodo il valore
minimax. Per convenzione, in figura sono rappresentati i nodi corrispondenti a stati in cui
deve giocare max (nodi max) con un triangolo la cui punta è rivolta verso l’alto, mentre i
nodi min sono rappresentati da triangoli con la punta rivolta verso il basso. I nodi terminali
sono rappresentati da un quadrato.
nodo max
3
valore minimax
3 2 2
3 12 8 2 4 6 11 5 2
3 ≤2 2
3 12 8 2 11 5 2
Figura 3.3: Albero ottenuto con potatura alfa-beta relativo al gioco di figura 3.2
L’entità della potatura (il numero di nodi che non vengono generati) dipende dall’ordine
di valutazione dei nodi. Si può dimostrare che, se il numero di nodi generato da minimax
quando esplora tutto l’albero di gioco è O(bm ) dove b è il branching factor (il massimo
numero di successori di un nodo) e m è la profondità dell’albero, nel caso migliore, ossia
con l’ordinamento dei nodi migliore possibile, la potatura alfa-beta permette di avere una
complessità di O(bm/2 ).
function Vmin(stato, α, β)
if TestTerminale(stato) then
return Utilita(stato)
end if
v ← +∞
for all Successori(stato) as s do
v ← min(v, Vmax(s, α, β))
if v ≤ α then
return v
end if
β ← min(β, v)
end for
return v
end function
in cui nell’albero di gioco è presenta un nodo max in cui c’è una scelta che porta ad avere
un certo valore α di utilità. A un certo punto, un’altra scelta per max porta a un altro
nodo max. Se il valore di un nodo min figlio di quest’ultimo nodo è minore o uguale a un
certo valore v, con v ≤ α, si possono evitare di generare i nodi sotto questo nodo min (si
può effettuare un taglio alfa). Lo stesso ragionamento può essere fatto dal punto di vista di
min (taglio beta): si può tagliare quando c’è un’opzione che è sicuramente più grande del
suo valore β.
...
α ...
... valore ≤ v ≤ α
posso tagliare
...
• per un nodo min, è pari al minimo dei valori expectiminimax dei suoi figli
• per un un nodo di casualità è il valore atteso dei valori expectiminimax dei suoi figli
La figura 3.5 presenta un esempio di albero di gioco e di calcolo dei valori expectimi-
nimax. Nell’esempio sono presenti dei nodi di casualità, rappresentati con dei cerchi, che
corrispondono ai momenti del gioco in cui interviene l’elemento della casualità (in questo
caso, il lancio di una moneta). In questo gioco, max sceglie una mossa, poi viene lanciata
una moneta, min effettua una mossa e il gioco finisce.
È possibile applicare l’algoritmo di potatura alfa-beta visto nel paragrafo precedente anche
nel caso di giochi con casualità. L’algoritmo di potatura alfa-beta, nel modo in cui è stato
presentato, assume che i valori che può assumere la funzione di utilità non siano noti: si
aspetta che i prossimi valori della funzione di utilità possano essere qualsiasi. In realtà, è
22 RICERCA CON AVVERSARI
5.5
5.5 4
3 8 2 6
5 3 12 8 2 4 6 11
spesso possibile fornire dei limiti superiori e inferiori sui possibili valori della funzione di
utilità, ad esempio è possibile supporre che i valori della funzione di utilità per il gioco
di figura 3.5 siano compresi nell’intervallo [−2, +2]. A fronte di queste considerazioni, si
possono migliorare le prestazioni dell’algoritmo.
Nota Essendo la funzione di valutazione una stima della funzione di utilità, possono sor-
gere problemi quando viene utilizzata la tecnica del taglio e dell’utilizzo della funzione di
valutazione con l’algoritmo expectiminimax. Perché l’approccio minimax dia una soluzione
ottima, è necessario che i valori alle foglie dell’albero siano i più precisi possibili: non è suf-
ficiente che mantengano l’ordinamento delle preferenze nelle situazioni per max, ma devono
mantenerne anche la scala, altrimenti la scelta della mossa migliore viene modificata.
4 Problemi di soddisfacimento di vincoli
• un insieme di variabili x1 , x2 , . . . , xn
Northern
Territory
Queensland
Western
Australia
South
Australia New
South
Wales
Victoria
Tasmania
Se tutti i vincoli di un CSP sono binari, se ne può tracciare il grafo dei vincoli, ossia un
grafo i cui nodi rappresentano le variabili e i cui archi rappresentano i vincoli tra le variabili:
due nodi sono collegati da un arco se le variabili che rappresentano sono legate tra loro da
un vincolo. Qualsiasi CSP che coinvolga vincoli che non sono binari può essere ricondotto a
un CSP equivalente che ha solo vincoli binari.
NT Q NSW
WA V
SA
Esempio 4.2 (problema delle otto regine): Il problema delle otto regine può essere formalizzato come
un problema di soddisfacimento di vincoli in vari modi. Una prima formulazione è la seguente:
• si definiscono 64 variabili xij , 1 ≤ i, j ≤ 8, una per ogni casella
• Dij = 0, 1 (ogni variabile vale 1 se la casella contiene una regina, 0 altrimenti)
• vincoli:
– xij = 1 =⇒ xik = 0 1 ≤ k ≤ 8, k 6= j
– xij = 1 =⇒ xkj = 0 1 ≤ k ≤ 8, k 6= i
P8−k
– i=1
xi,i+k ≤ 1 0≤k<8
P8−k
– i=1
xi+k,i ≤ 1 1≤k<8
P8−k
– i=1
xi,8+1−(i+k) ≤ 1 0≤k<8
P8−k
– xi+k,8+1−i ≤ 1 1≤k<8
Pi=1
– i≤i,j≤8
xi,j = 8
Poiché su ogni colonna ci deve essere una e una sola regina, è possibile derivare un’altra formulazione,
più compatta, del problema come CSP:
• variabili: xj 1 ≤ j ≤ 8 (colonne)
• domini: Dj = 1, 2, . . . , 8 (riga su cui sta la regina per la colonna considerata)
• vincoli:
– xj = k =⇒ xi 6= k 1 ≤ i ≤ 8, i 6= j
– xj = k =⇒ |k − xj | 6= |j − i| 1 ≤ i ≤ 8, i 6= j
In questa seconda formulazione non è necessario formalizzare il vincolo per cui devono esserci otto regine,
in quanto viene garantito dal fatto che si cerca un assegnamento completo.
Altri esempi di problemi formalizzabili come CSP sono i problemi di assegnamento (e.g.
assegnamento di task a esecutori), di scheduling (programmare le partenze di attività lungo
l’asse temporale). Nel caso di un problema di scheduling conviene avere come variabili gli
istanti di inizio delle attività, e come vincoli i vincoli di precedenza. Ad esempio, il vincolo
x2 > x1 formalizza che l’istante di inizio dell’attività 2 deve iniziare dopo l’inizio dell’attività
1, mentre, se T è la durata dell’attività 1, x2 > x1 +T formalizza che l’attività 2 deve iniziare
dopo la fine dell’attività 1.
CSP COME PROBLEMI DI RICERCA 25
{}
WA = r WA = g ... T =G
W A = r, N T = g W A = r, N T = b . . .
...
Figura 4.3: Porzione di albero generato dalla ricerca in profondità per il problema dell’esempio 4.1
4.2 Euristiche
Pur non influenzando la possibilità di trovare o meno una soluzione, cambiando l’ordine con
cui le variabili vengono assegnate, può variare l’efficienza della ricerca. Ad esempio, nel pro-
blema della colorazione della carta geografica dell’Australia, per aumentare l’efficienza della
soluzione lo stato SA, coinvolto nel maggior numero di vincoli, dovrebbe essere assegnato
all’inizio. Un altro aspetto critico, oltre all’ordinamento delle variabili, risiede nella scelta
di un ordinamento dei valori del dominio da assegnare alle variabili.
1 la consistenza è assicurata da come è definita la funzione Azioni
26 PROBLEMI DI SODDISFACIMENTO DI VINCOLI
{}
WA = r WA = g WA = b
W A = r, N T = g W A = r, N T = b ... ...
W A = r, N T = g, SA = b . . . ...
...
Figura 4.4: Porzione di albero generato per l’esempio 4.1 sfruttando la commutatività
{} {}
WA = b SA = b
W A = b, N T = g SA = b, N T = g
W A = b, N T = g, SA = r SA = b, N T = g, N SW = r
Figura 4.5: Porzione di albero di ricerca ricavato utilizzando MRV e l’euristica di grado
L’euristica MRV aumenta l’efficienza della ricerca poiché permette di individuare i fal-
limenti il prima possibile, scegliendo - se esiste - per prima una variabile che ha dominio
vuoto. Tuttavia, MRV non permette di dire alcunché sulla prima variabile a cui assegnare il
valore: inizialmente, se i domini hanno tutti la stessa cardinalità, tutte le variabili hanno lo
stesso numero di valori legali rimasti nel proprio dominio. Per rimediare a questo problema,
si può usare l’euristica di grado, che sceglie la variabile che è coinvolta nel maggior numero di
vincoli con altre variabili non ancora assegnate. Applicando l’euristica di grado all’esempio
4.1, si ottiene quanto rappresentato in figura 4.5(b), dove sono riportati solo i primi passi. A
differenza di MRV, l’euristica di grado cerca di assegnare per prime le variabili più critiche,
dove per variabili più critiche si intendono quelle coinvolte nel maggior numero di vincoli.
PROPAGAZIONE DEI VINCOLI 27
Nell’esempio riportato, infatti, viene assegnato per primo un valore alla variabile SA. Se
tutte le variabili non sono assegnate, il numero di vincoli coinvolti in una variabile è il grado
del nodo nel grafo dei vincoli, da cui il nome di euristica di grado. È stato dimostrato che si
può ottenere una soluzione migliore combinando sia MRV che l’euristica di grado: di base si
utilizza MRV, ricorrendo all’euristica di grado quando MRV non è in grado di determinare
una variabile (fornisce una parità tra più variabili).
{}
WA = r
W A = r, N T = g ...
W A = r, N T = g, Q =??? . . .
...
Al terzo passo ci sono due valori possibili da assegnare alla variabile Q, b e r. Scegliendo b la vaiabile
SA avrebbe 0 valori legali rimasti, mentre scegliendo r la variabile SA avrebbe 1 valore legale rimasto.
L’euristica del valore meno vincolante sceglie questa seconda possibilità, ponendo Q=r.
L’idea di questa euristica è favorire il più possibile il trovare una soluzione, poiché bisogna
selezionare il valore da assegnare a una variabile il cui nodo è già stato generato. Questa
considerazione è opposta a quella che viene fatta nella scelta della variabile: quando bisogna
scegliere una variabile da assegnare, poiché si deve generare un nodo, se ci sono elementi per
determinare che un ramo è già destinato al fallimento, conviene scoprirlo subito (euristica
MRV).
che sono inconsistenti con il valore di x. L’informazione che è contenuta nei vincoli viene
propagata nei domini delle variabili, in un processo parallelo alla costruzione dell’albero di
ricerca. La tecnica della verifica in avanti si applica molto spesso come supporto all’euristica
MRV, per aggiornare ad ogni iterazione i domini delle variabili.
Esempio 4.4 (rif. esempio 4.1): Nella tabella sottostante sono rappresentati, per ogni assegnamento
che viene effettuato nell’esplorazione di parte di un ramo dell’albero di ricerca, i domini delle variabili
per come vengono modificati dalla verifica in avanti. I valori in grassetto sono le variabili già assegnate.
WA NT Q NSW SA V T
{r, g, b} {r, g, b} {r, g, b} {r, g, b} {r, g, b} {r, g, b} {r, g, b}
r {g, b} {r, g, b} {r, g, b} {g, b} {r, g, b} {r, g, b}
r {b} g {r, b} {b} {r, g, b} {r, g, b}
r {b} g {r} {} b {r, g, b}
(a) domini
{}
WA = r
W A = r, Q = g
W A = r, Q = g, V = b
...
(b) albero
A questo punto della costruzione dell’albero, il dominio della variabile SA è vuoto: questo significa che
questo ramo è destinato al fallimento. Utilizzando l’euristica MRV, SA sarebbe la prossima variabile
da generare. Applicando questa tecnica, si è scoperto che il dominio di SA è vuoto appena dopo avere
assegnato il valore b allo stato V, e non quando si è cercato di generare il successore (come nell’euristica
MRV). In realtà, ci si poteva accorgere che il ramo è destinato al fallimento già dopo l’assegnamento
Q=g: NT e SA non possono contemporaneamente essere blu, unico valore consentito, ma questo tipo
di inconsistenza non viene rilevato dalla verifica in avanti.
Consistenza d’arco Un’euristica migliore per la propagazione dei vincoli è data dalla con-
sistenza d’arco. In particolare, in questo paragrafo viene descritto l’algoritmo AC-3. Questo
algoritmo controlla il grafo dei vincoli e considera ogni lato come bidirezionale2 .
Definizione (Arco consistente). Si dice che un arco x → y è consistente quando, per ogni
valore del dominio di x esiste qualche valore consistente nel dominio di y.
• Per ogni arco x → y presente in coda, si verifica la consistenza con gli altri archi
• Quando viene aggiornato il dominio di una variabile x per rendere consistente un arco,
è necessario rimettere in coda tutti gli archi della forma z → x, perché potrebbero non
essere più consistenti a seguito della variazione del dominio di x
2 ad esempio, il lato tra SA e NSW viene scomposto in due archi SA → NSW e NSW → SA
PROPAGAZIONE DEI VINCOLI 29
La consistenza d’arco può essere applicata sia come pre-processing prima di iniziare la ricerca,
per semplificare i domini (e quindi avere un minore branching factor per l’albero), che
applicandola tutte le volte che viene assegnato un valore a una variabile.
Ci sono tecniche più potenti della consistenza d’arco per semplificare il problema di ricerca:
la consistenza d’arco (2-consistenza) verifica solo la consistenza tra coppie di variabili; altre
tecniche come la 3-consistenza verificano la consistenza tra triple di variabili, e cosı̀ via
generalizzando, al costo di aumentarne la complessità: verificare la n-consistenza di un
problema con n variabili equivale a risolvere il problema di ricerca.
Esistono problemi, anche non banali, che possono essere completamente risolti senza
costruire l’albero ed effettuare la ricerca, ma semplicemente applicando tecniche come la
consistenza d’arco e le sue generalizzazioni.
5 Agenti basati sulla conoscenza
Come per tutte le tipologie di agente analizzate finora, anche gli agenti basati sulla conoscen-
za risolvono problemi costruendo un albero di ricerca, terminando quando viene generato un
nodo che corrisponde a uno stato finale nello spazio degli stati. Quello che li differenzia dalle
altre tipologie di agente è il contenuto dei singoli nodi. A differenza delle rappresentazioni
atomiche tipiche degli algoritmi di ricerca informata e non informata, e delle rappresenta-
zioni di tipo fattorizzato tipiche dei problemi di soddisfacimento di vincoli, gli agenti basati
sulla conoscenza utilizzano infatti una rappresentazione dello stato del mondo strutturata.
In particolare, lo stato è rappresentato attraverso una KB (knowledge base), che contiene
della conoscenza (informazione espressa formalmente).
Nel caso che verrà considerato, le informazioni presenti nella knowledge base sono espresse
attraverso il linguaggio formale della logica (logica proposizionale oppure logica del primo
ordine). Una KB contiene un insieme di formule in and logico tra di loro. Dal punto di vista
dell’implementazione, servono due meccanismi per poter operare su una KB di questo tipo:
• un meccanismo per asserire fatti, ossia aggiungere formule alla base di conoscenza
• una procedura di interrogazione, con la quale si può chiedere se una formula α è con-
seguenza logica delle formule presenti (KB |= α), ossia se α è vero in tutti i modelli
che rendono vere le formule della KB.
Procedure di inferenza
Si dice che KB `i α quando a partire dalla KB si riesce a derivare α (meccanicamente,
ovvero guardando solo la sintassi e non la semantica) applicando la procedura di inferenza i.
Rispetto alla relazione tra l’inferenza e il concetto di conseguenza logica, si possono definire
le proprietà di completezza e correttezza.
KB |= α =⇒ KB `i α
Definizione (Correttezza). Una procedura di inferenza i si dice corretta (sound) se, quando
deriva una formula α, allora α è conseguenza logica della KB:
KB `i α =⇒ KB |= α
Naturalmente, una procedura di inferenza “ideale” deve essere corretta e completa. In ogni
caso, è importante garantire la correttezza rispetto alla completezza.
Il vantaggio di utilizzare formule logiche per rappresentare lo stato sta nel poter utilizzare
un insieme piccole di formule per la rappresentazione di uno stato del mondo, senza avere la
necessità di esplicitarne tutte le conseguenze. Queste conseguenze possono essere derivate
all’occorrenza, direttamente dall’agente, attraverso una procedura di inferenza. Per questo
motivo gli agenti basati sulla conoscenza possono lavorare anche in ambienti parzialmen-
te osservabili: dagli assiomi e dalla parte del mondo osservabile l’agente può dedurre la
struttura delle parti dell’ambiente non direttamente osservabili.
32 AGENTI BASATI SULLA CONOSCENZA
Nota Quando l’agente applica una procedura di inferenza per derivare nuova conoscenza,
lo sta facendo in un singolo stato del mondo (che è rappresentato da una singola KB), per
derivare proprietà di quello stato implicitamente contenute nella KB.
Proprietà Per le sole KB contenenti solo formule definite, la procedura di inferenza della
concatenazione in avanti è corretta e completa.
KB `?BC Q
Questa formula, a differenza del caso della concatenazione in avanti, va indicata esplicita-
mente, in quanto la procedura di inferenza parte dall’obiettivo (la query) e cerca di risalire
alle premesse, di di dimostrare se è conseguenza delle formule presenti nella KB.
La struttura dati che viene utilizzata è detta stack degli obiettivi. Inizialmente, lo stack
contiene l’obiettivo finale Q che si vuole dimostrare. Ogni volta che l’algoritmo estrae da
questa struttura dati un obiettivo, controlla se è presente come fatto nella base di conoscenza.
Se Q non è presente, cerca di applicare “al contrario” una regola presente nella KB, ossia
cerca una regola di cui Q è implicazione.
Ad esempio, riprendendo la base di conoscenza dell’esempio 5.1 e considerando come
obiettivo Q, l’algoritmo trova la regola
P =⇒ Q (1)
A ∧ P =⇒ P
A ∧ B =⇒ P
Questo significa che, per dimostrare vero L bisogna dimostrare vero A ∧ P oppure A ∧ B. In
questo caso, vengono inseriti tutti nello stack degli obiettivi. Si procede quindi considerando
M . Si trova la regola B∧L =⇒ M , che vengono aggiunti alla struttura dati. Si estrae quindi
A che è presente nella KB come fatto, e quindi viene aggiunto nella struttura dati dimostrati.
Si estrae P : questo obiettivo non è dimostrabile, perché è proprio quello che si sta cercando
di dimostrare, quindi viene eliminato dallo stack degli obiettivi, e la strada di dimostrare
A e P per dimostrare L fallisce. A questo punto si considera A, che è già dimostrato. Si
estrae B, che risulta presente nella KB come fatto, e quindi anch’esso dimostrato. Avendo
dimostrato A e B, si è dimostrato anche L, che quindi viene aggiunto ai dimostrati. Si
estraggono B e L dallo stack degli obiettivi, entrambi già dimostrati: a questo punto si può
dimostrare M , P , Q e l’algoritmo termina. Il funzionamento dell’algoritmo nel complesso
può essere rappresentato dall’albero and-or di figura 5.1.
A differenza della concatenazione in avanti, che è guidata dai dati in quanto procede
dai fatti presenti nella KB, la concatenazione all’indietro è guidata dagli obiettivi. Si può
dimostrare che anche la concatenazione all’indietro è corretta e completa per KB composte
da clausole definite.
L M
A P A B B L
A ∨ ¬B B ∨ ¬C ∨ ¬D
Una base di conoscenza che contiene qualsiasi formula della logica proposizionale è esprimi-
bile in forma normale congiuntiva: il fatto che la risoluzione sia applicabile soltanto a KB in
questa forma, pertanto, non è limitante. Rispetto alla definizione data in precedenza, si può
notare che una clausola definita è una clausola che contiene esattamente un singolo letterale
positivo. Si definisce invece clausola di Horn una clausola che contiene al più un letterale
positivo.
La procedura di inferenza detta “risoluzione” applica ripetutamente la regola di inferenza
della risoluzione:
`1 ∨ · · · ∨ `i ∨ · · · ∨ `k , m1 ∨ · · · ∨ mj ∨ · · · ∨ mn
R
`1 ∨ · · · ∨ `i−1 ∨ `i+1 ∨ · · · ∨ `k ∨ m1 ∨ · · · ∨ mj−1 ∨ mj+1 ∨ · · · ∨ mn
dove li e mi sono letterali, e li e mj sono letterali complementari, ossia sono lo stesso simbolo
proposizionale, l’uno negato e l’altro no. La risoluzione parte da due clausole e deriva una
nuova clausola che contiene tutti i letterali di partenza tranne i due complementari.
Esempio 5.2:
A ∨ ¬B B ∨ ¬C ∨ ¬D
R
A ∨ ¬C ∨ ¬D
Anche per la risoluzione è necessario fornire l’obiettivo, ossia la formula α che si vuole
dimostrare3 :
KB `?R α
La risoluzione funziona per refutazione: si chiede se, aggiungendo alla base di conoscenza la
negazione della formula che si vuole dimostrare, si giunge a un assurdo (la clausola vuota
⊥):
KB ∪ {¬α} `?R ⊥
Si può dimostrare che la procedura di inferenza della risoluzione è corretta e completa per
la logica proposizionale.
2 all’interno della KB le singole formule, quindi le clausole, sono in congiunzione tra loro
3a differenza delle procedure di inferenza citate precedentemente, con la risoluzione l’obiettivo non è un
singolo simbolo proposizionale ma è una generica formula
PROCEDURE DI INFERENZA PER LA LOGICA DEL PRIMO ORDINE 35
Nota Per poter applicare la risoluzione, è necessario che ¬α (la negazione della formula da
dimostrare) sia in forma normale congiuntiva.
Esempio 5.3: Data la seguente KB
1. ¬B ∨ A
2. B
si vuole trovare se KB `?R A. Questo equivale a chiedere se KB ∪ {¬A} `?R ⊥. A quest’ultima
formulazione si può applicare la risoluzione. Ad esempio, da ¬B ∨ A e B si genera per risoluzione la
formula A. Applicando la risoluzione alle due clausole unitarie ¬A e A, che sono complementari, si
ottiene la clausola vuota ⊥.
• Risoluzione con insieme di supporto. Questa strategia impone che ogni passo della
risoluzione coinvolga almeno una clausola da quello che si è definito come insieme di
supporto. Le clausole risolventi vengono a loro volta aggiunte all’insieme di supporto.
La criticità di questa strategia risiede nella scelta dell’insieme: una scelta errata può
rendere l’algoritmo incompleto
• Risoluzione di input. in ogni passaggio della risoluzione combina una formula di input
con un’altra formula. Tranne che in casi specifici, questa strategia non è in generale
completa.
Unify(α, β) = θ
tale che
αθ = βθ
dove una sostituzione {variabile/termineground} sostituisce (sintatticamente) le occorrenze
della variabile con il termine ground specificato.
α β θ
Knows(John, α) Knows(John, Jane) {x/Jane}
Knows(John, x) Knows(y, M other(y)) {y/John, x/M other(John)}
Knows(John, x) Knows(x, OJ) le formule non possono essere unificate
Knows(John, x) Knows(y, x) {y/John}
La tabella 5.1 riporta alcuni esempi di unificatori. Nell’ultima riga, l’unificatore riportato
non è l’unico, ma è l’unificatore più generale (MGU, most general unifier). Altri unificatori
- che non sono i più generali - si possono trovare legando x a una costante. In generale,
è possibile determinare algoritmicamente l’unificatore più generale per due formule della
logica del primo ordine.
36 AGENTI BASATI SULLA CONOSCENZA
p1 0 , p2 0 , . . . , pn 0 , (p1 ∧ p2 ∧ . . . ∧ pn ⇒ q)
MP
qθ
dove p01 , p02 , . . . , p0n , p1 , . . . , pn , q sono formule atomiche della logica del primo ordine (predi-
cati singoli) e rispetto alla sostituzione θ:
∀i pi 0 θ = p i θ
θ = {x/John, y/John}
per cui si può applicare il Modus Ponens, ottenendo - applicando alla formula risultante la sostituzione
θ:
4. Evil(John)
Esempio 5.5 (dal linguaggio naturale alla logica): Dato il seguente testo
La legge dice che è un crimine per un americano vendere armi alle nazioni ostili. La nazione
di Nono, un nemico dell’America, possiede dei missili, e tutti i suoi missili sono stati venduti
dal colonnello West, che è un americano. Il colonnello West è un criminale?
una KB che rappresenta la situazione è:
1. American(x) ∧ Weapon(y) ∧ Hostile(z) ∧ Sells(x, y, z) =⇒ Criminal(x)
2. Missile(M)
3. Owns(Nono, M)
4. Missile(x) ∧ Owns(Nono, x) =⇒ Sells(West, x, Nono)
5. Missile(x) =⇒ Weapon(x)
6. Enemy(x, America) =⇒ Hostile(x)
7. Enemy(Nono, America)
PROCEDURE DI INFERENZA PER LA LOGICA DEL PRIMO ORDINE 37
8. American(West)
dove la (2) e la (3) rappresentano la formula
(∃x)(M issile(x) ∧ Owns(N ono, x))
che non può essere inserita direttamente nella KB perché x è quantificata esistenzialmente. Per inserirla
nella KB, la variabile viene sostituita da un nuovo simbolo di costante, M (questo è un caso particolare
del procedimento di Skolemizzazione spiegato in seguito).
La domanda “Il colonnello West è un criminale?” si traduce - volendo utilizzare la concatenazione in
avanti (forward checking, FC), nel chiedersi se
?
KB `F C α
dove α = Criminal(West). Applicando la concatenazione in avanti, si ottiene la situazione rappresentata
dall’albero di figura 5.2, che viene costruito a partire dalle foglie, ossia dai fatti della base di conoscenza.
Criminal(West)
5.2.3 Risoluzione
Come nel caso proposizionale, la risoluzione si applica a una KB che contiene solamente delle
formule in CNF (tutte le formule della logica del primo ordine sono esprimibili in CNF). I
passi per portare una formula generica in CNF sono una generalizzazione della procedura
utilizzata per la logca proposizionale.
Esempio 5.6: La frase “chiunque ami tutti gli animali è amato da qualcuno” può essere espressa in
logica del primo ordine come
∀x[(∀y Animal(y) =⇒ Loves(x, y)) =⇒ (∃y Loves(y, x))]
38 AGENTI BASATI SULLA CONOSCENZA
¬∀xα ≡ ∃x¬α
oppure
¬∃xα ≡ ∀x¬α
Nell’esempio:
∀x[(∃y¬(¬Animal(y) ∨ Loves(x, y))) ∨ (∃yLoves(y, x))]
da cui applicando la legge di De Morgan si ottiene
• Standardizzazione delle variabili: ogni quantificatore deve quantificare su una variabile diversa.
Nell’esempio, la formula contiene due quantificatori che operano su due variabili che hanno lo
stesso nome (y), quindi si cambia nome a una delle due variabili:
• Eliminazione dei ∀
che è formula di partenza in forma CNF, ed è una congiunzione di disgiunzioni composta da due
clausole.
4 non è sufficiente sostituirle con costanti, altrimenti si stravolgerebbe il significato della formula di partenza
PROCEDURE DI INFERENZA PER LA LOGICA DEL PRIMO ORDINE 39
6.1 STRIPS
Uno stato è formato da una congiunzione di formule della logica del primo ordine. Le formule
che costituiscono uno stato devono essere letterali positivi, senza funzioni, e ground (senza
variabili). Le formule di uno stato sono implicitamente in and tra loro.
Esempio 6.1 (Mondo dei blocchi): In questo esempio, c’è un tavolo su cui sono posati dei blocchi (A,
B e C). Un robot li può afferrare e spostare. Un possibile stato di questo mondo è il seguente:
A B
Uno schema d’azioni è costituito da due liste di formule. La lista P, detta lista delle precon-
dizioni, che contiene un insieme di formule della logica del primo ordine analoghe a quelle
utilizzate per la rappresentazione dello stato (letterali positivi ground privi di funzioni). La
lista delle precondizioni indica ciò che deve essere vero in uno stato per poter eseguire l’a-
zione. La lista E, detta lista degli effetti, contiene letterali positivi oppure negativi. È a sua
volta costituita dalla lista delle aggiunte (add list), che comprende i letterali positivi e indica
quali fatti devono essere veri successivamente all’applicazione dell’azione, e dalla delete list,
composta dai letterali negativi, che indica i fatti che erano veri prima di applicare l’azione
e non sono più veri in seguito. Come per la rappresentazione dello stato, precondizioni ed
effetti si intendono in and logico tra loro.
Un’azione si ottiene istanziando uno schema di azione, ossia assegnando dei valori alle
variabili. A partire dallo stato dell’esempio 6.1, un’azione che può essere eseguita è
UnStack(C, A)
In generale, un’azione A è applicabile in uno stato S quando tutte le precondizioni di A
compaiono nella descrizione di S. Il risultato dell’applicazione di un’azione a uno stato è un
nuovo stato ottenuto
• copiando la descrizione del vecchio stato nel nuovo
• aggiungendo alla descrizione gli elementi della lista delle aggiunte dell’azione applicata
• cancellando gli elementi presenti nella lista delle cancellazioni
PickUp(x)
P: HANDEMPTY, BLOCK(x), CLEAR(x),
ON(x, TABLE)
E: ¬HANDEMPTY, ¬CLEAR(x), HOLDING(x),
¬ON(x, TABLE)
PullDown(x)
P: HOLDING(x)
E: ON(x, TABLE), ¬HOLDING(x), CLEAR(x),
HANDEMPTY
funzione azioni le azioni applicabili in uno stato s sono tutte le istanze degli schemi di
azione applicabili a partire dallo stato s. Un’azione è applicabile a uno stato quando
tutte le precondizioni sono presenti nella descrizione dello stato
test obiettivo verifica se nell’insieme di formule che descrivono uno stato sono presenti le
formule che descrivono il goal
costo di passo può essere definito in vari modi, con un costo unitario oppure tenendo conto
di vari aspetti rilevanti per il dominio applicativo (ad esempio, sollevare un blocco
costa di più che abbassarlo)
Definito il problema in questo modo, si può impiegare una qualsiasi delle strategie di ricerca,
informata o non informata, per risolvere il problema di pianificazione. Il problema di questo
approccio è che i problemi reali sono di grandi dimensioni, e risultano intrattabili con questo
approccio: in un dominio di dimensione realistica il branching factor è troppo elevato per
essere gestito.
Definizione (Azione rilevante). Si dice che un’azione A è rilevante per un goal G se tra gli
effetti positivi dell’azione A compare un letterale di G.
Ad esempio, nel mondo dei blocchi, Stack(B,A) è rilevante e consistente per l’obiettivo
soddisfa
g s
regressione si applica a
R[g, a] soddisfa
s0
un ambiente reale, che non è né statico né deterministico, una delle tecniche utilizzate è la
pianificazione (replanning): dopo avere eseguito ogni azione del piano, l’agente percepisce
l’ambiente per controllare se l’azione è andata a buon fine. Se non è andata a buon fine,
viene eseguita una ripianificazione.
Bibliografia
[3] S. Russell and P. Norvig. Artificial Intelligence: A Modern Approach. Pearson – Prentice
Hall, third edition, 2010.
[4] S. Russell and P. Norvig. Intelligenza Artificiale: Un approccio moderno, volume 1.
Pearson Italia, third edition, 2010.