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