INF580 Programmation par contraintes

Transcription

INF580 Programmation par contraintes
INF580 Programmation par contraintes
Examen écrit
mars 2011
Les documents de cours, ceux distribués dans le cadre du module, les notes personnelles
ainsi que les calculatrices seront autorisés. Les traducteurs ne sont pas nécessaires. Les
portables sont strictement interdits à l’intérieur des salles d’examens.
Les exercices sont indépendants. Si vous avez le moindre problème de compréhension du
français, n’hésitez pas à demander de l’aide !
1
Mathématiques récréatives
“Les Aanderson vont nous rendre visite ce soir”, annonce Monsieur Blum. “Toute la famille,
donc Monsieur et Madame Aanderson et leurs trois fils Antoine, Bernard et Claude ?”,
demande Madame Blum craintive. Monsieur Blum, qui ne rate pas une occasion de provoquer
sa femme : “Non, pas du tout. Je t’explique. Si le père Aanderson vient, alors il emmène
aussi sa femme. Au moins un des deux fils Claude et Bernard vient. Soit Madame Aanderson
vient, soit Antoine vient. Soit Antoine et Bernard viennent tous les deux, soit ils ne viennent
pas. Et si Claude vient, alors Bernard et Monsieur Aanderson aussi.”
Quelles conclusion peut tirer Madame Blum (elle vient de suivre le cours INF580), sur
qui viendra ce soir ? Décrivez succinctement les étapes qui ont mené à votre conclusion.
2
n Samouraı̈s
On veut placer n samouraı̈s sur une grille n × n, de sorte qu’ils ne puissent pas s’attaquer.
La situation est un peu différente de celle des n reines. En effet, nous avons la promesse que
n = m2 pour un entier m ≥ 2, et que la grille consiste en n carrés élémentaires de taille
m × m, voir figure 1. Deux samouraı̈s peuvent s’attaquer s’ils sont placés soit dans la même
colonne, soit dans la même ligne, soit dans le même carré élémentaire.
Modélisez le problème de placement de n samouraı̈s comme un problème de satisfaction
de contraintes.
1
Figure 1: Un placement de 4 samouraı̈s. Un des 4 carrés est indiqué en gris.
3
Le loup, la chèvre et le chou
Vous connaissez sûrement ce problème inventé par Alcuin, un savant et religieux du 8ème
siècle. Déterminez comment un batelier s’y prendra pour transporter d’un bord de la rivière
à l’autre un loup, une chèvre et un chou. Le bateau ne peut accueillir plus d’un élément en
plus du batelier, et il ne peut pas laisser sur le rivage le loup avec la chèvre, ni la chèvre avec
le chou.
Pour information, la solution est assez simple : Le batelier transporte la chèvre puis
revient chercher le chou ou le loup. Il ramène la chèvre. Il prend ensuite le loup ou le chou.
Enfin, il revient chercher la chèvre.
Modélisez le problème comme un problème de satisfaction de contraintes. Pour vous
faciliter la tâche, on fixe un paramètre k, et on cherche à savoir s’il existe une solution qui
consiste en k + 1 trajets aller alternés par k trajets retour de la barque.
4
Placement de table
Dans un sketch de Gad Elmaleh, il est question d’un informaticien qui écrit un programme
informatique pour calculer un placement de table. Car un mauvais placement de table lors
d’une fête peut ruiner des familles pendant des générations entières.
La situation est la suivante. On doit placer n hommes et n femmes le long d’une longue
table qui comporte n chaises de chaque côté. On a donc n paires de chaises qui se font
face. Pour fixer les notations les hommes sont dénotés h1 , . . . , hn et les femmes f1 , . . . , fn et
l’ensemble des personnes est P := {h1 , . . . , hn , f1 , . . . , fn }. Maintenant les conflit familiaux
sont donnés sous forme d’un ensemble C contenant tous les couples de personnes en conflit.
Donc C ⊆ P 2 avec (x, y) ∈ C si et seulement si (y, x) ∈ C.
On veut placer les hommes d’un côté de la table et les femmes de l’autre, de sorte que
deux personnes en conflit ne se fassent pas face. Pour cela, produisez une modélisation en
un problème de satisfaction de contraintes. Choisissez une modélisation qui peut se résoudre
de manière efficace. Justifier brièvement.
2
5
Arc-consistance
Voici une instance de CSP à quatre variables w, x, y, z ayant pour domaine {0, 1, 2}. Les contraintes sont R(w, x), R(y, z), Q(y, w), Q(x, y), où R = {(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)}
et Q = {(0, 1), (0, 2), (1, 2)}. Rendez cette instance arc-consistante.
6
Toutes les permutations
Pour un entier n > 1 donné, on veut générer efficacement toutes les n! permutations sur
{0, . . . , n − 1}.
Le code suivant contient une fonction genTout(int n) qui effectuera n! appels à output(int
p[]) avec à chaque fois une permutation distincte codée dans le tableau p.
static void output(int p[]) { ... } // p.ex. affichage de p
static void genTout(int n) { genTout(new int[n], 0, n); }
// p[0]..p[i-1] contiennent un préfixe d’une permuation
static void genTout(int p[], int i, int n) {
if (i==n) output(p);
else {
//
-- tenter toutes les valeurs pour p[i]
for (p[i]=0; p[i]<n; p[i]++) {
//
-- vérifier la consistance
boolean ok = true;
for (int j=0; j<i && ok; j++)
ok = (p[j]!=p[i]);
if (ok)
genTout(p, i+1, n);
}
}
}
Critiquez l’efficacité de ce code, et proposez une amélioration. Écrivez le code Java de
cette amélioration.
7
Recherche locale
Un bateau a fait naufrage en pleine mer. Il y a n personnes et m < n canots de sauvetage.
Les canots sont identiques, mais pas les personnes. La i-ème personne pèse pi kilos. Les
personnes doivent toutes choisir un canot où trouver refuge, et ils veulent bien sûr que le
3
poids total des personnes dans leur canot soit le plus petit possible. Ce poids total mesure
le risque que subissent les personnes d’un canot.
Donc la situation est la suivante. Les personnes sont dans les canots. Tant qu’il existe
une personne qui en changeant de canot peut décroı̂tre strictement son risque, elle change.
Une seule personne change à la fois.
Modéliser cette situation comme un problème de recherche locale. L’espace de recherche
consiste en toutes les affectations personnes-canots de la forme σ : {1, . . . , n} −→ {1, . . . , m}.
Trouver une fonction de coût qui minimise strictement à chaque itération de la boucle tant
que décrite ci-dessus.
Note : la valeur de cette fonction n’est pas forcément entière. En général le domaine de
cette fonction sera un ensemble S muni d’un ordre.
8
Phylogénie parfaite
Dans le problème de phylogénie parfaite à 3-états, on dispose de n vecteurs v1 , . . . , vn dans
{1, 2, 3}m . Chaque vecteur correspond à un taxon, chaque dimension de l’espace vectoriel à
un caractère. La valeur vt [c] correspond à l’état du caractère c dans le taxon t. Une phylogénie
parfaite consiste en un arbre non-dirigé T à n feuilles. Chaque feuille est étiquetée par un
taxon distinct, et les nœuds internes sont étiquetés par un vecteur de {1, 2, 3}m (en général
différent de v1 , . . . , vn ), de sorte que pour chaque caractère c et chaque état i, l’ensemble des
nœuds qui sont étiquetés par l’état i pour le caractère c induit un sous-graphe connexe. Voir
figure 2 pour un exemple.
v5=(1,2,3)
v4=(1,1,3)
(1,2,3)
(3,2,3)
v2=(2,3,2)
v1=(3,2,1)
v3=(3,2,3)
Figure 2: Une phylogénie parfaite pour n = 5, m = 3. Par exemple, l’ensemble de nœuds
étiquétés par un vecteur v, avec v[3] = 3 consiste en tous les nœuds sauf v1 , v2 . Cet ensemble
induit un sous-graphe connecté.
Le problème consiste à décider s’il existe une phylogénie parfaite. Ce problème peut se
résoudre en temps polynomial par réduction à 2-SAT. Pour cela, nous codons l’entrée en une
4
matrice binaire M de dimension n×3m, telle que pour tout 1 ≤ t ≤ n, 1 ≤ c ≤ m et 1 ≤ i ≤ 3
en ligne t et colonne 3(c − 1) + i de la matrice M il y ait un 1 si et seulement si vt [c] = i. On
dit que deux colonnes j, k de M sont incompatibles si l’ensemble {(Mt,j , Mt,k ) : 1 ≤ t ≤ n}
contient toutes les paires (0, 0), (1, 0), (0, 1), (1, 1). Dans le cas échéant les colonnes sont dites
compatibles.
Nous disposons du théorème suivant (que vous ne devez pas prouver !).
Théorème 1 L’instance donnée dispose d’une phylogénie parfaite si et seulement si il existe
un ensemble de colonnes S dont toutes les paires sont compatibles, et pour chaque caractère
c, S contient au moins deux parmi les colonnes 3(c − 1) + 1, 3(c − 1) + 2, 3(c − 1) + 3.
Écrivez une formule 2-SAT F qui est satisfiable si et seulement si l’instance donnée dispose
d’une phylogénie parfaite.
9
XOR-SAT
On a vu en cours que l’arc consistance ne permet pas de résoudre les formules 2-SAT. Par
contre est-ce que l’arc consistance permet de résoudre les formules XOR-SAT avec au plus
deux litéraux par clauses ?
Dans le cas positif donnez une preuve, dans le cas négatif donnez un contre-exemple.
10
All-different
On considère une classe de CSP très particuliers, dont toutes les variables x1 , . . . , xn ont le
même domaine {1, . . . , k} pour un entier k ≤ 2 donnée et toutes les contraintes sont de la
forme
∀xi , xj ∈ S, i 6= j : xi 6= xj ,
où S ⊆ {x1 , . . . , xn } est la porté de la contrainte.
Quelle est la complexité du problème de résolution pour les instances de cette classe pour
k = 2 ? Même question pour k = 3 ?
Traductions
batelier
canot de sauvetage
chou
chèvre
loup
naufrage
se faire face
succinctement
bargee
lifeboat
cabbage
goat
wolf
shipwreck
sit in front
briefly
5
A
Corrections
A.1
Mathématiques récréatives (2 pt)
Pour chacune des 5 personnes il faut prendre une décision booléenne. On va modéliser le
problème avec 5 variables booléennes qui indiquent si les personnes viennent, P, M, A, B, C
pour respectivement le père, la mère, Antoine, Bernard et Claude. Les contraintes données
par Monsieur Blum se traduisent par P ⇒ M , C ∨ B, M ⊕ A, A ⇔ B et C ⇒ (B ∧ P ). Ceci
peut être reformulé en une formule 2-SAT dont le graphe d’implication est le suivant.
!P
!M
!C
A
!B
B
!A
C
M
P
Il y a deux composantes fortement connexes dont une seule de degrée sortant nul, donc
une unique solution qui est P = M = C = 0 et A = B = 1. Donc seul Antoine et Bernard
viennent.
Ce problème peut être résolu par d’autres manières également, mais je voudrais voir une
solution correcte, et une explication du raisonnement.
A.2
n Samouraı̈s (1 pt)
On observe que la division en carrées élémentaires est comme pour Sodoku. Plutôt que
d’avoir des variables booléennes par case, on va avoir des variables entières par ligne, qui
rend le CSP plus compact.
Donc les variables sont x0 , . . . , xn−1 . Le domaine de chaque variable est {0, . . . , n − 1}.
L’interprétation est que le samouraı̈ de la i-ème ligne se place en colonne xi . Les contraintes
sont alors
• Pour tout 0 ≤ i < j < n : xi 6= xj . [attaque dans colonne]
• Pour tout 0 ≤ i < j < n avec f (i) = f (j) : f (xi ) 6= f (xj ), où f (k) := bk/mc. [attaque
dans carrée]
C’est un problème de Exact Cover, car dans toute solution il y a exactement un samouraı̈
dans chaque colonne et aussi un samouraı̈ dans chaque carrée.
6
A.3
Le loup, la chèvre et le chou (3 pt)
Plusieurs modélisations sont possible. Ce que je ne veux pas voir c’est une contrainte dont
l’arité dépend de k. Dans la modélisation suivante, la variable bi est redondante. Elle
contient l’objet manquant à li ∪ ri . Ça me va si on code le loup, la chèvre et le chou par
des entiers. Ça me va aussi si on code les ensembles par des entiers, dont la décomposition
binaire relève les éléments.
1. Pour les 2k + 1 trajets on aura 3 variables li , bi , ri , indiquant le contenu des deux rives
et de la barque. Les domaines de li , ri sont les sous-ensembles de {loup,chèvre,chou},
et le domaine de bi est {loup,chèvre,chou,vide}.
2. Tous les ensembles li et ri pour tout i sont soumis à la contrainte unaire R, qui interdit
les ensembles contenant à la fois loup et chèvre ou à la fois chèvre et choux. Cette
contrainte peut aussi être codée directement dans le domaine des variables.
3. Pour chaque trajet i il y a une contrainte ternaire Q sur li , bi , ri qui assure qu’il
n’y a pas de perte ou de duplication d’objet. Concrètement Q contient tous les
triplets li , bi , ri , tel que li , {bi }, ri sont disjoints et leur union est {loup,chèvre,chou}
ou {loup,chèvre,chou,vide}.
4. Puis il y a les deux contraintes unaires r1 = {} et l2k+1 = {}, qui forcent la configuration
de départ et d’arrivée.
A.4
Placement de table (3 pt)
Je veux voir plusieurs observations dans la réponse.
1. les conflits entre hommes ou entre femmes peuvent être ignorées.
2. ce n’est pas la peine de placer à la fois les hommes et les femmes, et donc d’avoir 2n
variables. Il suffit de n variables indiquant pour chaque femme en face de quel homme
elle est placée. Appelons x1 , . . . , xn ces variables.
3. on a vu en cours que les contraintes locales ∀i 6= j : xi 6= xj sont avantageusement
remplacées par l’unique contrainte globale alldifferent(x1 , . . . , xn ), car elle admet des
traitements plus efficace.
4. les conflits de C sont des contraintes unaires sur les variables, qui peuvent être directement codées dans leur domaine. Donc le domaine de xi est {j : 1 ≤ j ≤ n : (hj , fi ) 6∈
C}.
5. maintenant les solutions à ce CSP décrivent exactement les solution au problème de
placement de table. C’est une observation triviale, qui découle des différentes contraintes imposées.
7
6. pas demandé, mais j’apprécie si quelqu’un voit qu’il s’agit du problème de couplage
parfait dans un graphe bi-parti qui peut être résolu en temps polynomial, par exemple
en temps O(n2.5 ) par l’algorithme d’Edmonds.
A.5
Arc-consistance (1 pt)
Après élimination dans les domaines des valeurs sans support, on obtient les supports suivants.
w
2
x
0
-
y
1
-
A.6
z
0
2
Toutes les permutations (3 pt)
Une analyse fine de la complexité de ce code n’est pas facile. Par contre on on voit qu’il passe
son temps à tester toutes les n valeurs possibles pour p[i], en comparant un par un avec les
valeurs p[j] placés précédemment. En particulier pour i = n − 1, le temps passé pour trouver
l’unique valeur possible pour p[n − 1], coûte dans la moitié des cas 1 + 2 + . . . + n/2 = Ω(n2 )
comparaisons.
Pour améliorer ce code, on va utiliser deux ingrédients. D’une part on utilise la technique
d’arc consistance pour réduire après chaque affectation le domaine des variables encore libres.
Et d’autre part on utilise l’observation que le domaine de toutes variables encore libres est
le même. Donc on va tout simplement stocker dans p[0], . . . , p[i − 1] les valeurs des variables
affectées et dans p[i], . . . , p[n − 1] les valeurs du domaine des variables libres.
static void genTout2(int n) {
int p[] = new int[n];
for (int i=0; i<n; i++)
p[i] = i;
genTout2(p, 0, n);
}
static void genTout2(int p[], int i, int n) {
if (i==n) output(p);
else {
genTout2(p, i+1, n);
for (int j=i+1; j<n; j++) {
int swap = p[i];
p[i] = p[j];
p[j] = swap;
genTout2(p, i+1, n);
8
p[j] = p[i];
p[i] = swap;
}
}
}
A.7
Recherche locale (2 pt)
On considère l’ordre de dominance lexicographique sur des vecteurs. Soit rsort(x1 , . . . , xk ) le
vecteur (xπ(1) , . . . , xπ(k) ) tel que xπ(1) ≥ . . . ≥ xπ(k) pour une permutation π sur {1, . . . , k}.
On dit que le vecteur (x1 , . . . , xk ) domine lexicographiquement le vecteur (y1 , . . . , yk ), et on
note (x1 , . . . , xk ) ≺ (y1 , . . . , yk ), si rsort(x1 , . . . , xk ) est lexicographiquement plus grand que
rsort(y1 , . . . , yk ).
Un personne qui change d’un canot a vers un canot b va augmenter le risque de toutes
les personnes dans b. Donc le vecteur des n risques ne diminue pas par dominance à chaque
changement. Par contre le vecteur des m charges des canots, diminue strictement
:
P
Notons La (σ) la charge du canot a dans la configuration σ, La (σ) = i:σ(i)=a pi . Il n’y
a que les charges de deux canots qui sont affectées par le changement. Les canots a et b.
Et on a Lb (σ 0 ) < La (σ), car k diminue strictement son risque. Et on a aussi Lb (σ) <
Lb (σ 0 ). Donc max{La (σ 0 ), Lb (σ 0 )} < max{La (σ), Lb (σ)}. Ainsi (L1 (σ 0 ), . . . , Lm (σ 0 )) ≺
(L1 (σ), . . . , Lm (σ)).
P
P
D’autres fonctions de potentiels possibles étaient par exemple
(La )2 ou
a (La −
minb Lb ).
A.8
Phylogénie parfaite (2 pt)
1. il faut une variable booléenne par colonne, qui indique l’appartenance à S. Soient
x1 , . . . , x3m ces variables.
2. Soit c un caractère et j = 3(c − 1) + 1, k = 3(c − 1) + 2, ` = 3(c − 1) + 3 les colonnes
associées. La formule suivante est satisfaite si et seulement si S contient au moins deux
des colonnes j, k, `:
Fc := (xj ∨ xk ) ∧ (xj ∨ x` ) ∧ (xk ∨ x` ).
V
Soit F1 := c Fc .
3. Pour tout couple de colonnes incompatibles j, k la clause (xj ∨ xk ) est satisfaite si S
contient au plus une des colonnes de j, k. Soit F2 la disjonction de ces clauses pour
tout couple de colonnes incompatibles.
4. Par construction la formule 2-SAT F1 ∧ F2 est satisfiable si et seulement s’il existe un
ensemble S avec les conditions du théorème.
9
A.9
XOR-SAT (1 pt)
Non, l’arc consistance ne permet pas de résoudre les formules XOR-SAT avec au plus deux
litéraux par clauses ?
La formule (x ⊕ y) ∧ (y ⊕ z) ∧ (z ⊕ x) n’est pas satisfiable, mais les domaines Dx = Dy =
Dz = {0, 1} sont arc-consistants.
A.10
All-different (2 pt)
Pour k = 2 le problème peut-être résolu en temps linéaire. En effet dés qu’une clause a une
arité au moins 3, alors l’instance n’est pas satisfiable. Et sinon, l’instance correspond à une
instance 2-SAT, qui peut-être résolue en temps linéaire.
Pour k = 3, de nouveau s’il existe une clause d’arité 3 ou plus, l’instance n’est pas
satisfiable. Sinon, l’instance décrit en fait un problème de coloration de graphe, où les
variables représentent des sommets et les contraintes des arêtes. Et comme le problème de
3-colorabilité est NP-dur, la résolution de ces instance l’est aussi.
10