• Aucun résultat trouvé

En utilisant la définition 3.1pour relaxer le problème, il devient envisageable de concevoir un algorithme de filtrage pour la contrainte DisjunctiveTardiness qui tient compte du retard. À cause de la préemption, le problème PDT se traduit bien à celui encodé par CostGCC.

3.5.1 Représentation de l’état des domaines

Comme CostGCC, l’instance est représentée par un réseau de flot avec coûts, nommé le réseau d’ordonnancement avec retards. De façon similaire, la structure comporte une source s et un puits t. Au puits t sont reliées chaque tâche i de I. À la source s sont reliés l’ensemble des temps d’exécution possibles selon l’état des domaines dom(Si) et les temps de traitement pi.

Par exemple, si dom(Si) = {0, 1} et pi = 2, alors les temps d’exécution possibles pour la tâche

i sont {0, 1, 2}. Pour la représentation des domaines, il y a une arête (e, i) qui relie un temps d’exécution e à une tâche i s’il est possible d’y exécuter cette même tâche. Autrement dit, pour chaque tâche i, on retrouve les arêtes (e, i) telles que min(dom(Si)) ≤ e < max(dom(Si)) + pi.

Dans un ordonnancement préemptif, une tâche i doit s’exécuter à pi instants. Il faut donc fixer les capacités des arêtes c(i, t) pour qu’elles correspondent au temps de traitement, c’est- à-dire c(i, t) = pi. La capacité des autres arêtes est fixée à 1. Un flot donné dans le réseau

modélise un ordonnancement. Un flot passant par l’arête (e, i) indique que la tâche i s’exécute au temps e. Pour compléter la représentation, le coût du flot doit correspondre à la somme des retards relaxés des tâches ordonnancées. Pour ce faire, pour chaque arête reliant un instant e et une tâche i, un coût résiduel w(e, i) = w(e, i) tel que défini dans 3.1est attribué à l’arête. Bien entendu, w(e, i) = −w(i, e) dans le graphe résiduel. Dans cette configuration, le réseau résultant caractérise ainsi l’instance.

3.5.2 Algorithme de filtrage selon les retards

Le filtrage consiste à d’abord exécuter l’algorithme de Klein [17] pour déterminer un flot maximum à coût minimum. Pour obtenir un ordonnancement valide, la valeur du flot maximum doit être égale à la somme des pi. Le cas échéant, le coût du flot est alors une borne inférieure pour le seuil T . Nécessairement, pour demeurer cohérent, le coût ne doit pas dépasser le seuil. Pour filtrer les Si, on poursuit avec l’algorithme de filtrage de Régin [24] pour déterminer les

arêtes où il n’est pas envisageable d’envoyer un flot. Si un flot ne peut être envoyé sur une arête (e, i), alors la tâche i ne peut pas s’exécuter au temps e. Puisqu’au final il faut une solution non préemptive, la tâche ne peut pas débuter aux instants tel qu’elle s’exécuterait à l’instant e. Dans ce cas, soit les instants d tels que e − pi < d ≤ e, les arêtes (d, i) doivent être retirées

du réseau et les valeurs d retirées du domaine dom(Si). Pour la même raison, une valeur v

du domaine dom(Si) n’est cohérente que si la tâche i peut s’exécuter à tous les instants dans l’intervalle [v, v + pi). t i j 0 1 2 3 s 2 1 1(−1) 1(−1) 1(2) 1(0) 1(1) 1 1 1 1

Figure 3.1 – Filtrage avec le réseau d’ordonnancement avec retards

Exemple 3.2. En reprenant l’exemple 3.1, on obtient le réseau de la figure 3.1. L’exécution de l’algorithme de filtrage de Régin [24] résulte en un flot au coût de 2, ce qui permet de fixer le

domaine du seuil T à [2, 3]. Aussi, le flot ne peut pas circuler sur l’arête (2, i). Effectivement, pousser un flot sur le cycle (i → 1 → s → 3 → j → 2 → i) passant par l’arête (2, i) engendre un coût réduit minimal de 2, ce qui est trop élevé pour que l’ordonnancement demeure cohérent : 2 + 2 > 3. Ainsi, il faut retirer les arêtes (i, 1) et (i, 2) du réseau et filtrer la valeur 1 de Si. À

l’aide du flot, l’algorithme capture donc un filtrage supplémentaire qui n’est pas détecté par la décomposition comme présentée dans l’exemple 3.1.

3.5.3 Dominance de l’edge-finding

