Consistenza direzionale

È una variante della consistenza locale

Si usa per algoritmi di backtracking con ordine fisso di valutazione delle variabili


Arc consistency direzionale

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


Differenza

Si valutano le variabili nell'ordine x1,...,xn

Si verifica se xi è arc consistent con xj se:


Consistenza direzionale: esempio

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


A cosa serve?

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


Perchè si fanno le verifiche

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


Verifiche fatte

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


Verifiche non fatte

Se j < i, non si verifica se tutti i valori di xi hanno un valore corrispondente nel dominio di xj

Motivi:


Omissione verifica

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


Inclusione verifica

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:


Directional consistency: riassunto motivazioni


Consistenza direzionale: esempio

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


Propagazione

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.


Esempio

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


Propagazione: perchè funziona

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


Propagazione: perchè funziona

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


Propagazione: sequenza

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)


Propagazione: altre variabili

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


Directional path consistency

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


Path consistency: motivazione

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)


Usi della consistenza direzionale

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


Grafi ordinati

Si usa un ordinamento dei nodi

Nel grafo primale, è l'ordinamento di valutazione delle variabili


Genitori di un nodo

I genitori di un nodo sono quei nodi che:


Larghezza di un grafo

La larghezza di un nodo è il numero dei suoi genitori

La larghezza di un grafo è la massima larghezza dei suoi nodi


Larghezza e consistenza

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


Directional arc consistency=consistenza

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


Larghezza 1

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"


Path consistency

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


Problema con la larghezza

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


Grafo indotto

Dato un grafo e un ordinamento, il grafo indotto dall'ordinamento è fatto in questo modo:


Grafo indotto: esempio

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


Dipendenza dall'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


Larghezza indotta

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


Propagazione per directional path consistency

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


Grafo indotto e directional path consistency

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


Condizione di equivalenza

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


i-consistenza direzionale

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


Propagazione per strong directional i-consistency

Come per le altre condizioni di consistenza

Qui si usa "al più i-1 variabili" perchè si vuole forzare la strong consistency


Consistenza e soluzioni

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


Consistenza adattiva

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