Académique Documents
Professionnel Documents
Culture Documents
Le but de cet exercice est de développer un modèle qui place des tours (de taille de 1 à n) dans
une grille nommée city de n*n case (dans ce cas n =5) en satisfont deux contraintes.
1- Chaque ligne ainsi chaque colonne contient des tours de taille différents.
La modélisation de cette contraint dans minizinc est :
constraint forall (o in 1..n) (alldifferent ([city [o, i] | i in 1...n])).
Pour chaque ligne on assure que tous les tours soient de tailles différentes.
De même pour les colonnes,
constraint forall (o in 1...n) (alldifferent ([city [i, o] | i in 1...n])).
2- La deuxième contrainte est d’assurer que le nombre des tours visible à partir d’une
direction bien définie (haut, bas, gauche, droit) soit égale à un nombre fix prédéfini.
Par exemple, si un observateur situé au niveau de la première ligne à gauche, il doit
observer trois tours. Pour qu’un tour soit visible par rapport à cet observateur, il doit
être supérieur à tous ces précédents.
C’est-à-dire si le tour est situé dans le cas city [1, i] il faut que pour tout j de 1 à i :
City [1, J] <= city [1, i] donc le produit des booléens (City [1, J] <= city [1, i]) doit être
égale à 1.
Pour faire la somme des tours visible à partir de la première ligne à gauche, il faut juste
faire la somme de i de 1à n des produits de j de 1à i des booléens (City [1, J] <= city [1,
i]).
Puis, il faut mettre cette somme égale au nombre prédéfini comme paramètre du
problème donnée dans la liste left_vision comme, donc pour généraliser on fait :
- constraint forall (o in 1..n) (sum(i in 1..n) (product(j i1..i) (bool2int (city[j,o]
<=city[i,o]) ) ) == left_vision[o]).
Pour les tours visibles pour un observateur citée à droite sur une ligne o, on raisonne
par la même logique mais pour qu’un tour soit visible à droite il faut que pour tout j de i
à n : city[j,o]<=city[i,o]). Donc pour généraliser on fait:
- constraint forall (o in 1..n) (sum(i in 1..n) (product(j i..n) (bool2int (city[j,o] <=
city[i,o] ))) == right_vision [o] );
Par la même logique de raison on fait la meme chose un observateur situé en haut
et un autre en bas :