OR-Tools — Lissage de charge multi-ressources (CP-SAT)

Chaque tâche est affectée à une ressource autorisée (compétence) et démarre dans sa fenêtre. Le solveur minimise le pic de charge journalière par ressource.

Ressources

ID tâche · Charge par jour actif · Durée (jours consécutifs) · Earliest / Latest de démarrage · Team : nombre de ressources requises simultanément (1 par défaut) · Autorisées : sous-ensemble de ressources pouvant exécuter la tâche.

IDChargeDuréeELTeamAutorisées
Pic naïf
Pic lissé
Charge max / ressource
Statut

Planning résolu (par ressource)

📐 Modèle mathématique (CP-SAT multi-ressources)

Données

Tâches $T$, ressources $R$, horizon $H$. Tâche $i$ : charge $\ell_i$, durée $p_i$, fenêtre $[e_i, f_i]$, ressources autorisées $S_i \subseteq R$.

Variables de décision

$$ s_i \in \{e_i,\dots,f_i\},\quad x_{i,r} \in \{0,1\}\;(r\in S_i),\quad a_{i,d} \in \{0,1\},\quad P \in \mathbb{Z}_{\ge 0} $$

Contraintes

Taille d'équipe imposée (exactement $N_i$ ressources choisies parmi $S_i$, $N_i=1$ par défaut) :

$$ \sum_{r \in S_i} x_{i,r} = N_i \quad \forall i $$

Activité ↔ début : $a_{i,d}=1 \iff s_i \le d \le s_i+p_i-1$ (réification avec 2 booléens auxiliaires).

Charge par ressource et pic :

$$ L_{r,d} = \sum_{i:\, r \in S_i} \ell_i \cdot (a_{i,d} \wedge x_{i,r}),\qquad P \ge L_{r,d}\;\;\forall r, d $$

Le produit $a \wedge x$ est linéarisé par une variable auxiliaire $z_{i,r,d}$ avec AddBoolAnd / AddBoolOr.

Objectif

$$ \boxed{\;\min\; P \;=\; \min\; \max_{r,d}\; \sum_{i:\,r\in S_i} \ell_i \cdot (a_{i,d}\wedge x_{i,r})\;} $$

Traduction en code (app.py)

s_iNewIntVar  ·  x_{i,r}NewBoolVar + Add(Σ x_{i,r} == N_i)  ·  a_{i,d} → booléen + réif. OnlyEnforceIf  ·  z = a ∧ xAddBoolAnd / AddBoolOr  ·  P ≥ L_{r,d} → contrainte linéaire  ·  Minimize(P).