• Aucun résultat trouvé

3. Tabu-NG et affectation de fréquences

3.3. Méthode Tabu-NG pour le problème AFD classique

3.3.1. Prétraitement

3.3.1.1. Filtrage des domaines et réduction de la taille du problème

L’objectif de cette phase préliminaire est de réduire la taille du problème, et par la suite la taille de l’espace de recherche, en supprimant les valeurs inconsistantes des domaines des variables. Cette partie s’avère nécessaire et profitable de par la nature de ses instances issues d’application réelles.

Problème nb var Densité du graphe nb ctr nb aff nb val Résultat AC

CELAR01 916 0,0132 5548 0 36200 AC CELAR02 200 0,062 1235 0 80004 AC CELAR03 400 0,0345 2760 0 15892 AC CELAR04 680 0,0171 3967 280 26856 13868 (51,6%) CELAR05 400 0,0325 2598 0 15768 12046 (76,4%) CELAR11 680 0,0177 4103 0 26856 AC graph01 200 0,057 1134 0 6920 AC graph02 400 0,0281 2245 0 14624 AC graph03 200 0,057 1134 0 7820 340 (4,3%) graph04 400 0,0281 2244 0 15592 776 (4,9%) graph08 680 0,0163 3757 0 25628 AC graph09 916 0,0125 5246 0 36092 AC graph10 680 0,0169 3907 0 26980 386 (1,4 %) graph14 916 0,0111 4638 0 36716 AC

Tableau 8 : Réduction de domaines sur 15 instances

La dernière colonne du Tableau 8 montre le résultat de la phase de prétraitement, elle donne le pourcentage de valeurs éliminées. AC signifie que le problème est

arc-consistant tel qu’il est proposé et que la phase de prétraitement n’a supprimé aucune valeur dans le domaine des variables.

Aucune réduction de domaine n’est possible sur la majorité des instances fournies dans le cadre du projet CALMA. Cette réduction n’est effective que pour 5 des 14 instances (lignes grises) et de façon efficace sur un nombre encore plus restreint, ainsi qu’on peut le constater sur le Tableau 8 où deux instances seulement ont des réductions importantes (> 50% de valeurs éliminées).

Cette procédure est réalisée une seule fois avant le lancement de la phase de recherche effective d’une solution du problème. Dans le cas où toutes les contraintes du problème sont binaires, cas des AFD classiques, un algorithme qui force l’arc-consistance est nécessaire et suffisant pour éliminer les valeurs inconsistantes dans les domaines des variables.

La procédure de filtrage choisie se base sur l’algorithme AC-3 choisi en raison de sa simplicité d’implémentation et son usage réduit de la mémoire. La procédure de filtrage nommé Algofiltrage est décrite par le code Algorithme 14.

L’Algorithme 11 commence par traiter les contraintes unaires du problème qui porte sur une seule variable. Pour cela le domaine valide de la variable concerné par une contrainte unaire est réduit aux seules valeurs respectant la contrainte. Ensuite, une procédure de FC (Forward Checking) est effectuée (Algorithme 2). Cette phase sert à propager l’instanciation des variables hors cibles (variables pré-affectées) aux variables voisines qui partagent des contraintes en commun avec elles. Par exemple, si une variable hors cible x avec une fréquence f est reliée à une variable y par une contrainte d’écart minimum d, les fréquences entre f-d et f+d sont à éliminer du domaine de la variable y.

La dernière étape consiste à filtrer les domaines des variables en utilisant l'arc - consistance (Algorithme 3). L’algorithme AC-3 n’étant utilisé qu’une seule fois en prétraitement, la lenteur de la procédure n’est donc pas préjudiciable à la rapidité de l’algorithme de recherche. La complexité temporelle de l’algorithme de filtrage proposé est de l’ordre de O(d3) avec d la taille maximale des domaines.

Function AlgofiltageUnaire(X, D, C)

1. C_Unaires = C.GetAllContraintesUnaires();

2. foreach c in C_Unaires do 3. var = c.GetVar(); 4. foreach val in Dvar do

5. if not c.verify(val) then Remove val from Dvar 6. endforeach

7. endforeach

Algorithme 11 : Prétraitement et filtrage par contraintes unaires

Function ForwardChecking(S, X, D, C)

1. FutureVarsFC = Les variables instanciées dans S

2. while FutureVarsFC is not Empty do

3. varFC = FutureVarsFC.pop()

4. if (checkFC(varFC) == EMPTY_DOMAIN) then

5. return EMPTY_DOMAIN;

Function checkFC(varFC)

1. ctrList = Constraints of varFC

2. foreach c in ctrList do

3. otherVar = the 2nd variable of constraint c;

4. if otherVar is not assigned then 5. foreach vo in DomotherVar do

6. if vo is inconsistent with varFC then

7. Remove vo from Dom(otherVar);

8. if DomotherVar is Empty then

