È una variante della consistenza locale
Si usa per algoritmi di backtracking con ordine fisso di valutazione delle variabili
Arc consistency=ogni valutazione consistente di una variabile si può estendere ad un'altra
Directional arc consistency=ogni valutazione consistente di una variabile si può estendere a una variabile che segue nell'ordine
Si valutano le variabili nell'ordine x1,...,xn
Si verifica se xi è arc consistent con xj se:
Uso la rappresentazione con valori come nodi
Ogni valore di x1 si può estendere a x2
Non è vero il contrario: x2=1 non si ha un valore corrispondente per x1
Lo stesso per x2 e x3
Il problema non è arc-consistent
Ma è direzionalmente arc-consistent
Le verifiche che non vengono fatte potrebbero semplificare il problema
Vediamo però che queste semplificazioni sarebbero comunque inutili, se si usa backtracking con variabili valutate in ordine x1,...,xn
I valori di xi che non hanno un corrispondente in xj non fanno parte di nessuna soluzione
Quando backtracking considera xi, le assegna tutti i valori possibili
Assegnare valori che non fanno parte di nessuna soluzione fa solo perdere tempo
Se i<j, si controlla se ogni valore di xi ha un valore corrispondente di xj
I valori che non hanno un corrispondente si eliminano
Se non lo si fa: l'inconsistenza si scopre solo quando si va a valutare xj
Si potrebbe produrre un albero di ricerca molto grande, specialmente se xj viene valutato molto dopo
Se il valore xi=a viene eliminato subito, il sottoalbero non viene visitato
Qui i<j
Se j<i allora xj è già stata valutata quando si assegnano valori a xi
Se j < i, non si verifica se tutti i valori di xi hanno un valore corrispondente nel dominio di xj
Motivi:
Cosa succede, se j<i e non è stato fatto il controllo di consistenza di xi con xj
Esempio: xi=a non ha un valore corrispondente per xj
Quando si arriva a valutare xi:
Se nessun valore del dominio di xj è consistente con xi=a, non lo è nemmeno il particolare valore che è stato scelto in precedenza
Il vincolo fra xi e xj risulta immediatamente violato
Non si fanno visite di sottoalberi
Se si fa la verifica, potrebbe risultare inutile
Esempio: xi=a è consistente solo con il valore xj=b
Quindi, a non viene eliminato dal dominio di xi
Se il valore scelto per xj non è b ma c, si ottiene comunque l'inconsistenza:
Rivediamo la consistenza direzionale sull'esempio di prima
Le variabili vengono valutate nell'ordine x1,...,xn
Ogni valore di x1 si può estendere a x2
Questo implica che posso scegliere un valore qualsiasi per x1, sapendo che si può estendere a x2
Lo stesso per le altre variabili (il vincolo fra x1 ed x2 è stato omesso nel disegno)
x2=1 non ha un valore corrispondente in x1
Non importa: una volta scelto un valore qualsiasi per x1, quando si valuta x2=1, si ottiene subito inconsistenza comunque
Si parte dall'ultima variabile
Si ottiene la consistenza locale di tutte le precedenti con l'ultima
Si ottiene la consistenza locale delle precedenti con la penultima
Lo stesso per la terz'ultima, ecc.
Questo problema (nessun vincolo fra x1 ed x3) non è direzionalmente arc-consistent
Infatti, ci sono valori di x1 che non hanno un corrispondente in x2, e valori di x2 che non hanno un corrispondente per x3
Tolgo i valori della penultima variabile che non hanno un valore per l'ultima:
Solo i valori della terz'ultima con la penultima:
(tutti i valori della terz'ultima siano consistenti con tutti quelli dell'ultima, altrimenti bisognava fare anche questa verifica)
Notare che prima x1=3 andava bene prima, ora non più
Si eliminano ora i valori di x1 che non hanno un valore di x2
Nel caso non direzionale:
Dopo aver forzato la consistenza di x rispetto ad y, si potrebbe dover ripetere perchè il dominio di y è stato modificato
Con l'algoritmo di prima e con la consistenza direzionale, non succede
Per definizione, l'ultima variabile non deve essere arc
consistent con nessuna
(sono le altre che devono essere consistenti con lei)
Quindi, nessun valore viene tolto dal dominio dell'ultima variabile
Dopo aver forzato la consistenza di xi con l'ultima variabile, non c'è bisogno di guardare di nuovo questa coppia, perchè il dominio dell'ultima variabile non verrà modificato
La penultima variabile deve essere consistente solo con l'ultima
Dopo aver forzato questa consistenza, non si può perdere la consistenza perchè il dominio dell'ultima variabile non cambia
Quindi, ora il dominio della penultima variabile è quello finale (non verrà più modificato)
Dopo che la consistenza della terz'ultima con la penultima è stata forzata, non si può più perdere
Infatti ora il dominio della penultima e dell'ultima non cambiano più
Lo stesso vale per le altre variabili: quando si arriva a considerare una variabile, la consistenza con tutte quelle successive è stata già stabilita, per cui il suo dominio non può più cambiare
Verifico se i valori di una coppia xi e xj si possono estendere a xz solo se i,j < z
Stesso principio: inutile verificare la consistenza con una variabile che ha già un valore
Se non è vero che i,j < z, quando verranno valutate xi e xj, si verificherà se i loro valori sono consistenti con quello di xz
La propagazione per path consistency può eliminare coppie di valori dal vincolo fra xi e xj
Questo è utile: con questi valori di xi e xj, si ottiene l'inconsistenza senza dover valutare xz
Ma questo è un vantaggio solo se xz non ha ancora un valore specificato (altrimenti, si dimostra l'inconsistenza comunque)
Finora ne abbiamo visti due (ne esiste un terzo):
La seconda cosa non si può sempre fare, anche se il problema è insoddisfacibile
Si può fare per casi particolari
Consideriamo il caso di vincoli binari
Si usa un ordinamento dei nodi
Nel grafo primale, è l'ordinamento di valutazione delle variabili
I genitori di un nodo sono quei nodi che:
La larghezza di un nodo è il numero dei suoi genitori
La larghezza di un grafo è la massima larghezza dei suoi nodi
La larghezza del grafo primale indica quante possono essere le variabili valutate che stanno in un vincolo con la prossima variabile da valutare
Il nodo ha larghezza 2=la variabile è in vincoli con due che la precedono
Supponiamo che ogni valutazione di due variabili si estende a una terza successiva
Allora, ogni valutazione si estende a un'altra variabile, datao che solo due sono in effetti in vincoli con quest'altra variabile
La condizione che garantisce che un problema che è directionally arc consistent è anche consistente (se non ci sono domini vuoti) è:
Sulla base dell'ordinamento della directional arc consistency, il grafo primale risulta avere larghezza 1
Motivo: se il grafo ha larghezza 1:
Quindi, si può partire da un valore per la prima variabile e ogni volta trovare un valore per un'altra variabile
Un grafo ha larghezza 1 secondo un ordinamento se e solo se è un albero
Idea: ogni nodo ha al più un genitore, ma può avere più figli
D'altra parte, gli alberi hanno in genere larghezza 1 secondo un ordinamento ma non secondo tutti gli ordinamenti
L'ordinamento della directional arc consistency va scelto in modo tale che la larghezza del grafo risulti 1
Quindi, non basta che il grafo primale sia un albero: deve essere un albero "secondo l'ordinamento"
La condizione equivalente per directional path consistency è:
Ogni nodo ha al massimo due genitori
In questo caso, ogni valore dei due genitori si può estendere al nodo, se il problema è direzionalmente path consistent
Questa condizione equivale a: il grafo ha larghezza 2 secondo l'ordinamento scelto
Se un problema non è direzionalmente arc consistent o non è direzionalmente path consistent, si fa propagazione
Per arc consistency, propagazione non modifica il grafo
Quindi, si ottiene un problema che è direzionalmente arc consistent e che ha lo stesso grafo primale
Per path consistency, propagazione modifica il grafo
Possono venire creati nuovi vincoli
Dato un grafo e un ordinamento, il grafo indotto dall'ordinamento è fatto in questo modo:
I nodi maggiori nell'ordine sono messi più in alto:
Si parte dal nodo più in alto, che è a, e si collegano i suoi genitori, che sono b e c
Ora si guarda il secondo nodo più in alto, che è b, e si collegano i suoi genitori, che sono c e d:
Notare che c è diventato un genitore di b a causa dell'arco creato prima
Gli archi creati vanno considerati nel seguito
Il nodo c ha un solo genitore (d), e quindi non si creano nuovi archi
Notare che i genitori sono i nodi collegati e che vengono prima nell'ordinamento
Il grafo indotto dipende dall'ordinamento
Esempio, con un ordinamento diverso (prima c e poi b):
Quando si guarda a, i suoi parenti b e c vengono collegati:
Ora però si guarda c, che ha solo b come genitore, per cui non si aggiungono archi
Lo stesso vale per b, per cui il grafo risultante è diverso
Il grafo indotto ha più archi del grafo, quindi può avere larghezza diversa
La larghezza indotta di un grafo rispetto ad un ordinamento è la larghezza del suo grafo indotto
La larghezza indotta di un grafo (senza riferimento ad un ordinamento) è la sua minima larghezza indotta rispetto ad un ordinamento
L'algoritmo di propagazione per directional path consistency funziona in questo modo:
L'ultimo passo può creare un vincolo fra le due variabili dove prima non c'era
Parallelo:
In altre parole, il grafo indotto contiene tutti gli archi del problema dopo la propagazione
Non vale il viceversa: il grafo indotto ha archi che propagazione potrebbe non creare
Se un grafo ha larghezza indotta 2:
Esiste un ordinamento per cui la propagazione porta a un problema che è:
Quindi, se la larghezza indotta del grafo primale è due, si può stabilire la consistenza facendo propagazione per path consistency secondo la direzione che porta a larghezza due
Stessa definizione del caso non direzionale, ma solo nel caso in cui le i-1 variabili vengono prima dell'altra
Definizione: ogni valutazione consistente di i-1 variabili si può estendere a una qualsiasi altra variabile che viene dopo nell'ordinamento
Come per le altre condizioni di consistenza
Qui si usa "al più i-1 variabili" perchè si vuole forzare la strong consistency
Se il problema, dopo che la propagazione, ha larghezza minore di i, allora si può usare l'algoritmo che estende le soluzioni parziali
Notare che la larghezza che conta è quella dopo la propagazione, non quella del problema originario
Invece di stabilire un i all'inizio, si usa come i il massimo numero di genitori di ogni nodo
In questo modo, viene garantito che alla fine i sarà la larghezza del grafo finale
Modifica dell'algoritmo: invece di guardare tutti i gruppi di al più i-1 genitori di ogni nodo, si guarda solo il gruppo che contiene tutti i genitori
Per ogni variabile, si va a vedere se tutte le tuple di valori possibili dei suoi genitori si possono estendere alla variabile
Le tuple su cui non si può fare vengono eliminate dal vincolo fra i genitori
Quello che si ottiene è un problema che si può risolvere estendento iterativamente una soluzione
Questo algoritmo equivale a un altro che si chiama bucket elimination e che si vedrà in seguito