Aller au contenu
Planopti logoPlanopti
A proposSolutionLicenceFAQ
FR|EN
Nous contacter
A proposSolutionLicenceFAQNous contacter
FR|EN
Planopti/Blog/Modeliser l'equite en planification

Modeliser l'equite en planification du personnel avec CP-SAT

Contraintes d'equite, equilibrage min-max et poids configurables

  • Pourquoi l'equite compte
  • Equite de charge
  • Equite par qualification
  • L'approche min-max
  • Exclure les absences
  • L'equite parfaite est impossible
  • Poids configurables
  • Mesurer l'equite
Blog
  • Technical
  • Modelisation CP-SAT
  • Tuning CP-SAT
  • Dures vs Souples
  • Equite
  • CP-SAT vs MIP
  • Exceptions
  • Excel vers CP-SAT
  • Recherche Multi-Thread
  • Business
  • Automatiser le Rostering
  • Conformite
  • Integration
  • Limites Excel
  • Masse Salariale
  • Ground Handling
  • CCT & Conventions

Pourquoi l'equite compte

L'equite en planification est une question de perception et de mathematiques. Quand les employes sentent que le planning est injuste, cela erode la confiance, augmente le turnover et genere des reclamations qui consomment du temps de management. Le probleme est que la planification manuelle cree des biais systematiques, non par intention, mais parce que les planificateurs humains tendent a reproduire des schemas familiers. L'employe qui est "bon le matin" a toujours les matinees. Celui qui ne se plaint jamais recoit les pires shifts.

Ces biais se cumulent sur des mois. A la fin d'un trimestre, certains employes ont travaille 10% de jours de plus que leurs collegues du meme groupe. D'autres ont ete affectes exclusivement a une seule fonction malgre trois qualifications. Personne ne l'a planifie ainsi. C'est simplement arrive parce qu'aucun humain ne peut suivre les totaux cumulatifs de 70 employes sur 30 jours tout en assurant simultanement la couverture, les repos et la rotation des weekends.

Un solveur CP-SAT le peut. L'equite devient un objectif mathematique : minimiser l'ecart entre l'employe qui travaille le plus et celui qui travaille le moins. Le solveur suit chaque affectation, chaque fonction, chaque groupe, simultanement. L'equite n'est pas une reflexion apres coup. Elle est integree dans la fonction objectif.

Equite de charge : equilibrer les jours travailles

La premiere dimension de l'equite est simple : au sein de chaque groupe fonctionnel, chaque employe devrait travailler approximativement le meme nombre de jours par mois. Si un groupe compte 7 employes et que l'operation necessite 4 personnes par jour pendant 23 jours ouvrables, cela fait 92 personnes-jours. Divise par 7, chaque employe devrait travailler environ 13 jours.

En pratique, le solveur ne peut pas toujours atteindre une repartition parfaite. Mais il peut minimiser l'ecart entre le maximum et le minimum. La penalite pour l'inequite de charge est definie par groupe :

# Pour chaque groupe g :
gap = max_jours_travailles[g] - min_jours_travailles[g]
penalty += gap * WEIGHT_WORKLOAD_EQUITY

Le poids de 50 par unite d'ecart signifie que chaque jour supplementaire de desequilibre coute 50 points. Un ecart de 2 coute 100. Un ecart de 0 ne coute rien. Le solveur pousse naturellement vers le plus petit ecart realisable.

C'est une contrainte souple, pas dure. Si le solveur doit choisir entre laisser un shift non couvert (penalite 10 000) ou creer un ecart de charge de 1 jour (penalite 50), il choisira toujours l'ecart. La couverture gagne. Mais quand la couverture est realisable, le solveur distribue le travail aussi equitablement que possible.

Equite par qualification : equilibrer entre fonctions

L'equite de charge seule ne suffit pas. Prenons un employe qualifie pour la securite (AVSEC) et la logistique (CARGO). Si le solveur l'affecte exclusivement a des shifts securite pendant tout le mois, il travaille le meme nombre de jours que ses collegues, mais il ne touche jamais a la logistique. Pendant ce temps, un autre employe recoit tous les shifts logistique.

Cela cree deux problemes. D'abord, c'est percu comme injuste : certaines fonctions sont considerees comme plus ou moins souhaitables. Ensuite, cela cree une perte de competence : les employes qui ne pratiquent jamais une qualification perdent en maitrise. L'equite par qualification repond aux deux.

# Pour chaque groupe g, pour chaque fonction f :
gap = max_shifts_dans_f[g] - min_shifts_dans_f[g]
penalty += gap * WEIGHT_QUALIF_EQUITY

