# Problème de gestion de projet à contraintes de ressources

Le problème de gestion de projet à contraintes de ressources est un problème d'optimisation combinatoire, étudié en ordonnancement. Il est connu sous l'acronyme anglophone RCPSP (Resource-Constrained Project Scheduling Problem).
Le problème est NP-difficile au sens fort, il ne peut donc être résolu optimalement que par des algorithmes de complexité exponentielle. L'état de l'art permet de le résoudre optimalement dans un temps raisonnable, sur des instances de 60 tâches au plus.

## Description
### Concepts

Les ressources sont des moyens de production renouvelables, mais limités en capacité. Une équipe de quatre ouvriers ayant les mêmes compétences peut être considérée comme une ressource de capacité 4.
Les tâches sont des travaux définis par une durée et une quantité de chaque ressource qui est nécessaire à son exécution. Les tâches sont supposées non-préemptives: une fois que l'exécution a commencé, elles se poursuit sans interruption jusqu'à la fin. Un bien manufacturé peut prendre deux heures de fabrication, et nécessiter le travail de deux ouvriers et d'une machine.
Il existe entre les tâches des relations de précédence, qui signifient classiquement qu'une tâche ne peut débuter que si certaines autres tâches sont finies. Ces relations permettent de représenter l'organisation du projet par un graphe de précédence (ou réseau PERT) : une tâche est figurée par un nœud, chaque relation de précédence est un arc orienté du prédécesseur vers le successeur, qui est valué par la durée du prédécesseur. Un graphe de précédence ne doit pas présenter de circuit, une tâche ne pourrait, directement ou indirectement, être son propre prédécesseur.
Classiquement, le problème consiste à minimiser la date de fin du projet, étant donné les contraintes de précédence et de ressources.

### Formalisation

Soient n tâches et q ressources.
Les ressources sont notées $R_{k}$ et leurs capacités sont notées $B_{k}$.
Les tâches sont désignées par $A_{i}$ et leurs durées sont $p_{i}$, une tâche i demande une quantité $b_{ik}$ de la ressource k. Deux tâches fictives sont ajoutées en général, elles ont une durée nulle et ne consomment pas de ressources: $A_{0}$ est le prédécesseur des autres tâches (sommet source du graphe), $A_{n+1}$ est le successeur de toutes les tâches (sommet puits du graphe de précédence). Les précédences sont déclarées par un ensemble $E=\{(i,j)/A_{i}\rightarrow A_{j}\}$.
Une solution S au problème est un vecteur de $R_{n+2}$ contenant les dates de début de chacune des tâches.
Il existe deux types de contraintes :
* les contraintes de précédence : soient des tâches $A_{i}$ et $A_{j}$ telles que $(A_{i},A_{j})\in E$ ($A_{i}$ précède $A_{j}$), $A_{j}$ ne peut pas commencer avant la fin de $A_{i}$, $S_{j}\geq S_{i}+p_{i}$
* les contraintes de ressources : à tout instant et pour chaque ressource $k$, la somme des demandes des tâches en cours d'exécution n'excède pas $B_{k}$

## Méthodes de résolution

Un certain nombre d'outils ont été employés pour résoudre le problème:
* Heuristiques
* Optimisation linéaire
* Programmation par contraintes
* Procédure par séparation-évaluation

### Algorithmes de liste

Les premières méthodes, créées dans les années 1960, sont des heuristiques à base de listes. Les listes de priorité définissent une priorisation dans l'exécution des tâches, selon des critères souvent heuristiques comme le temps de traitement de tâches ou la marge. Une liste de priorité doit respecter les contraintes de précédence.
L'algorithme d'ordre strict consiste à placer les tâches une par une, au plus tôt possible, dans l'ordre exact de la liste de priorités.

## Détermination d'une borne inférieure

Etant donnée la complexité du problème, il est souvent illusoire de vouloir déterminer des solutions exactes au problème. En recherche opérationnelle, pour évaluer concrètement une méthode de résolution, on évalue la qualité d'une solution en comparant la date de fin obtenue $C_{max}$ avec une borne inférieure $LB$. La borne inférieure est une valeur qu'on sait inférieure à la date de fin de la solution optimale, mais on doit obtenir une valeur assez haute pour bien approcher la valeur optimale. La qualité d'une solution se mesure en pourcentage d'écart avec la borne inférieure: ${\frac {C_{max}-LB}{LB}}$.

### Raisonnement énergétique
## Extensions

Le modèle basique du RCPSP a été adapté à de nombreuses applications industrielles, d'où l'apparition de variantes du problème.

### Gestion de projet multi-compétence

Cette variante est adaptée à la planification de projet dans des sociétés de service, notamment des SSII. On définit un ensemble de compétences, les ressources représentent les personnes participant au projet, la capacité de chaque ressource est 1. Une tâche ne se définit plus par des quantités exigées de chaque ressource, mais par des nombres de personnes ayant telles compétences. Par exemple, une tâche "Tests unitaires" peut nécessiter deux personnes ayant la compétence "Développeur" et une personne ayant la compétence "Analyste".

### Tâches multi-mode

Une même tâche peut être exécutée de différentes manières, ou modes. Chaque mode définit une durée propre et des demandes en ressources. Le choix d'un mode pour exécuter une tâche fait partie du problème.

### Ordonnancement robuste

Des approches d'ordonnancement robuste ont été développées pour le RCPSP. Les modèles robustes en gestion de projet considèrent quatre types de perturbations:
* perturbations du graphe de projet: des tâches (ou des liens de précédence) sont ajoutées ou supprimées
* perturbations sur les tâches: modifications des durées, des demandes
* perturbations sur les ressources: des ressources deviennent indisponibles (pannes, absences) ou leur capacité est temportairement limitée
* changements de délais