• Aucun résultat trouvé

b) Modèle temps continu

VII) Phase de prétraitement

Dans cette partie, nous repartons du modèle temps discrétisé, le modèle (3). Comme dans tout problème MILP (Mixed-Integer Linear Programming), le temps de résolution est particulièrement sensible au nombre de variables booléennes. Ici, ce nombre est donné par :

Pour réduire la complexité et le temps de résolution, il est impératif de réduire le nombre de variables. La phase de prétraitement consiste à trouver des bornes sur les valeurs de début au mieux e(i) et début au pire l(i). Pour les problèmes à ressources consommables, on utilise les contraintes disjonctives. Pour les ressources non consommables, l’idée est de comparer les courbes cumulées de ressources et de besoins.

1) Contraintes disjonctives

Il existe une contrainte disjonctive entre deux tâches A et B si les deux tâches ne peuvent pas s’exécuter en parallèle parce qu’elles utilisent plus que le disponible d’une ressource consommable. On doit donc arbitrer entre : « A avant B » et « B avant A ». Considérons le petit projet dont le diagramme de précédence des tâches est en figure 47.

Figure 47 : diagramme de précédence des tâches d’un petit projet

On dispose de 3 ouvriers. A et B demandent la présence de 2 ouvriers, C et D en demandent un seul. Il existe donc une contrainte disjonctive entre A et B. Sans cette contrainte, D peut commencer au plus tôt à la date 12.

Si l’arbitrage est « A avant B », D peut commencer au plus tôt à la date 15. Le diagramme de précédence des tâches est modifié, comme indiqué à la figure 48.

Figure 48 : diagramme de précédence des tâches d’un petit projet avec l’arbitrage « A avant B »

Si l’arbitrage est « B avant A », D peut commencer au plus tôt à la date 19. Le diagramme de précédence des tâches est modifié, comme indiqué à la figure 49.

En tout état de cause, la contrainte disjonctive implique que D peut commencer au plus tôt à 15.

Ici par exemple, à cause de la grue louée, on doit arbitrer entre rénover B1 ou B2 en premier. Le démontage de la grue DmGru commencera au mieux à la date 7.

Une limite de cette approche pour notre problème vient de la difficulté à déterminer les contraintes disjonctives lorsque la disponibilité des ressources peut varier dans le temps. Par exemple, si l’on dispose de 4 ouvriers du jour 5 à 8, A et B peuvent s’exécuter en parallèle sur ces 4 jours.

2) Courbes cumulées de ressources et de besoins

(Carlier, Chrétienne, 1988) propose un algorithme exact dit « algorithme de décalage » pour trouver le retard minimal induit par une seule ressource consommable (par exemple, des fonds versés par une banque). Initialement, on calcule l’ordonnancement sans tenir compte de la ressource. Puisque la ressource est nécessaire pour démarrer une tâche, l’idée assez naturelle est de commencer les tâches au plus tard en espérant que la ressource sera arrivée. On compare donc le besoin cumulé en se basant sur les dates de début au plus tard et la disponibilité cumulée.

Reprenons l’exemple d’application présenté précédemment. Chaque tâche demande 10 k€ pour débuter. La banque verse 3 k€ chaque jour jusqu’à versement des 40 k€. Le tableau 19 donne le diagramme des tâches calées au plus tard, les besoins induits et les versements.

Date 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Gantt au A C D

plus tard B

Besoin cumulé 10 10 10 10 10 20 20 20 30 30 30 30 40 40 40 Disponibilité 3 6 9 12 15 18 21 24 27 30 33 36 39 40 40

Tableau 19 : diagramme des tâches calées au plus tard de l’exemple d’application

On constate que A ne pourra pas débuter avant le jour 4 (retard 4), B avant 7 (retard 2), C avant 10 (retard 1) et D avant 14 (retard 1). Au mieux, la fin de projet sera en 19 au lieu de 15. On obtient une solution réalisable en fixant comme date de début minimale de chaque tâche la date de début au plus tard plus le décalage et en recalculant le PERT (Program ou Project Evaluation and Review Technique) sans ressources correspondantes.

3) Méthode proposée

Dans notre problème, les deux types de ressource se rencontrent. Les bornes que l’on peut obtenir par les méthodes précédentes ne sont pas suffisantes. Dans notre petit projet, si nous avons à la fois la contrainte due aux ouvriers et la contrainte due aux versements, la solution optimale minimisant la durée du chantier est de 21 jours (tableau 20).

Date 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Gantt A C D B Besoin cumulé 0 0 0 10 10 10 10 10 10 10 10 30 30 30 30 30 30 30 40 40 40 Disponibilité 3 6 9 12 15 18 21 24 27 30 33 36 39 40 40 40 40 40 40 40 40

Tableau 20 : diagramme des tâches optimal de l’exemple d’application

Pour prendre en compte l’ensemble des ressources, nous avons utilisé le modèle (3) :

- en relaxant la contrainte sur le caractère booléen des X(i,t) (suppression des équations (3.19) ;

- en prenant comme fonction objectif (3.1) : minimiser la date de début de la tâche i : Min = S(i).

Initialement : e(i) = 0, l(i) = T i. Ce modèle est donc linéaire. Il donne comme résultats des valeurs X(i,t) réelles et inférieures à 1 du fait de l’équation (3.2). En l’appliquant à l’ensemble des tâches, on obtient ainsi une borne inférieure (réelle) de leurs débuts. Sur l’exemple d’application, on obtient les résultats présentés au tableau 21.

Tâche A 2,2 Tâche B 2,2 Tâche C 11,1 Tâche D 16,0

Tableau 21 : valeurs initiales des débuts au mieux e(i) de l’exemple d’application

Ces premières valeurs permettent de fixer des X(i,t) à 0 : X(1,A) = X(2,A) = 0

X(1,B) = X(2,B) = 0

X(1,C) = X(2,C) = … = X(11,C) = 0 X(1,D) = X(2,D) = … = X(15,C) = 0

Compte tenu de ces connaissances acquises, nous allons réitérer les calculs pour affiner les bornes jusqu’à stabilisation (pas de nouvelles valeurs X(i,t) mises à 0). Cet algorithme est fini puisque le nombre de X(i,t) l’est. Dans l’exemple d’application, ceci se fait en 4 itérations. Les résultats sont présentés au tableau 22.

e(i) Itération 1 Itération 2 Itération 3 Itération 4

Tâche A 2,2 3,1 4,0 4,0

Tâche B 2,2 3,1 4,0 4,0

Tâche C 11,1 12,0 12,0 12,0

Tâche D 16,0 16,0 16,0 16,0

Tableau 22 : calcul itératif des débuts au mieux e(i) de l’exemple d’application

Pour obtenir les dates de début au pire l(i), nous utilisons la même méthode en prenant cette fois comme fonction objectif la maximisation de la date de début : Max S(i).

Soit fp une date de fin réaliste du projet (obtenue en utilisant une heuristique par exemple). Les valeurs e(i) sont celles précédemment trouvées. Initialement : l(i) = fp i.

Sur l’exemple d’application, en prenant fp = 23, on trouve la solution en deux itérations. Les résultats sont présentés au tableau 23.

l(i) Itération 1 Itération 2

Tâche A 8,0 8,0

Tâche B 13,0 13,0

Tâche C 16,0 16,0

Tâche D 20,0 20,0

Tableau 23 : calcul itératif des débuts au pire l(i) de l’exemple d’application