Problema di soddisfacimento di vincoli

Da Wikipedia, l'enciclopedia libera.

Molti problemi nell’ambito dell'Intelligenza Artificiale sono classificabili come Problemi di Soddisfacimento di Vincoli (Constraint Satisfaction Problem o CSP); fra questi citiamo problemi di complessita' combinatorica, di allocazione di risorse, pianificazione e ragionamento temporale. Questi problemi possono essere risolti efficientemente attraverso tecniche ben note di risoluzione di CSP.

Formalmente, un CSP può essere definito su un insieme finito di variabili (X_1, X_2, \dots, X_n) i cui valori appartengono a domini finiti di definizione (D_1, D_2, \dots, D_n) e su un insieme di vincoli. Un vincolo su un insieme di variabili è una restrizione dei valori che le variabili possono assumere simultaneamente. Concettualmente, un vincolo può essere visto come un insieme che contiene tutti i valori che le variabili possono assumere contemporaneamente: un vincolo tra k variabili c(X_{i_1},X_{i_2},\dots,X_{i_k}) è un sottoinsieme del prodotto cartesiano dei domini delle variabili coinvolte D_{i_1},D_{i_2},\dots,D_{i_k} che specifica quali valori delle variabili sono compatibili con le altre. Questo insieme può essere rappresentato in molti modi, per esempio per mezzo di matrici, equazioni, disuguaglianze o relazioni. Una soluzione ad un CSP è un assegnamento di valori alle variabili che soddisfi tutti i vincoli.

Un classico esempio di problema che può essere visto come CSP è il Rompicapo delle otto regine. Il problema consiste nel disporre su una scacchiera otto regine che non si attacchino a vicenda; naturalmente, non è possibile disporne più di otto, perché questo implicherebbe posizionarne due su una stessa riga. Per formalizzare il problema come CSP dobbiamo identificare un insieme di variabili, un insieme di domini ed un insieme di vincoli. Poiché su ogni riga e su ogni colonna della scacchiera dovrà essere posta esattamente una regina, una possibile formalizzazione del problema è quella di considerare come variabili ciascuna delle otto righe della scacchiera; l’insieme delle variabili sarà quindi V=\{R_1,R_2,\dots,R_8\}. Ciascuna di queste variabili può assumere un valore che rappresenta la colonna su cui si trova la regina corrispondente, per cui i domini delle variabili sono le otto possibili colonne: D_1=D_2=\dots=D_8=\{1,2,3,4,5,6,7,8\}. Abbiamo quindi già inserito in questa formalizzazione il concetto che due regine non possono trovarsi sulla stessa riga; resta da imporre che due regine non possono trovarsi né sulla stessa colonna, né sulla stessa diagonale. L’insieme dei vincoli sarà dunque:

\forall i,j. R_i \neq R_j

ad indicare che due regine non possono trovarsi sulla stessa colonna e:

\forall i,j, se R_i =a e R_j=b, allora i-j \neq a-b e i-j \neq b-a

per imporre che due regine non possono trovarsi sulla stessa diagonale.

Algoritmi[modifica | modifica wikitesto]

Per risolvere problemi di soddisfacimento di vincoli, vengono usati diversi algoritmi, fra cui algoritmi che valutano i vincoli a posteriori:

Algoritmi che valutano i vincoli a priori

Algoritmi per semplificare il problema

  • Arc-Consistenza
  • Path-Consistenza

Voci correlate[modifica | modifica wikitesto]