Capitolo 3: Vincoli a dominio finito 1 Vincoli a dominio finito Problemi di soddisfazione di vincoli Un risolutore con backtracking Consistenza su nodi e archi Consistenza sui limiti Consistenza generalizzata Ottimizzazione per vincoli aritmetici 2 Vincoli a dominio finito Una classe importante di problemi con vincoli Usati per moellare problemi con vincoli che hanno a che fare con delle scelte: es.: Scheduling, routing and timetabling Il piu’ grande impatto industriale della programmazione con vincoli e’ stato su questi problemi 3 Problemi di soddisfazione con vincoli Un problema di soddisfazione con vincoli (CSP) consiste di: Un vincolo C su variabli x1,..., xn Un dominio D che mappa ogni variabile xi ad un insieme finito di possibili valori d(xi) E’ inteso come il vincolo C x1 D( x1) xn D( xn) 4 Colorazione di mappe Un CSP classico e’ il problema della colorazione di mappe in modo che regioni adiacenti non abbiamo lo tesso colore. Es.: puo’ la mappa dell’Australia essere colorata con 3 colori? NT Q WA NT WA SA NT SA NT Q SA Q SA NSW SA V Q NSW NSW V D(WA) D( NT ) D( SA) D(Q) D( NSW ) D(V ) D(T ) {red , yellow, blue} WA SA NSW V T 5 4-regine Piazzare 4 regine su una scacchiera 4 x 4 in modo che non si attacchino. Q1 Q2 Q3 Q4 Quattro variabili Q1, Q2, 1 Q3, Q4 che rappresentano la riga 2 della regine in ogni colonna. Dominio di ogni 3 variabile: {1,2,3,4} One solution! --> 4 6 4-regine I vincoli: Non sulla stessa riga: Q1 Q2 Q1 Q3 Q1 Q4 Q2 Q3 Q2 Q4 Q3 Q4 Non nella stessa diagonale Q1 Q2 1 Q1 Q3 2 Q1 Q4 3 up: Q2 Q3 1 Q2 Q4 2 Q3 Q4 1 Not nella stessa diagonale Q1 Q2 1 Q1 Q3 2 Q1 Q4 3 down: Q2 Q3 1 Q2 Q4 2 Q3 Q4 1 7 Lo zaino del ladro Un ladro ha uno zaino con capacita’ 9, e deve scegliere cose da rubare in modo da fare un profitto di almeno 30 object whiskey profit 15 size 4 perfume cigarretes 10 7 3 2 4W 3P 2C 9 15W 10 P 7C 30 Quale dovrebbe essere il dominio delle variabili? 8 Risolutore con backtracking Il modo piu’ semplice per risolvere csps e’ di enumerare le possibili soluzioni Il risolutore con backtracking: Enumera i valori per una variabile alla volta Ad ogni passo, controlla che nessun vincolo primitivo sia violato Assumiamo che satisfiable(c) ritorna false quando il vincolo primitivo c senza variabili e’ non soddisfacibile 9 Partial Satisfiable Controlla se un vincolo e’ non soddisfacibile a causa di un vincolo primitivo senza variabili Partial_satisfiable(c) For ogni vincolo primitivo c in C If vars(c) e’ vuoto If satisfiable(c) = false return false Return true 10 Backtrack Solve Back_solve(c,d) vars(c) e’ vuoto return partial_satisfiable(c) Sceglie x in vars(c) For ogni valore d in d(x) Sia C1 uguale a C con x rimpiazzato da d If partial_satisfiable(c1) then If back_solve(c1,d) then return true Return false If 11 Backtracking Solve X Y Y Z D( X ) D(Y ) D( Z ) {1,2} X Y Y Z Choose Variablevar var X YZ X Y Sceglie domain domain {1,2} {1,2} dominio {1,2} X 1 X 2 2 Y Y Z 1 Y Y Z Y 1 Y 2 1 1 1 Z 1 2 2 Z partial_satisfiable false Z 1 Nessuna variabile, e false 1 2 2 1 2 1 1 Z Z 2 2 22 Z Nessuna variabile, e false 1 2 2 2 12 Consistenza sui nodi e sugli archi Idea di base: trovare un CSP equivalente all’originale con domini delle variabili piu’ piccoli Esamina 1 vincolo primitivo alla volta Node consistency: (vars(c)={x}) rimuove dal dominio di x ogni valore che non soddisfa c Arc consistency: (vars(c)={x,y}) rimuove da d(x) valori per cui non c’e’ nessun valore in d(y) tale che (x,y) soddisfa c, e vice versa 13 Node Consistency Un vincolo primitivo c e’ node consistent con dominio D se |vars(c)| !=1 o Se vars(c) = {x} allora per ogni d in d(x) X assegnato a d e’ una soluzione di c Un CSP e’ consistente sui nodi se ogni vincolo primitivo e’ consistente sui nodi 14 Esempi CSP che non e’ consistente sui nodi (vedere Z): X Y Y Z Z 2 D( X ) D(Y ) D( Z ) {1,2,3,4} CSP che e’ consistente sui nodi: X Y Y Z Z 2 D( X ) D(Y ) {1,2,3,4}, D( Z ) {1,2} Il problema della colorazione della mappa e quello delle 4 regine sono consistenti sui nodi. 15 Ottenere la consistenza sui nodi Node_consistent(c,d) For ogni vincolo primitivo c in C D := node_consistent_primitive(c, D) Return D Node_consistent_primitive(c, D) If |vars(c)| =1 then Sia {x} = vars(c) D( x) : {d D( x) | {x d} e' una soluzione di c} Return D 16 Consistenza sugli archi Un vincolo primitivo c e’ consistente sugli archi con dominio D se |vars{c}| != 2 o Vars(c) = {x,y} e per ogni d in d(x) esiste e in d(y) tale che {x d , y e} e' una soluzione di c E in modo simile per y Un CSP e’ consistente sugli archi se ogni vincolo primitivo e’ consistente sugli archi 17 Esempi CSP consiste sui nodi ma non sugli archi: X Y Y Z Z 2 D( X ) D(Y ) {1,2,3,4}, D( Z ) {1,2} Esempio: il valore 4 per X e X < Y. CSP equivalente ma consistente sugli archi: X Y Y Z Z 2 D( X ) D(Y ) D( Z ) La colorazione della mappa e le 4 regine sono consistenti sugli archi. 18 Ottenere la consistenza sugli archi Arc_consistent_primitive(c, D) If |vars(c)| = 2 then D( x) : {d D( x) | esiste e D( y ), {x d , y e} e' una sol. di c} D( y ) : {e D( y ) | esiste d D( x), {x d , y e} e' una sol. di c} Return D Rimuove valori che non sono arc-onsistent con c 19 Ottenere la consistenza sugli archi Arc_consistent(c,d) Repeat W := d For ogni vincolo primitivo c in C D := arc_consistent_primitive(c,d) Until W = D Return D Una versione molto naive 20 Usare la consistenza ui nodi e sugli archi Possiamo costruire risolutori basati sui metodi di consistenza Due tipi importanti di dominio: False domain: alcune variabili hanno il dominio vuoto Valuation domain: ogni variabile ha un solo valore nel dominio Estendere satisfiable a CSP con domini valutazione 21 Risolutore basato su consistenza su nodi e archi D := node_consistent(C,D) D := arc_consistent(C,D) if D e’ un dominio falso return if D e’ un dominio valutazione return false satisfiable(C,D) return unknown 22 Esempio Colorare l’Australia: con vincoli WA red NT yellow WA NT SA Q NSW V T Consistenza sui nodi WA NT WA SA NT SA NT Q SA V SA Q Q NSW SA NSW NSW V 23 Esempio Colorare l’Australia: con vincoli WA red NT yellow WA NT SA Q NSW V T Consistenza sugli archi WA NT WA SA NT SA NT Q SA V SA Q Q NSW SA NSW NSW V 24 Esempio Colorare l’Australia: con vincoli WA red NT yellow WA NT SA Q NSW V T Consistenza sugli archi WA NT WA SA NT SA NT Q SA V SA Q Q NSW SA NSW NSW V 25 Esempio Colorare l’Australia: con vincoli WA red NT yellow WA NT SA Q NSW V T Consistenza sugli archi Risposta: unknown WA NT WA SA NT SA NT Q SA V SA Q Q NSW SA NSW NSW V 26 Risolutore con backtracking Possiamo combinare la consistenza con il backtracking Applichiamo la consistenza sui nodi e sugli archi prima di iniziare la ricerca con backtracking, e dopo ogni assegnamento di un valore ad una variabile 27 Esempio di risolutore con backtracking Q1 Nessun valore Quindi, puo’ essere dobbiamo assegnatouna scegliere Q3valore in altro questo caso! per Q2. Q2 Q3 Q4 1 2 3 4 28 Esempio Q1 Q2 Q3 Q4 1 backtracking, Backtracking… Non possiamo backtracking, 2 trovare nessun Trovo un Trovo unQ4 valore per Trovo un altro valore 3 altroin valore altro valore per per Q1? Q3? questo caso! per Q2? No! 4 No! Si, Q1 = 2 29 Esempio Q1 Q2 Q3 Q4 1 2 3 4 30 Esempio Q1 Q2 Q3 Q4 1 2 3 4 31 Esempio Colorare l’Australia: con vincoli WA red NT yellow WA NT SA Q NSW V T Enumerazione con backtracking Seleziona una var. con dominio con piu’ di 1 valore, T Aggiunge il vincolo T Answer: true red Applica la consistenza 32 Consistenza sui limiti E I vincoli primitivi con piu’ di 2 variabili? hyper-arc consistency: estende la consistenza sugli archi per un numero arbitrario di variabili Sfortunatamente determinare la hyper-arc consistency e’ NP-hard Qual e’ la soluzione? 33 Consistenza sui limiti CSP aritmetici: i vincoli sono interi range: [l..u] rappresenta l’insieme degli interi {l, l+1, ..., u} Idea: usare la consistenza sui numeri reali e guardare solo i punti finali (limiti superiori e inferiori) del dominio di ogni variabile Definire min(D,x) come il minimo elemento nel dominio di x, simile per max(D,x) 34 Consistenza sui limiti Un vincolo primitivo c e’ consistente sui limiti con dominio D se per ogni var x in vars(c) Esistono numeri reali d1, ..., dk per le rimanenti variabili x1, ..., xk tali che {x min( D, x), x1 d 1, xk dk} e’ una soluzione di c E simile per {x max( D, x)} Un CSP aritmetico e’ consistente sui limiti se lo sono tutti i vincoli primitivi 35