Aller au contenu
Planopti logoPlanopti
A proposSolutionLicenceFAQ
FR|EN
Nous contacter
A proposSolutionLicenceFAQNous contacter
FR|EN
Planopti/Blog/Recherche Multi-Thread CP-SAT

Recherche Multi-Thread dans CP-SAT

Comment les workers paralleles ameliorent les resultats de planification

  • Pas du parallelisme de donnees
  • Strategies de recherche
  • Comment les workers collaborent
  • Impact de num_workers
  • Benchmarks
  • Rendements decroissants
  • Considerations memoire
  • Configuration pratique
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

Pas du parallelisme de donnees

Une idee recue courante : quand vous configurez num_workers = 8 dans CP-SAT, le solveur ne decoupe PAS votre probleme de planification en 8 morceaux. Il n'assigne pas les employes 1-37 au worker 1 et les employes 38-75 au worker 2. Ce serait du parallelisme de donnees, et cela ne fonctionne pas pour la programmation par contraintes.

A la place, CP-SAT utilise du parallelisme de portfolio. Chaque worker execute une strategie de recherche differente sur le probleme complet. Les 8 workers voient chaque employe, chaque shift, chaque contrainte. Ce qui differe, c'est la maniere dont ils explorent l'espace des solutions. Ils partagent leurs meilleures solutions et bornes en temps reel, de sorte que chaque decouverte d'un worker beneficie a tous les autres.

Cette distinction est importante car elle explique pourquoi ajouter des workers ameliore la qualite des solutions, pas seulement la vitesse. Plus de workers signifie plus de strategies de recherche diverses executees simultanement, ce qui augmente les chances de trouver de meilleures solutions.

Strategies de recherche

CP-SAT execute plusieurs strategies de recherche simultanement, chacune adaptee a differents aspects du probleme :

Recherche par defaut (branch-and-bound)

L'approche classique. Choisir une variable, essayer une valeur, propager les contraintes, revenir en arriere si ca echoue. CP-SAT utilise la reduction de domaine pour elaguer les valeurs impossibles avant de brancher. Cette strategie est methodique et exhaustive mais peut etre lente sur les grands problemes.

Large Neighborhood Search (LNS)

Partir de la meilleure solution courante, detruire un sous-ensemble aleatoire d'affectations (par exemple desaffecter 20% des paires employe-jour), puis reparer la partie detruite en gardant le reste fixe. Le LNS est excellent pour ameliorer incrementalement de bonnes solutions. C'est souvent lui qui trouve la meilleure solution finale dans les problemes de planification.

Relaxation lineaire

Relacher les variables booleennes en valeurs continues (autoriser 0.5 au lieu de seulement 0 ou 1), puis resoudre le programme lineaire resultant. La solution LP fournit une borne inferieure sur l'objectif. Cette borne indique a tous les autres workers : "aucune solution ne peut scorer en dessous de cette valeur", ce qui elague leurs arbres de recherche.

Recherche basee sur les cores

Trouver des cores insatisfaisables minimaux : de petits sous-ensembles de contraintes souples qui ne peuvent pas tous etre satisfaits simultanement. Cette strategie identifie quels compromis sont inevitables, aidant le solveur a se concentrer sur des ameliorations realistes plutot que de poursuivre des objectifs impossibles.

Recherche fixe

Suivre un ordre fixe de variables, typiquement base sur la structure du probleme. Pour la planification, cela peut signifier affecter les shifts jour par jour ou employe par employe. Previsible mais rapide, et trouve parfois de bonnes solutions que les strategies aleatoires manquent.

Recherche aleatoire avec redemarrages

Prendre des decisions de branchement aleatoires, mais redemarrer frequemment. Le caractere aleatoire apporte de la diversite, et les redemarrages empechent la recherche de rester bloquee dans des regions improductives. Combinee avec les clauses apprises des redemarrages precedents, cette strategie peut etre etonnamment efficace.

Quand un worker trouve une meilleure solution, tous les autres mettent a jour leurs bornes immediatement. Si le worker LNS ameliore le score de 95 000 a 88 000, le worker branch-and-bound peut desormais elaguer tout sous-arbre qui donnerait un score superieur a 88 000.

Comment les workers collaborent

Le mecanisme cle est un pool de solutions partage. Tous les workers lisent et ecrivent dans le meme pool. La collaboration fonctionne ainsi :