9. return EMPTY_DOMAIN; 10. endif; 11. endif 12. endforeach 13. endif 14. endforeach

Algorithme 12 : Prétraitement : Forward Checking

Function AC3(S, X, D, C)

7. FutureVarsAC = Les variables libres

8. while FutureVarsAC is not Empty do

9. varAC = FutureVarsAC.pop()

10. if (checkAC(varAC, futureVarsAC) == EMPTY_DOMAIN) then

11. return EMPTY_DOMAIN;

12. endwhile;

Function checkAC (varAC, futureVarsAC)

1. ctrList = Constraints of varAC

2. foreach c in ctrList do

3. otherVar = the 2nd variable of constraint c; 4. if (otherVar is not assigned) then

5. foreach vo in DomotherVar do

6. if no support for vo in DomvarAC then 7. Remove vo from DomotherVar;

8. if DomotherVar is Empty return EMPTY_DOMAIN;

9. futureVarsAC.add(otherVar);

10. endif

11. endforeach

12. endif 13. endforeach

Algorithme 13 : Prétraitement : Filtrage par Arc-Consistance

Function Algofiltage(S, X, D, C)

1. if AlgoFiltrageUnaire(X, D, C) == EMPTY_DOMAIN then 2. return ProblemeIrrealisable;

3. if ForwardChecking(S, X, D, C) == EMPTY_DOMAIN then 4. return ProblemeIrrealisable;

5. if AC-3(S, X, D, C) == EMPTY_DOMAIN then 6. return ProblemeIrrealisable;

Pour illustrer le fonctionnement de la procédure de filtrage AC-3 prenons l’exemple suivant. Soit un problème AFD avec V = {x, y}, Dx = Dy = {1, 2, 3, 4, 5} et C un ensemble de contraintes avec une seule contrainte c : fx > fy+2.

Afin d’éliminer les valeurs inconsistantes dans le domaine de la variable x selon la contrainte c, nous avons besoin de vérifier pour chaque fréquence fx appartenant à Dx l’existence d’au moins un support dans le domaine de la variable y. Prenons la fréquence 1 dans le domaine de la variable x, cette valeur ne possède aucun support dans le domaine de la variable y selon la contrainte c. Cette valeur sera donc supprimée de Dx.

La routine de base nécessaire pour appliquer cette vérification est donnée par la fonction checkAC (voir Algorithme 13). La complexité temporelle de cette fonction est O(d2) avec d la taille maximale des domaines des variables du problème.

3.3.1.2. Arc-Consistance et affectation de fréquences

Les instances du projet CALMA sont décrites par des contraintes binaires d’écart fixe du type fifj ij et des contraintes binaires d’écart minimal du type fifj ij. Supposons que les domaines soient triés par ordre croissant, et que la vérification de l’appartenance d’un élément à un domaine se fait avec une complexité de O(1). Nous proposons dans cette partie, un traitement mathématique de ces contraintes afin d’améliorer les performances de la fonction checkAC.

Pour une contrainte binaire d’écart fixe, la vérification de la consistance d’une fréquence fi appartenant au domaine de la variable i se fait en vérifiant l’existence d’une

des deux valeursijfiet ijfi dans le domaine de la variable j. Si ces deux fréquences sont absentes alors la valeur fiDi est déclarée sans support dansDj. Dans ce cas la fréquence f est supprimée dei Di.

Pour une contrainte binaire d’écart minimal en fréquences, la vérification de la consistance d’une fréquence fi appartenant au domaine de la variable i se fait en vérifiant

la relation suivante: fjmin  fiijou fjmax fiij. fjmindésigne la valeur minimale dans Dj et max

j

f la valeur maximale.

Cette condition est suffisante pour vérifier l’existence d’un support pour une fréquence fiDi d’une variable i dans le domaine de la variable opposé Dj. La complexité algorithmique de la fonction checkAC reste inférieure à O(d) avec d la taille maximale des domaines. Par la suite l’algorithme de filtrage proposé aura une complexité de l’ordre de O(d2

).

3.3.1.3. Composantes Connexes

Il est judicieux d’appliquer en prétraitement une phase qui consiste à identifier les différentes composantes connexes dans le graphe de contraintes G, en vue de pouvoir traiter indépendamment les uns des autres les problèmes P1, ..., Pk qu’elles définissent.

Cependant toutes les instances que nous avons traitées dans cette thèse ne sont pas décomposables, chaque instance a une seule composante connexe. Nous n’avons donc pas eu de gain lié à cette procédure.

Tabu-NG est une méthode qui se base sur la propagation de contraintes et la

recherche Tabou. Le traitement de toutes les composantes connexes d’un problème à la fois, revient à les traiter parallèlement, ce qui peut agir sur la vitesse et donc pour un temps donné sur la qualité de la solution finale. D’une manière générale, on cherche à décomposer un problème en plusieurs sous problèmes afin de faciliter sa résolution.