Introduction pratique à la programmation par contraintes : CP-SAT et Python
Paradigme déclaratif
- La programmation par contraintes (CP) est un paradigme déclaratif destiné à résoudre des problèmes d’optimisation discrète
- Contrairement à la programmation impérative, on décrit le résultat souhaité et le programme en déduit lui-même la solution
- Par exemple, l’article explique la différence entre une approche impérative et une approche déclarative pour extraire une liste d’adultes
Bases de la programmation par contraintes (CP)
- Modèle : description du résultat souhaité pour le problème
- Variables : valeurs à trouver, chaque variable ayant un domaine (ensemble de valeurs autorisées)
- Contraintes : description des relations entre les variables
- Solution : affectation de valeurs aux variables de façon à satisfaire les contraintes
Exemple pratique avec Python et CP-SAT
- Problème : générer le planning hebdomadaire de travail d’employés
- Création du modèle : création d’un modèle vide avec CP-SAT
- Données : définition de la liste des employés, des rôles, des jours de travail et des créneaux de service
- Définition des variables : création de variables booléennes indiquant si chaque employé travaille ou non
- Ajout de contraintes : ajout de contraintes aux variables selon la description du problème
Résolution du modèle
- Résolution : résolution du modèle pour produire un résultat
- Contraintes supplémentaires : ajout de contraintes additionnelles pour éviter les heures supplémentaires, limiter le temps de travail de certains employés ou empêcher le chevauchement des horaires entre certains employés
Au milieu : états de résolution
- État de résolution : retour d’états tels que optimal, faisable, infaisable ou inconnu
- Exemple : explication de chaque état à l’aide d’un exemple simple
« Désolé, Emma »
- État infaisable : il est impossible pour Emma d’avoir 5 jours de repos en semaine
- Proposition alternative : il est proposé qu’Emma n’ait que 3 jours de repos en semaine
Objectif : répartir équitablement le temps de travail
- Ajout d’un objectif : ajout d’un objectif afin de répartir équitablement le temps de travail
- Résultat : le temps de travail est réparti de manière équilibrée entre les employés
Conclusion
- Introduction aux concepts de base : présentation des notions fondamentales de la programmation par contraintes et explication au moyen d’un exemple pratique
- Annonce du prochain article : le prochain article expliquera comment utiliser la programmation par contraintes pour le choix d’index dans Postgres
L’avis de GN⁺
- Utilité de la programmation par contraintes : très utile pour résoudre des problèmes d’optimisation complexes
- Forces de CP-SAT : développé dans le cadre du projet OR-Tools de Google, CP-SAT offre de solides performances
- Cas d’usage concrets : applicable à des problèmes réels comme la génération de plannings de travail pour les employés
- Points à considérer pour l’adoption : lors de l’adoption d’une nouvelle technologie, il faut prendre en compte la courbe d’apprentissage et les questions d’intégration avec les systèmes existants
- Projets similaires recommandés : des solveurs commerciaux comme IBM CPLEX ou Gurobi proposent également des fonctionnalités comparables
1 commentaires
Commentaires Hacker News
J’ai déjà utilisé des solveurs de contraintes par le passé, et ces outils offrent des performances vraiment remarquables
Je suis en train de réécrire dans mon ancien livre un court chapitre qui utilise MiniZinc et Python
Beaucoup de programmes essaient d’avoir une représentation unique des données, mais dans la plupart des cas cela n’est pas rationnel
J’ai un client qui gère des stages sportifs
J’ai beaucoup utilisé des solveurs au début des années 2000
Je me demande s’il existe un CAD paramétrique qui fonctionne principalement avec un solveur de contraintes
Je me demande comment cela se compare à la programmation linéaire en nombres entiers mixtes