Supposons que le worker 1 (branch-and-bound) trouve une solution initiale avec un score de 120 000. Cette solution est immediatement visible par tous les autres workers. Le worker 3 (LNS) prend cette solution, en detruit et repare des parties, et trouve un score de 95 000. Maintenant tous les workers connaissent l'objectif : battre 95 000.

Le worker 2 (relaxation lineaire) calcule une borne inferieure de 82 000. Cela signifie qu'aucune solution ne peut scorer en dessous de 82 000. L'ecart entre 95 000 (meilleur trouve) et 82 000 (meilleur theorique) indique au solveur la marge d'amelioration restante.

Le worker 4 (LNS avec un schema de destruction different) trouve 88 000. Le worker 5 (base sur les cores) identifie que 3 000 points de penalite sont inevitables a cause de contraintes conflictuelles. La borne inferieure se resserre a 85 000. L'ecart se reduit de 13 000 a 3 000.

Cette convergence se produit sans aucune coordination explicite entre les workers. Chaque worker fait simplement son travail, mais chaque amelioration se propage instantanement a tous les autres. L'effet est multiplicatif : chaque worker rend tous les autres workers plus efficaces en reduisant l'espace de recherche.

Impact de num_workers

Voici ce qui se passe quand on fait varier num_workers sur un probleme reel de planification (200 employes, 30 jours, 50 types de shifts, limite de 5 minutes) :

WorkersTemps de resolutionMeilleur scoreAmelioration vs 1 worker
130+ minutes125 000reference
218 minutes110 00012% meilleur
412 minutes98 00022% meilleur
88 minutes92 00026% meilleur
167 minutes90 00028% meilleur

Deux choses ressortent. D'abord, l'amelioration de la qualite des solutions est substantielle : 8 workers trouvent un score 26% meilleur qu'un seul worker sur le meme probleme. Ce n'est pas qu'une question de vitesse. La diversite des strategies de recherche decouvre des solutions qu'une seule strategie ne trouverait jamais dans un temps raisonnable.

Ensuite, l'amelioration de vitesse est super-lineaire jusqu'a 4 workers. Un worker a besoin de 30+ minutes ; 4 workers ont besoin de 12 minutes. C'est une acceleration de 2.5x pour une augmentation de 4x du calcul, mais la solution est aussi 22% meilleure. La vraie valeur est la combinaison d'une convergence plus rapide et d'une meilleure qualite de solution.

Benchmarks

Mesures sur differentes tailles de probleme sur un serveur standard (16 coeurs, 32 Go RAM), avec une limite de 10 minutes :

Employes1 worker4 workers8 workers16 workers
1008 min / 95k3 min / 82k2 min / 78k1.8 min / 77k
15015 min / 115k6 min / 95k4 min / 88k3.5 min / 85k
20030+ min / 125k12 min / 98k8 min / 92k7 min / 90k
300timeout25 min / 145k15 min / 120k12 min / 115k

Format : temps de resolution / meilleur score (score plus bas = meilleur planning). "Timeout" signifie que le solveur n'a pas trouve de solution satisfaisante dans la limite de temps avec un seul worker.

La ligne a 300 employes est particulierement revelante. Un seul worker ne peut pas resoudre ce probleme dans un temps raisonnable. Avec 4 workers, cela devient tractable. Avec 8, c'est pratique. L'ecart entre 8 et 16 workers est modeste, suggerant que 8 workers captent l'essentiel du benefice pour cette taille de probleme.

Rendements decroissants

La relation entre le nombre de workers et la performance suit une courbe de rendements decroissants :

  • 1 a 4 workers : amelioration spectaculaire. Chaque nouveau worker ajoute une strategie de recherche fondamentalement differente. Le worker de relaxation LP fournit des bornes que le worker branch-and-bound ne pourrait pas calculer seul. Le worker LNS ameliore les solutions trouvees par la recherche par defaut. C'est la ou vous obtenez les plus gros gains.
  • 4 a 8 workers : amelioration forte. Les workers supplementaires executent des variations des strategies principales (LNS avec differentes tailles de destruction, recherche aleatoire avec differentes politiques de redemarrage). La recherche devient plus robuste et moins susceptible de rester bloquee.
  • 8 a 16 workers : amelioration moderee. Les workers supplementaires executent principalement plus de variations des strategies existantes. Vous gagnez 10-20% en qualite de solution et temps de resolution, ce qui compte pour les grands problemes mais n'est pas transformateur.
  • Au-dela de 16 : amelioration marginale. CP-SAT dispose d'un nombre fini de strategies distinctes. Au-dela de 16 workers, vous executez principalement des doublons avec des graines aleatoires legerement differentes. Le pool de solutions partage devient le goulot d'etranglement car les workers passent plus de temps a se synchroniser qu'a chercher.