Le poids de 500 par unite est 10 fois superieur a l'equite de charge. Cela reflete un choix de conception delibere : a charge totale egale, le solveur devrait fortement preferer une distribution equilibree entre les fonctions. Un employe qui travaille 14 jours repartis 7/7 entre deux fonctions est un meilleur resultat qu'un qui travaille 14 jours entierement dans une seule fonction, meme si le total de jours est identique.

L'approche min-max dans CP-SAT

Les deux objectifs d'equite utilisent le meme patron de modelisation : minimiser la difference entre les valeurs maximale et minimale au sein d'un groupe. Dans CP-SAT, cela s'exprime avec des variables entieres et des contraintes d'inegalite.

# Creer des IntVar pour le max et le min dans un groupe
max_days = model.NewIntVar(0, 30, 'max_days_g')
min_days = model.NewIntVar(0, 30, 'min_days_g')

# Contraindre max >= le compte de chaque employe, min <= le compte de chaque employe
for e in group:
    model.Add(max_days >= worked_days[e])
    model.Add(min_days <= worked_days[e])

# Definir l'ecart
gap = model.NewIntVar(0, 30, 'gap_g')
model.Add(gap == max_days - min_days)

# Ajouter a l'objectif
model.Minimize(gap * PENALTY_WEIGHT)

Le solveur assigne des valeurs a max_days et min_days qui satisfont toutes les contraintes d'inegalite. Comme on minimise l'ecart, le solveur est incite a pousser max_days vers le bas et min_days vers le haut, ce qui revient a distribuer le travail aussi uniformement que possible dans le groupe.

Ce patron est repete pour chaque groupe (equite de charge) et pour chaque paire groupe-fonction (equite par qualification). Pour une operation avec 8 groupes et 6 fonctions, cela cree 8 ecarts de charge et jusqu'a 48 ecarts par qualification, chacun contribuant independamment a la penalite totale.

Pourquoi min-max et pas l'ecart-type ?

L'ecart-type est une mesure naturelle de dispersion, mais il est quadratique et ne se decompose pas proprement dans un modele CP lineaire. L'ecart min-max est lineaire, facile a exprimer en contraintes CP-SAT, et directement interpretable : un ecart de 2 signifie que l'employe le plus charge a travaille exactement 2 jours de plus que le moins charge. Pas d'abstraction statistique necessaire.

Exclure les absences du calcul d'equite

Un employe en vacances pendant 10 jours sur un mois de 30 jours peut travailler au maximum 20 jours. Si le reste de son groupe travaille 22-23 jours, l'ecart est d'au moins 2-3 jours, et le solveur ne peut pas le combler. Inclure cet employe dans le calcul d'equite penalise le solveur pour quelque chose qu'il ne controle pas.

La solution est directe : les employes avec des contraintes HOLIDAY ou VACATION sont exclus du calcul d'equite pour le groupe concerne. Le solveur ne mesure l'ecart que parmi les employes pleinement disponibles (ou au moins egalement contraints).

# Construire le groupe d'equite en excluant les absents
equity_group = [e for e in group if not has_long_absence(e)]

# Calculer le min-max uniquement sur equity_group
for e in equity_group:
    model.Add(max_days >= worked_days[e])
    model.Add(min_days <= worked_days[e])

De meme, les employes de type "etudiant" sont exclus des calculs d'equite weekend. Les etudiants ont des schemas de disponibilite differents et des obligations contractuelles differentes. Les inclure dans la garantie de weekend penaliserait le solveur injustement ou forcerait le solveur a donner aux etudiants des weekends dont ils n'ont pas besoin, au detriment des employes a temps plein qui en ont besoin.

L'equite parfaite est impossible

Prenons un exemple concret. Un groupe de 7 employes, 23 jours ouvrables dans le mois, besoin journalier de 4 employes. Cela fait 92 personnes-jours pour 7 personnes. 92 / 7 = 13,14 jours chacun. Comme on ne peut pas travailler une fraction de jour, la meilleure repartition possible est :

  • 4 employes travaillent 13 jours
  • 3 employes travaillent 14 jours

Total : (4 × 13) + (3 × 14) = 52 + 42 = 94. En fait, ce total de 94 ne correspond pas exactement a 92. La repartition reelle depend des besoins de couverture exacts et des autres contraintes (repos, weekends, qualifications). Le point important est qu'un ecart de 0 est mathematiquement impossible quand le total ne se divise pas exactement. Un ecart de 1 est le minimum theorique.

Le solveur trouve cela automatiquement. Il n'a pas besoin qu'on lui dise qu'un ecart de 1 est acceptable. Il minimise simplement l'ecart, atteint le plancher mathematique, et passe a l'amelioration des autres objectifs. C'est l'un des atouts d'une approche par penalites : le solveur decouvre l'optimum realisable sans qu'on lui donne une cible explicite.

