Vous êtes sur la page 1sur 1

2.

3 Les tours de Coruscant - nightmare level

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 :

- constraint forall (o in 1..n) (sum(i in 1..n)(product(j in i..n ) (bool2int (city[o,j] <=


city[o,i])) ) ==down_vision[o]);
- constraint forall(o in 1..n)(sum(i in 1..n)(product(j in 1..i) (bool2int (city[o,j] <=
city[o,i] ))) == up_vision[o]);

Vous aimerez peut-être aussi