510 likes | 715 Views
Gennaio – Aprile 2006. Intelligenza Artificiale. marco ernandes email: ernandes@dii.unisi.it. Constraint Satisfaction. PS vs. CSP. Nel PS tutto ruota intorno al concetto di stato. Nel PS tutto è problem-specific (o state-specific) SCS( n ), g ( n ), h ( n ), t ( n ), S 0 .
E N D
Gennaio – Aprile 2006 Intelligenza Artificiale marco ernandes email: ernandes@dii.unisi.it
PS vs. CSP • Nel PS tutto ruota intorno al concetto di stato. • Nel PS tutto è problem-specific (o state-specific) • SCS(n), g(n), h(n), t(n), S0. • Gli stati sono dei veri “black box” senza struttura interna. • La terminazione controlla se lo stato COINCIDE COMPLETAMENTE con uno degli stati finali. • Il CSP invece cerca di “aprire” gli stati e generalizzarne la rappresentazione interna.
CSP vs. PS • Il CSP si occupa, tipicamente di Problemi di assegnazione CONSTRAINT SATISFACTION PROBLEMS • Nei problemi di assegnazione • non c’è l’interesse di ottenere un percorso risolvente. • non c’è (generalmente) un costo associato ad ogni passo • non si possiede uno stato obiettivo (possedere uno stato obiettivo coincide con l’aver risolto il problema) • Il PS fornisce un framework per affrontare problemi di percorso, il CSP fornisce tecniche per problemi di assegnazione: CONSTRAINT SATISFACTION PROGRAMMING
otto + due dieci Esempi di CSP
CSP(problems & programming) CS-Problems Tipologia di problemi (CS) CSP La differenza tra PS e CSP può essere sfumata: un CSP può al limite essere formalizzato come PS e attaccato di conseguenza. CS-Programming Metodo per formalizzare e attaccare un problema CS.
Definizione di CSP • Un problema di CSP (soddisfacimento vincoli) è definito da: • un set di variabili: X1, X2,…, Xn • un set di vincoli (constraints): C1, C2,…, Cm • ogni variabile Xi è associata ad un dominio Didi valori ammissibili v • ogni vincolo Ci agisce su di un subset di variabili e specifica le combinazioni di assegnamenti legali. • La soluzione di un CSP è data da un assegnamento completo (per ogni variabile Xi c’è un valore estratto da Di) senza violazione dei vincoli.
CSP es: 8-Regine (I) • Variabili: • 64 Xij con i = da 1 a 8, j = da 1 a 8 • Dominio delle variabili • D = {1,0} • Vincoli: • Xij = 1 SEXik = 0 per tutti k da 1 a 8, k j () • Xij = 1 SE Xkj = 0 per tutti k da 1 a 8, k i () • Xij = 1 SE Xi+h,j+h = 0, Xi-h,j-h = 0 per tutti ih () da 1 a 8, h 0 xi,1 xi,2 xi,3 xi,4 xi,5 xi,6 xi,7 xi,8 x1,j x2,j x3,j x4,j x5,j x6,j x7,j x8,j
CSP es: 8-Regine (II) • Variabili: • 8 Xi con i = da 1 a 8 • Dominio delle variabili • D = {1,2,…,8} • Vincoli: • Xi = kSE Xj k per tutti j da 1 a 8, j i () • Xi = kSE Xih kh per tutti ih da 1 a 8, h 0 () D = 1 2 3 4 5 6 7 8 x1 x2 x3 x4 x5 x6 x7 x8
CSP es: Colorazione Mappe • Variabili: WA, NT, Q, NSW, V, SA, T • Domini Di= {red, green, blue} • Vincoli: regioni adiacenti devono avere colori diversi: • es 1: color(WA) ≠ color(NT), • es 2: color(WA,NT) da {(red,green), (red,blue), (green,red), (green,blue), (blue,red), (blue,green)}
two + two four CSP es: Criptoaritmetica • Variabili: F, T, U, W, R, O (+ Xd, Xc, Xm,i riporti) • Domini Di= {1,2,3,4,5,6,7,8,9,0} • Vincoli: ogni lettera deve essere associata ad un valore diverso e la somma tra due lettere in colonna (+ il riporto della somma precedente) deve essere uguale al valore della lettera “risultato” • Alldiff(F, T, U, W, R, O) • O+O = R +10 * Xd • Xd +W+W = U + 10 * Xc • Xm = F
CSP es: Soddisfacibilità (SAT) • Variabili: x1,x2,x3 • Domini Di= {true,false} • Vincoli: il valore di ogni clausola deve essere TRUE • (x1 x2 x3) = TRUE • (x1 x2 x3) = TRUE • (x1 x2) = TRUE (x1 x2 x3) (x1 x2 x3) (x1 x2 )
CSP e vincoli • Constraint Network (CN): la rete di relazioni che coinvolge vincoli, variabili e valori. • Arità dei vincoli k(C) • Vincoli unari: k(C) = 1, il vincolo agisce solo su una variabile • Vincoli binari: k(C) = 2, il vincolo agisce su una coppia di variabili • Vincoli n-ari: k(C) = n, il vincolo agisce su più variabili contemporaneamente (es: N-Regine ogni variabile con valore ) • CSP-binari possiedono al max. vincoli binari e si possono descrivere con un grafo dei vincoli. I CSP di ordine maggiore si descrivono con ipergrafi.
CSP e complessità • CSP finiti: dominio finito di valori • CSP infiniti: dominio infinito di valori (problemi affrontati dalla programmazione lineare) • SAT: il SAT è un problema CSP finito e ogni CSP è riducibile al SAT, quindi: • La complessità dei CSP finiti è esponenziale (es: Knapsack Problem 2n)
Intro al CS-Programming • Il Constraint Programming: insieme di metodologie che mirano alla risoluzione dei CSP e richiede 3 scelte progettuali • modello (definito con framework CSP) • algoritmo • euristica • Ognuna di queste scelte influenza l’efficienza della risoluzione (es: il modello fa aumentare o diminuire le dimensioni della CN). • Gli algoritmi si dividono in 2 categorie: • Metodi Costruttivi • Metodi Riparativi
Metodi Costruttivi • Si parte da uno stato privo di assegnamenti e si cerca di immettere valori senza violare i vincoli. • In questo caso si formalizza un CSP come un PS e si risolve attraverso tecniche di Search. • Stato: assegnamento di valori dal dominio Dia variabili Xi • X0: assegnamento vuoto {} • Successor function: un valore per ogni var non assegnata consistente con quelle già assegnate • Goal test: assegnamento completo senza violazione di vincoli • Costo di cammino: costante per ogni step
… e svantaggi Grosso problema: le grandi dimensioni che può assumere Diche definisce il branching factor Metodi Costruttivi – vantaggi • Commutatività del CSP: l’ordine degli assegnamenti è indifferente (non interessa il percorso), quindi: • SCS: genera nodi da una sola variabile (qualsiasi) • Non c’è bisogno di memorizzare il cammino • Non c’è bisogno di calcolare il costo di cammino • La profondità dell’albero è finita e conosciuta: • d = numero di variabili da assegnare • Gli algoritmi depth-first sono i più usati
Backtracking Search • E’ una ricerca Depth-First (per problemi CSP) in cui si espande facendo assegnamenti ad una sola variabile per volta. • E’ l’algoritmo base per i CSP. • assignment = {}; • STACK.insert(assignment); • do • if (STACK.isEmpty()) returnfailure; • assignment = STACK.remove(); • if (complete(assignment)) returnassignment; • STACK.insertAll (expand(assignment)); • while (true);
Backtracking - simulazione Empty assignment 1st variable 2nd variable 3rd variable Assignment = {(X1=v11),(X2=v22)} Assignment = {} Assignment = {(X1=v11),(X2=v21)} Assignment = {(X1=v11),(X2=v21),(X3=v31)} Assignment = {(X1=v11),(X2=v21)} Assignment = {(X1=v11),(X2=v21),(X3=v32)} Assignment = {(X1=v11),(X2=v21)} Assignment = {(X1=v11)} Assignment = {(X1=v11)}
Migliorare il backtracking (I) • La ricerca Depth-First semplice non è molto efficiente. (Come già visto in PS). • Nel PS si introduce un’informazione problem-specific (euristiche) per migliorare le prestazioni della ricerca. • Il framework CSP permette di ottenere euristiche generali problem-independent considerando il concetto di espansione. • Espandere vuol dire assegnare dei valori ad una variabile a scelta senza violare i vincoli.
Migliorare il backtracking (II) • Dal concetto di espansione: • La scelta della variabile da espandere è determinante! • L’ordine d’inserimento dei valori nello STACK è determinante! • Le euristiche general-purpose del Constraint Programming rispondo quindi alle seguenti domande: • Quale variabile scegliere per l’espansione? • In che ordine provare i valori? • E’ possibile scoprire in anticipo dei fallimenti?
Scelta della Variabile (I) • Minimum Remaining Values (MRV) Heuristic: • Si sceglie la variabile con il minor numero di valori legali rimanenti. • MRV è anche detta: • Most Constrained Variable Heuristic • Fail First Heuristic • Cheapest First Heuristic • Vantaggi: • Riduce il branching factor (da cui cheapest first) • Porta più facilmente ad un fallimento superficiale (da cui fail first) con conseguente backtracking e quindi aiuta a potare l’albero.
Scelta della Variabile (II) • Allo stato X0 di questo esempio ogni variabile ha lo stesso numero di valori legali. • In questo caso conviene scegliere la variabile coinvolta in più vincoli • Riduce il branching factor delle scelte future • Si chiama Degree Heuristic ed è spesso associata a MRV (funge da tie-breaker).
Scelta del Valore • Least Constraining Value (LCV) Heuristic: • Preferisci i valori che lasciano il più grande sottoinsieme di valori legali per le variabili non assegnate. • E’ il criterio di ordinamento dell’espansione • L’idea è che si danno maggiori possibilità alla ricerca di trovare futuri assegnamenti legali. Mantiene 1 valore per SA Mantiene 0 valori per SA
Evitare i fallimenti • La LCV Heuristic richiede il controllo previo del numero di valori rimanenti per variabile. • Per fare questo si fa: forward checking. • Per ogni variabile non-assegnata si tiene traccia del subset di valori ancora legali. • Ogni volta che v è assegnato a Xi: • per ogni variabile non ass. Xj connessa a Xi da un vincolo si cancella dal dominio Dj ogni valore inconsistente con v
Forward Checking • E’ applicabile all’interno dell’algoritmo di backtracking come tecnica per stabilire quando tornare indietro. • Ogni volta che si raggiunge uno stato non-consistente (con almeno una variabile priva di valori rimasti node-consistency) si effettua il backtracking.
NT Q WA T NSW SA V Forward Checking(es: colorazione grafo) Nell’esempio non vengono adottate le altre euristiche
NT Q WA T NSW SA V Forward checking rimuove il RED da NT e da SA Forward Checking(es: colorazione grafo) Nell’esempio non vengono adottate le altre euristiche
NT Q WA T NSW SA V Forward Checking(es: colorazione grafo) Nell’esempio non vengono adottate le altre euristiche
NT Q WA T NSW SA V Forward Checking(es: colorazione grafo) Nell’esempio non vengono adottate le altre euristiche
NT Q WA T NSW SA V Forward Checking(es: colorazione grafo) Nell’esempio non vengono adottate le altre euristiche
NT NT Q Q WA WA T T NSW NSW SA SA V V Forward Checking(es: colorazione grafo) Nell’esempio non vengono adottate le altre euristiche
Arc Consistency(Waltz, ’72) • Forward Checking stabilisce un criterio di stop, ma non prevede i fallimenti con anticipo. • In figura, per esempio, NT e SA sono entrambe Blu: nessuna soluzione è raggiungibile! • Arc-consistency: per evitare di dead-end ci dobbiamo assicurare che, per ogni vincolo, rimanga un insieme di valori assegnabili alle variabili vincolate.
Contraint Propagation • Arc-consistency può essere usato come controllo a supporto del backtracking dopo ogni assegnamento. Individua i dead-end prima di Forward Checking. • Contraint Propagation: L’approccio può però essere generalizzato facendo ripetutamente il controllo di arc-consistency, rimuovendo i valori che non la garantiscono.
Contraint Propagation • Arc-consistency può essere usato come controllo a supporto del backtracking dopo ogni assegnamento. Individua i dead-end prima di Forward Checking. • Contraint Propagation: L’approccio può però essere generalizzato facendo ripetutamente il controllo di arc-consistency, rimuovendo i valori che non la garantiscono.
Algoritmi di Arc Consistency • Invece di affrontare un CSP facendo search sulle variabili, si effettua un search sui vincoli (gli archi della CN). • Si parte da una configurazione con i domini delle variabili “pieni”. • Se un arco è inconsistente lo si rende consistente rimuovendo i valori inconsistenti. • L’arco xixj(arco diretto) è definito consistente iff: v Di v’ Dj cioè per ogni valore di Viesiste un assegnamento legale di Vj. • Quando si è reso consistente ogni arco allora si ritorna l’assegnamento delle variabili come soluzione.
AC-3(Mackworth, ’86) AC-3 ARCS = {tutti gli archi della CN}; while (!ARCS.isEmpty()) (Xi,Xj) ARCS.remove(); if (REMOVE-INC-VALUES(Xi,Xj)==true) for allXk in NEIGHBORS[Xi] ARCS.put(Xk, Xi); REMOVE-INC-VALUES(Xi,Xj) boolean removed = false; for all v in DOMAIN(Xi) if no value v’ in DOMAIN(Xj) satisfies (Xi,Xj) DOMAIN(Xi).remove(v); removed = true; return removed;
K-Consistency • Generalizzazione del concetto di arc-consistency da coppie a gruppi di variabili: • Un grafo è K-consistente se per ogni assegnamento legale di K-1 variabili esiste sempre un valore legale per ogni K-esima variabile Vk nel grafo dei vincoli. • Node-consistency = strong 1-consistency • Arc-consistency = strong 2-consistency • Path-consistency = strong 3-consistency • Un CSP con N variabili che sia strongly N-consistent, è risolvibile senza backtracking. • Un CSP strongly K-consistent, è risolvibile senza backtracking se si trova l’ordinamento di variabili appropriato.
Migliorare il backtracking (III) • Abbiamo sin qui visto tecniche di look-ahead che mirano ad evitare i dead-end (profondi). • Possiamo anche migliorare il backtracking con tecniche di look-back: • Backjump • Constraint recording • Backtracking: si torna indietro alla variabile precedentemente assegnata • Backjumping: si torna indietro direttamente alla variabile che a creato problemi.
Backjumping • Motivazione: il motivo di un fallimento non si trova per forza nell’ultima coppia di assegnamenti, ma in assegnamenti precedenti. • Backjumping = non-chronological backtracking. • Fare backtracking a x5 non cambia niente. Si rimane in un dead-end. • Per un backtracking efficace va scelta un’altra variabile (secondo un criterio a scelta es: conflict set).
Conflict Set • Si tiene traccia in CS[xi] delle variabili assegnate, anche una sola, che entrano in conflitto con qualche valore presente in Di. Nogood variables. • Directed-conflict Backtracking • torna direttamente all’assegnamento (+ recente) causa del dead-end. • si rimuovono le decisioni intermedie e si aggiorna CS[] 1 Directed-conflict Backtracking Ha il vantaggio di accelerare il processo di backtracking 3 5 2 4
X1 = 1 X2 = 3 X3 = 5 X5 = 4 Dynamic Backtracking(Ginsberg, ’90, ’92) • E’ un non-chronological backtracking (backjumping) che: • torna alla variabile nogood causa del dead-end • NON rimuove le decisioni intermedie, ma ricostruisce l’albero eliminando un solo assegnamento X1 = 1 Stabilire la variabile “effettivamente” causa del dead-end non è sempre ovvio X2 = 3 X3 = 5 X4 = 2 X5 = 4
Dynamic Backtracking (es: crossword generation) • (Ginsberg, ’90) ha usato: • euristica MRV (cheapest-first): xargmini=1n#Di • euristica LCV nella formula: • min-look = 10 sul backtracking • Schema di hashing (degli ingressi del dizionario) per calcolare rapidamente il dominio (matching dei pattern) • Schemi grandi (15x15) riempiti in pochi secondi! 10001100000… il valore k è alto se l’ingresso k del dizionario contiene la data lettera i alla data posizione j
Metodi Riparativi(Ricerca Locale) • Si parte da uno stato “pieno”: cioè con tutte le variabili assegnate. • Per rientrare nel framework CSP: • Si consentono stati con violazione dei vincoli • Gli operatori sono di riassegnamento di valori a variabili e non di assegnamento. • Si usano tecniche di ottimizzazione locale: • Min-Conflicts • Hill-climbing • Tabu Search • Simulated annealing • Algoritmi Genetici
Metodi Riparativi vs. Costruttivi • Gli algoritmi costruttivi funzionano bene soprattutto su CSP-binari (o con pochi vincoli e pochi valori): • Es: complex di AC-3 = O(nk3) dipende da k=valori e n=archi • Diventano poco gestibili con Constraint Networks ad arità maggiore e con molti valori. • Es: N-regine con N > 106. • Gli algoritmi riparativi, locali, forniscono meno garanzie teoriche, ma nel caso di problemi molto complessi risultano efficienti nella pratica. • Gli algoritmi riparativi non sono completi.
1 2 2 0 3 2 3 2 2 2 2 2 3 2 Min-Conflicts(Minton, ‘92) • Si sceglie una configurazione iniziale (random) • Ripeti: • Prendi una variabile xi in conflitto (random) • Assegna a xi il valore che minimizza il numero di conflitti • Se la configurazione è valida allora RETURN ASSEGNAZIONE, altrimenti CONTINUE
Min-Conflicts - vantaggi • E’ estremamente efficace per problemi come quello delle n-regine. Risolti problemi di milioni di regine (con solo ~50 iterazioni partendo da assegn. random!). Con algoritmi costruttivi è impossibile. • E’ estremamente utile (ed efficace) in problemi CSP “reali”, come quelli di scheduling: • Perché se c’è una variazione nei vincoli (es: cambio di orario di un professore nel problema del Class Scheduling) non si deve ricominciare da capo. • E’ quindi un sistema che può far fronte ad un ambiente dinamico: online-CSP. • Ha risolto il problema dello scheduling delle osservazioni del Telescopio Hubble. • Può essere usato in forma iterativa o in associazione con algoritmi locali come simulated-annealing
Sim-Annealing • L’approccio di riparazione ha due modelli puri opposti: • Hill-climbing: si segue uno schema di costante ascesa. Migliora gli stati ma si ferma nei massimi locali (si può ricominciare da uno stato iniziale diverso: Iterative Hill-Climbing) • Random Walk: è completo, ma non cerca di migliorare gli stati. • Simulate Annealing: generalizzazione che combina l’hill-climbing con il random walk per ottenere completezza ed efficenza: • Invece di fare la migliore scelta se ne fa una random. • IF la scelta migliora lo stato attuale allora si accetta. • ALTRIMENTI la scelta è accettata con una probabilità < 1 • La probabilità è relata al peggioramento prodotto: exp(-/T) • è dato dalla differenza di valore degli stati (peggioramento). • T è la “temperatura” = se è alta si accettano molti peggioramenti • Si tende a far decrescere la temperatura durante la ricerca.
Generalizzazione del CSP • Variabili, valori, vincoli (modello o “constraint network”) potrebbero avere pesi diversi: 1) Rilassamento peso vincoli (libertà di violare). 2) Rilassamento peso variabili (libertà di non istanziare) 3) Rilassamento peso valori (alcuni preferibili). • Questo si presenta quando: • casting di un problema dal mondo reale al dominio dei CSP • non vi sono soluzioni con una constraint network hard-valued. • V-CSP: un peso su ogni elemento del modello • Crossword Solving = P-CSP (sottoinsieme di V-CSP)