Avec l’instance représentée par le réseau d’ordonnancement avec retards, une autre idée serait de vouloir réutiliser le filtrage avec les composantes fortement connexes de Régin [23]. Toujours dans l’optique d’avoir une solution non préemptive, en retirant une arête (e, i) reliant deux composantes fortement connexes, il faut s’assurer que la tâche i ne puisse plus s’exécuter à l’instant e. Malgré la pertinence de ce raisonnement, il existe déjà dans la littérature des règles de filtrage pour la contrainte Disjunctive qui appliquent ce raisonnement. La règle du edge-finding appliquée en duo avec le time-tabling sont notamment de bons candidats (voir section 1.3.2). Cette section vise à présenter la dominance des algorithmes de filtrage pour la contrainte Disjunctive vus jusqu’à maintenant par rapport au filtrage avec les composantes fortement connexes.

Théorème 3.3. Soit l’ensemble de tâches I et fmax le flot optimal obtenu du réseau d’ordon- nancement avec retards. La règle de l’overload checking détecte une incohérence si et seulement si |fmax| < pI.

Démonstration. (⇒) Si l’overload checking soulève une incohérence, alors il existe un ensemble de tâches Ω tel que p > lctΩ− estΩ. Or, dans le réseau d’ordonnancement avec retards,

les capacités unitaires sur les arêtes émanant de la source empêchent de distribuer plus de lctΩ − estΩ unités de flot sur les arêtes (i, t) tel que i ∈ Ω. Comme les arêtes (i, t) tel que

i ∈ Ω ne peuvent pas être toutes saturées, la valeur du flot maximum |fmax| sera inférieure à

pI.

(⇐) Si |fmax| < pI, alors il existe une tâche i dont l’arête (i, t) n’est pas saturée. Soit Θ

l’ensemble des tâches dans la même composante fortement connexe que la tâche i (i ∈ Θ) et soit Ω = {j : estΘ≤ estj∧ lctj ≤ lctΘ}, alors p> lctΩ− estΩ et l’overload checking détecte

une incohérence.

Théorème 3.4. Le filtrage de la règle du edge-finding domine le filtrage avec les composantes fortement connexes.

Démonstration. Lors du filtrage du estid’une tâche i, si le raisonnement avec les composantes

fortement connexes et telles que esti ≤ e < esti+ pi. Aussi, il y a nécessairement une autre

tâche j ordonnancée à l’instant e et forcer l’exécution de la tâche i à l’instant e causerait un débordement. En reprenant le raisonnement de la preuve du théorème 3.3, soit Θ l’ensemble des tâches dans la même composante fortement connexe que la tâche j et soit Ω = {j0 : estΘ≤

estj0∧ lctj0 ≤ lctΘ}, alors p+ 1 > lct− est et est≤ e < lct.

Dans tous les cas, si le raisonnement avec les composantes fortement connexes engendre un filtrage du esti, Ω existe et estΩ∪{i}+ pΩ∪{i}> lctΩ.

Cas 1 : esti ≥ estΩ

pΩ+ 1 > lctΩ− estΩ∧ esti ≥ estΩ ⇒ pΩ+ 1 > lctΩ− estΩ∪{i}

⇒ pΩ∪{i}> lctΩ− estΩ∪{i}

⇒ estΩ∪{i}+ pΩ∪{i}> lctΩ

Cas 2 : esti < estΩ. Soit k = estΩ− esti. Puisque esti ≤ e < esti+ pi et estΩ ≤ e < lctΩ,

alors k = est− esti≤ e − esti < esti+ pi− esti = pi et donc 0 < k < pi.

pΩ+ 1 > lctΩ− estΩ∧ esti < estΩ ⇒ pΩ+ 1 > lctΩ− (estΩ∪{i}+ k)

⇒ pΩ+ k + 1 > lctΩ− estΩ∪{i}

⇒ pΩ∪{i}> lctΩ− estΩ∪{i} h0 < k < pii

⇒ estΩ∪{i}+ pΩ∪{i}> lctΩ

Par contraposition, s’il n’y a pas de tel ensemble Ω, alors le raisonnement avec les composantes fortement connexes n’apporte pas de filtrage. Or, un tel ensemble n’existe pas si la règle du edge-finding est cohérente. Par symétrie, cette idée peut être reprise pour démontrer la dominance avec le filtrage du lcti.

À l’issue de ce résultat, il est raisonnable de se concentrer sur le filtrage selon les retards. L’algorithme de filtrage présenté n’apporte pas de nouveau raisonnement quant à la satisfaction de la contrainte Disjunctive individuellement. Pour la suite, la contrainte Disjunctive sera cohérente pour la plupart des instances présentées dans les exemples.

