• Aucun résultat trouvé

Dans la même optique, un support de domaine pour la contrainte CostGCC peut être construit en réduisant le problème à celui du flot maximum à coût minimum. Pour ce faire, Régin [24] étend le raisonnement appliqué pour la contrainte AllDifferent. Pour ne s’at-

tarder qu’aux applications en ordonnancement, cette section se limite au cas particulier où le nombre minimal de fois lv qu’une valeur v peut être assignée est 0, même si l’algorithme de

Régin supporte le cas où lv est positive.

2.3.1 Réduction au problème du flot maximum à coût minimum

La réduction est basée sur celle décrite à la section2.2.1 pour la recherche d’un support pour la contrainte AllDifferent. Une différence notable est que la source s est plutôt reliée aux valeurs V, les variables X au puits t et une arête relie une valeur v à une variable X si v ∈ dom(X). Cette variante transposée est utile pour appliquer le filtrage défini par Régin [24]. Une autre différence est la capacité des arêtes reliant s aux valeurs. En lien avec la définition de CostGCC, pour chaque valeur vdcontrainte à être assignée un nombre maximal de fois ud,

la capacité sur l’arête correspondante est c(s, vd) = ud. Ainsi, une nouvelle notion introduite

est que la quantité de flot passant par une valeur indique le nombre de fois que celle-ci est assignée à une variable. Finalement, pour gérer les coûts définis par la fonction cost, le poids d’une arête reliant une valeur v à une variable X est w(v, X) = cost(X, v). Le poids est nul pour le reste des arêtes du réseau.

Une fois le réseau construit, l’application de l’algorithme de Klein [17] annulant les cycles négatifs détermine un flot optimal. Pour que CostGCC soit satisfaite, il faut qu’un flot non nul passe par toutes les variables de la portée. De plus, le coût du flot cost(f ) doit être inférieur ou égal au seuil H prescrit, c’est-à-dire cost(f ) ≤ max (dom(H)). À ce moment, le flot illustre un support de domaine et il est possible de filtrer en conséquence.

2.3.2 Filtrage à l’aide du support

L’application de la cohérence de domaine pour la contrainte CostGCC peut être vue en deux étapes [24]. La première étape applique la cohérence de domaine pour la contrainte GCC

correspondante. Le filtrage basé sur les composantes fortement connexes présenté pour la contrainte AllDifferent est repris ici. Cette étape est requise pour s’assurer, pour chaque affectation possible non utilisée par le support, qu’il existe un cycle passant par l’affectation. La seconde étape tient compte des coûts et du seuil prescrits. Le coût du flot optimal sert de borne inférieure pour le seuil H. Comme mentionné pour la contrainte AllDifferent, une arête (v, X) symbolise une affectation X = v à valider. De plus, pousser une unité de flot sur un cycle passant par l’arête (v, X) donne un support pour l’affectation X = v. Bien que ce test soit suffisant pour AllDifferent et GCC, ce n’est pas assuré pour CostGCC.

Effectivement, pousser une unité de flot sur un cycle engendre un coût rc qui vient s’ajouter pour donner le coût du nouveau du flot cost(f0) = cost(f )+rc. Or, pour que le flot f0 illustre un support incluant l’affectation à valider, il faut une fois de plus que cost(f0) ≤ max(dom(H)). Pour démontrer l’existence de ce flot f0, Régin [24] prescrit, à partir du flot optimal, qu’il suffit de pousser un flot sur un cycle engendrant le plus petit coût, soit le coût réduit. En effet, puisque f est optimal, il n’existe pas d’autre support avec un coût inférieur. Par conséquent, rc ≥ 0 et si cost(f0) > max(dom(H)), il est certain qu’il n’existe pas de support incluant l’affectation testée X = v. C’est donc de là que vient la motivation de construire un flot optimal.

Les cycles engendrant des coûts réduits, soit les cycles optimaux, peuvent être déterminés en utilisant un algorithme de plus court chemin selon les poids wi définis dans le graphe résiduel. L’utilisation d’un algorithme de plus court chemin est déterminante dans la complexité de l’algorithme de filtrage. Pour cette raison, il est important de minimiser son nombre d’appels. Plusieurs algorithmes de plus court chemin calculent les plus courts chemins d’un nœud de départ vers tous les autres nœuds du graphe. De ce fait, l’idée est de calculer, pour chaque arête (v, X) dans le graphe résiduel, le cycle optimal passant par cette arête. Soit les variables X et les valeurs V, l’ensemble des cycles optimaux passant par les affectations à valider peut être calculé de deux façons :

1. Faire |X | appels à l’algorithme de plus court chemin avec chaque variable comme nœud de départ. Pour un cycle passant par (v, X), le coût réduit engendré est la somme des coûts résiduels d’un plus court chemin C = (X → . . . → v) ajouté au coût résiduel de (v, X). Autrement dit, rc =P

(a,b)∈Cw(a, b) + w(v, X).

2. Dans le graphe transposé, faire |V| appels à l’algorithme de plus court chemin avec chaque valeur comme nœud de départ. Le coût réduit engendré par un cycle optimal passant par (X, v) est alors rc =P

(a,b)∈Cw(a, b) + w(X, v) tel que C = (v → . . . → X)

est un plus court chemin dans le graphe transposé.