La diversite des strategies de recherche compte plus que le parallelisme brut. Huit workers executant huit strategies differentes surpasseront seize workers executant huit strategies deux fois.

Considerations memoire

Chaque worker maintient son propre arbre de recherche, ses structures de propagation et sa base de clauses. La consommation memoire evolue de maniere a peu pres lineaire avec le nombre de workers.

Taille du modele1 worker4 workers8 workers16 workers
100 employes200-400 Mo500 Mo - 1 Go1-2 Go2-3 Go
200 employes400-800 Mo1-2 Go2-4 Go4-6 Go
300 employes600 Mo - 1 Go1.5-3 Go2-4 Go4-8 Go

Pour un serveur de planification dedie executant un modele de 300 employes avec 8 workers, prevoyez 4 Go de RAM minimum, 8 Go recommandes. Avec 16 workers, 8 Go minimum, 16 Go recommandes. Le systeme d'exploitation et les autres processus ont aussi besoin de memoire.

La consommation memoire depend aussi du temps de resolution. Les executions plus longues accumulent plus de clauses apprises, qui consomment de la memoire. Si vous constatez une croissance memoire dans le temps, vous pouvez definir une limite de base de clauses ou reduire la limite de temps.

En pratique, 16 Go de RAM suffisent pour tout probleme de planification de moins de 300 employes avec 8 workers. Cela tient confortablement sur un serveur on-premise standard.

Configuration pratique

La configuration recommandee pour un serveur de planification en production :

from ortools.sat.python import cp_model

solver = cp_model.CpSolver()
solver.parameters.num_workers = 8
solver.parameters.max_time_in_seconds = 300
solver.parameters.log_search_progress = True

Choisir num_workers

Reglez num_workers sur le nombre de coeurs CPU physiques de votre serveur. Pas les coeurs logiques (hyperthreading) mais les coeurs physiques. Les workers CP-SAT sont CPU-bound, et l'hyperthreading apporte un benefice minimal pour la resolution de contraintes.

Pour un serveur de planification dedie, 8 coeurs est le point optimal. Cela capture l'essentiel du benefice du parallelisme (le saut de 4 a 8 est encore significatif), tout en gardant les couts materiels raisonnables. Passer a 16 coeurs donne 10-20% d'amelioration pour environ le double du cout.

Surveiller la progression de la recherche

Activez log_search_progress = True pour voir quels workers trouvent des solutions et quand. Les logs affichent des lignes comme :

#1  0.5s  best:120000  next:[95000,120000]  lns
#3  1.2s  best:95000   next:[88000,95000]   default
#5  2.8s  best:88000   next:[85000,88000]   core

Cela vous indique quelles strategies de recherche sont productives. Si le LNS trouve la plupart des ameliorations, le probleme beneficie de la recherche locale. Si la recherche par defaut domine, le probleme a une bonne structure que le branch-and-bound peut exploiter. Ces informations vous aident a ajuster les limites de temps et a comprendre votre probleme.

Limite de temps

Avec 8 workers, les limites de temps typiques par taille de probleme :

  • 100 employes : 2-3 minutes suffisent generalement
  • 150 employes : 5 minutes
  • 200 employes : 10 minutes
  • 300 employes : 15-20 minutes

Le comportement anytime de CP-SAT signifie que vous obtenez toujours la meilleure solution trouvee jusque-la, meme si vous arretez tot. Une limite de temps plus courte donne un score legerement moins bon, pas un resultat vide. Cela rend securise de definir des limites agressives pendant les tests et plus longues pour les executions en production.

Tester CP-SAT sur vos donnees de planification ?

Envoyez-nous votre liste d'employes et vos definitions de shifts. Nous lancerons des benchmarks multi-thread et vous montrerons les resultats.

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.