3.5.4 Analyse

La complexité en temps de l’algorithme à la section 3.5.2est bornée par celle de l’algorithme de Régin [24]. Soit une instance modélisée par un réseau (N , A), la complexité de l’algorithme de plus court chemin choisi pour calculer les coûts réduits est notée P (|N |, |A|, W ) tel que W est le poids maximal d’une arête dans le réseau. Tel que mentionné à la section 2.3.2, l’algorithme de Régin [24] s’exécute en temps O(nP (|N |, |A|, W )) pour une instance de n tâches. L’algorithme de filtrage pour DisjunctiveTardiness présente la même complexité.

Cependant, dans ce contexte d’ordonnancement, la cardinalité de N et A dépend notamment de la taille des fenêtres d’exécution et des temps de traitement. L’analyse reprend les définitions d’un problème d’ordonnancement de la section 1.3.1. Soit I les tâches pour une instance du problème et n = |I|, alors :

h ∈ Ω(pI) h ∈ O(lctI− estI) |N | ∈ O(n + h) = O(h) |A| ∈ O(nh)

L’ordre de grandeur pour l’horizon ne tient pas compte des instances non satisfiables. En supposant que l’algorithme de plus court chemin utilisé est Bellman-Ford qui s’exécute en temps O(|N ||A|), la complexité en temps final est alors en O(n2h2). Une taille est dite pseudo- polynomiale si sa valeur peut s’avérer supérieure à certaines limites numériques fixées. Puisque les fenêtres d’exécution et les temps de traitement ont tous une taille pseudo-polynomiale, il en résulte un algorithme dont le temps d’exécution pourrait être beaucoup trop grand pour le nombre de tâches à traiter. Par exemple, si les temps d’exécution sont exprimés avec une précision en millisecondes et que l’horizon est en heures, même avec quelques tâches, le réseau compterait des milliers de nœuds et d’arêtes. Il est donc important de modifier le graphe pour obtenir de meilleurs temps d’exécution.

3.5.5 Flot forcé dans les parties fixes

Une amélioration envisageable pour le graphe est de forcer l’exécution des tâches dans leurs parties fixes. Cette stratégie applique un raisonnement similaire à celui de la règle du time- tabling (voir section 1.3.2). Si la fenêtre d’exécution d’une tâche i est inférieure au double de son temps de traitement, c’est-à-dire |dom(Si)| − 1 < pi, il y des instants auxquels la tâche

doit nécessairement s’exécuter dans un ordonnancement valide. Le cas échéant, ce sont les instants compris dans l’intervalle [max(dom(Si)), min(dom(Si)) + pi). En forçant la tâche à

s’exécuter à ces instants, on peut réduire le nombre de nœuds et d’arêtes dans le réseau. Une façon de procéder est de retirer les arêtes concernées dans le graphe et de réduire la capacité représentant les temps d’exécution en conséquence. Si forcer l’exécution à certains instants engendre un retard, il faut en tenir compte dans le calcul de la borne du seuil T .

Exemple 3.3. Soit une instance pour la contrainte DisjunctiveTardiness avec deux tâches comme suit :

DisjunctiveTardiness([Si, Sj], [pi = 2, pj = 1], [di = 1, dj = 2], T )

dom(Si) = [0, 1], dom(Sj) = [0, 3], dom(T ) = [1, 2]

Exécuter l’algorithme sans flot forcé détermine un ordonnancement préemptif où la tâche 1 s’exécute aux temps Ei = {0, 2} et la tâche 2 s’exécute au temps Ej = {1}. Cet ordonnan-

cement optimal engendre un retard relaxé de 1. Aucun filtrage n’est déclenché. En revanche, puisque |dom(Si)| − 1 = 2 − 1 < 2 = pi, la tâche 1 doit nécessairement s’exécuter dans l’in-

et permet d’affirmer que le retard est d’au moins T ≥ 2. Sans ce raisonnement, le seuil T ne serait pas ajusté.

Un comportement intéressant est que lorsque le solveur branche sur une valeur Si = v, tous

les nœuds d’instant dans l’intervalle [v, v + pi) sont retirés du graphe. En plus de réduire la taille du graphe, restreindre le flot de la sorte, renforce la relaxation et cause plus de filtrage. Cependant, cette technique n’est pas suffisante pour garantir que le graphe rapetisse à une taille polynomiale.

Documents relatifs