Les deux techniques ci-dessus permettent de calculer le coût du cycle optimal passant par n’importe quelle arête (v, X) avec un nombre limité d’appels à l’algorithme de chemin le plus court. En ordonnancement, il y a moins de variables que de valeurs. Il est donc préférable d’opter pour la première méthode.

La complexité de l’algorithme est dominée par les |X | appels à l’algorithme de plus court che- min. En utilisant l’algorithme de Bellman-Ford, la complexité en temps devient O(|X |2|V|2).

D’ailleurs, en faisant circuler le flot des valeurs aux variables, Régin [24] évite d’avoir à trans- poser le réseau lors du filtrage. Ci-haut, v, l et u sont des vecteurs de taille d. Pour appliquer la cohérence de domaine, l’algorithme de Régin [24] utilise un algorithme de plus court chemin qui dépend de la taille de l’instance. Soit W le coût maximal retourné par cost et P (n, d, W ) le temps requis pour appliquer cet algorithme de plus court chemin, l’algorithme de Régin [24] est en temps O(nP (n, d, W )). Ainsi, l’algorithme de filtrage applique la cohérence de domaine

pour les variables Xi et la cohérence de borne pour le seuil H.

Exemple 2.4. Soit une instance pour la contrainte d’arité 3 définie comme suit : — CostGCC([X1, X2, X3], v = [1, 2, 3], l = [0, 0, 0], u = [2, 1, 1], cost, H)

— dom(X1) = {1, 2} avec cost(X1, a) = a

— dom(X2) = {1, 2} avec cost(X2, a) = a

— dom(X3) = {2, 3} avec cost(X3, a) = a − 2

— dom(H) = [0, 3] t X2 X1 X3 1 2 3 s 1 1 1 1(1) 1(1) 1(2) 1(2) 1(0) 1(1) 2 1 1

Figure 2.7 – Réseau encodant l’instance pour CostGCC

Le réseau de la figure2.7encode l’instance. La capacité et le coût de chaque arête sont indiqués selon le format capacité(coût).

Appliquer l’algorithme de Klein [17] construit un flot optimal dont le coût est de 2. Le flot est représenté dans le graphe résiduel de la figure 2.8. Le poids des arêtes illustre la capacité résiduelle et le coût résiduel. Tel qu’expliqué, si le coût d’une arête est w, son coût résiduel demeure w dans le graphe résiduel, mais devient −w si cette arête est inversée. Le coût du flot cost(f ) = 2 permet de fixer la borne inférieure de dom(H) à 2. Dans cet exemple, les composantes fortement connexes n’induisent pas de filtrage. Cependant, un filtrage selon les coûts est possible.

Le support illustré par le flot est {X1 = 1, X2 = 1, X3 = 2}. Par conséquent, les affectations

à valider sont X1 = 2, X2 = 2 et X3 = 3. Un appel à l’algorithme de plus court chemin pour

chaque variable révèle que le cycle optimal (X1 → 1 → s → 3 → X3 → 2 → X1) passant par

(2, X1) engendre un coût réduit de −1 + 1 + 0 + 2 = 2. Puisque 2 + 2 > max(dom(H)) = 3, la

valeur 2 doit être filtrée de dom(X1). Un raisonnement similaire mène à la même conclusion

t X2 X1 X3 1 2 3 s 1 1 1 1(−1) 1(−1) 1(2) 1(2) 1(0) 1(1) 2 1 1

Deuxième partie

Chapitre 3

Contrainte DisjunctiveTardiness

Tel qu’exposé, un réseau de flot s’avère efficace pour la conception d’algorithmes de filtrage en ordonnancement. Dans ce chapitre, cet outil de modélisation est repris pour introduire une nouvelle contrainte globale. La contrainte, dénommée DisjunctiveTardiness, tient mieux compte, pour un ordonnancement donné, de l’interaction entre la contrainte Disjunctive et la minimisation du retard pondéré où la pondération du retard est la même pour l’ensemble des tâches. Le problème encodé par la contrainte est énoncé. Une idée de sa difficulté est présentée. Un algorithme de filtrage pour la contrainte, basé sur une relaxation, est donné. Des liens sont faits entre les notions amenées et l’état de l’art de l’ordonnancement. Finalement, pour rendre l’algorithme applicable en pratique, différentes variantes sont introduites.

3.1

Définition de la contrainte

DisjunctiveTardiness généralise la contrainte Disjunctive pour tenir compte des re- tards engendrés par l’ordonnancement de tâches. Le retard d’une tâche i est donné par Ti = max(0, Ci − di) = max(0, Si + pi − di). Ainsi, soit l’ensemble de tâches I, pour que

la contrainte soit satisfaite, il ne faut pas que la somme des retards TI ne dépasse un certain

seuil T . TI est équivalent à la somme des retards pondérés où la pondération wi = 1 pour

toute tâche i dans I. Dans la définition, I est représenté par les trois vecteurs en paramètre.

DisjunctiveTardiness([S1, . . . , Sn], [p1, . . . , pn], [d1, . . . , dn], T ) = Disjunctive([S1, . . . , Sn], [p1, . . . , pn])∩{(s1, . . . , sn) | n X i=1 max(0, Si+ pi− di) ≤ T } (3.1)

Documents relatifs