Quand l'ecart est plus grand que prevu

Si le solveur produit un ecart de 3 ou plus dans un groupe, cela signifie que d'autres contraintes interferent. Causes frequentes :

  • Trop peu d'employes qualifies pour une fonction specifique, forcant les memes personnes a la couvrir de maniere repetee
  • Les contraintes de repos (regle des 11 heures) creant des effets en chaine qui limitent la flexibilite de planification
  • Des absences fixes (FIXED_OFF) reparties de maniere inegale dans le groupe

La decomposition des penalites rend ces causes visibles. Une penalite d'equite elevee est un signal de diagnostic, pas un echec du solveur.

Poids configurables

Les poids par defaut (50 pour l'equite de charge, 500 pour l'equite par qualification) refletent une priorite equilibree ou l'equite compte mais la couverture gagne toujours. Ces poids sont configurables dans les parametres du solveur.

ObjectifPoids par defautEffet d'une augmentation
Equite de charge (jours)Tres faibleEquilibrage plus strict des jours travailles par groupe
Equite par qualification (shifts/fonction)FaibleEquilibrage plus strict des types de shifts entre fonctions
Couverture manquanteTres elevePreference encore plus forte pour la couverture complete
Jours de repos manquantsMoyenGarantie plus forte des jours de repos contractuels

Augmenter le poids de l'equite de charge de 50 a 500 fait que le solveur traite un ecart de 1 jour aussi serieusement qu'un jour de repos manquant. Cela produit des plannings plus equilibres mais peut degrader la couverture dans les situations tendues. Le solveur peut laisser un shift non couvert plutot que de creer un desequilibre de charge.

L'insight cle est que le reglage des poids est un compromis, pas une amelioration gratuite. Des poids d'equite plus eleves ne creent pas plus d'employes. Ils redistribuent la meme force de travail plus uniformement, potentiellement au detriment d'autres objectifs. Un planificateur qui met l'equite a 10 000 (egal a la couverture) dit au solveur : "je prefere un shift non couvert a un planning inequitable." C'est peut-etre le bon choix pour certaines operations, mais cela doit etre un choix delibere.

Mesurer l'equite

Apres l'execution du solveur, la decomposition des penalites montre l'ecart d'equite par groupe. C'est la metrique principale d'equite. Voici ce que differentes valeurs d'ecart signifient en pratique :

Ecart (jours)EvaluationCause typique
0Equite parfaiteLa taille du groupe divise exactement le total de personnes-jours
1ExcellentArrondi normal (resultat le plus frequent)
2BonInterference mineure de contraintes (repos, weekends)
3AcceptableGoulot d'etranglement de qualification ou absences inegales
4+A investiguerDesequilibre structurel : trop peu d'employes qualifies, ou contraintes dures en conflit

Pour l'equite par qualification, la meme logique s'applique par fonction. Un ecart de 0-1 shifts par fonction est excellent. Un ecart de 3+ dans une fonction specifique suggere que trop peu d'employes dans le groupe detiennent cette qualification, forcant le solveur a sur-affecter ceux qui la possedent.

Equite entre les mois

Le solveur optimise un mois a la fois. Il ne reporte pas les donnees d'equite des mois precedents. Si un employe a travaille plus en janvier, le solveur de fevrier ne le sait pas. L'equite inter-mensuelle necessite soit un ajustement manuel des donnees d'entree (par exemple ajuster les cibles en fonction du mois precedent), soit une couche meta qui suit l'equite cumulative. C'est une decision operationnelle, pas une limitation du solveur.

Rapporter l'equite aux planificateurs

Le rapport du solveur inclut des statistiques d'equite par groupe : le min, le max et l'ecart pour les metriques de charge et de qualification. Un planificateur peut parcourir le rapport et identifier immediatement quels groupes sont bien equilibres et lesquels necessitent une attention. Si un groupe affiche systematiquement un ecart de 4+, la solution est generalement structurelle : ajouter un employe avec la qualification manquante, ou diviser le groupe en unites plus petites et plus homogenes.

Voir les metriques d'equite sur vos donnees ?

Envoyez-nous votre liste d'employes et votre matrice de qualifications. Nous lancerons le solveur et vous montrerons la decomposition d'equite par groupe.

Nous contacter
Planopti

Planification automatisee du personnel pour les industries reglementees. Solveur CP-SAT on-premise.

[email protected]

Navigation

A propos Solution Licence FAQ Nous contacter

Pages

Technologie Google OR-Tools CP-SAT Solver Planification Blog

Legal

Contrat de maintenance Confidentialite RGPD
© 2026 Planopti SA. Tous droits reserves.