Algorithme de répartition avec condition
Bonjour,
J'ai un ensemble d'éléments A, B, C, D ....
chaque éléments est soumis à une ou plusieurs conditions
A ne peut être à côté de B
B ne peut être à côté de J et H
etc
la solution doit être disposée sur une carte dont les dimensions sont n*n
Il peut y avoir plusieurs A ou B ou C ...
Je cherche des pistes de réflexion sur le sujet, des bases Arbres de décision, etc ...
Avez-vous des pistes que je pourrais exploiter ?
Olivier
Algorithme de répartition avec condition
Bonjour, :D
Je crois que deux outils de type tableau sont indispensables:
a) la liste des éléments disponibles, soit ici:
Code:
1 2 3
| CONST Ne = 10;
TYPE ListeE = ARRAY[1..Ne] OF Byte;
NombreE: ListeE; |
initialsée aux valeurs indiquées:
Code:
1 2
| CONST NiniE: ListeE = (25, 18, 12, 10, 8, 8, 7, 6, 3, 3);
NombreE:= NiniE; |
b) la matrice de non-adjacence, où sont consignées touts les proximités interdites:
Code:
1 2
| TYPE TabNN = ARRAY[1..Ne, 1..Ne] OF Bool;
VAR A: TabNN; |
Cette matrice est symétrique en raison de la réciprocité des interdictions; on aura ainsi:
A ne peut pas être à côté de B C E ni H
Code:
1 2 3 4
| A[1, 2]:= False; A[2, 1]:= False;
A[1, 3]:= False; A[3, 1]:= False;
A[1, 5]:= False; A[5, 1]:= False;
A[1, 8]:= False; A[8, 1]:= False; |
Un remplissage de la grille ne pourrait-il résulter simplement d'un remplissage aléatoire ligne par ligne, ou colonne par colonne ?
On aurait ainsi pour tout élément interne (i, j) , en progressant de la gauche vers la droite, quelque chose comme:
Code:
1 2 3 4 5 6 7
| TYPE Grille = ARRAY[1..Ne, 1..Ne] OF Byte;
VAR G: Grille;
h: Byte; Test1, Test2: Bool;
...
h:= Random(Ne) + 1;
Test1:= A[G[i, j - 1], h]; Test2:= A[G[i - 1, j], h];
IF (Test1 AND Test2) THEN G[i, j];= h; |
L'emplacement des cases à remplir pourrait lui-même faire l'objet d'un tirage aléatoire, en plus de leur contenu, après initialisation de celui-ci à zéro.