Modéliser une décision
Ce que ce chapitre apporte6 points
- Distinguer, dans une situation d'atelier, la décision, la solution, les contraintes et l'objectif.
- Écrire une fonction de coût qui évalue une solution, et un test qui dit si elle est réalisable.
- Reconnaître une solution réalisable, l'optimum, une instance, l'espace des solutions.
- Juger une représentation d'une solution : ce qu'elle laisse passer d'impossible, ce qu'elle interdit d'utile.
- Choisir entre une contrainte dure et une pénalité, et régler le poids d'une pénalité en mesurant.
- Évaluer une solution en Python, sans la chercher.
Une décision de la semaine
Décider quand les choix sont nombreux et les ressources limitées est le métier de la recherche opérationnelle (operations research en anglais). Quand les choix sont des objets qu'on peut énumérer (des sélections, des ordres, des affectations), on parle d'optimisation combinatoire : c'est le cadre de ce parcours.
Valdrome Mécanique est une entreprise d'usinage et d'assemblage d'une centaine de personnes : un atelier de machines-outils, une perceuse à commande numérique, un poste de découpe de barres et de tôles, des postes d'assemblage. Ses problèmes reviendront tout au long de ce parcours, toujours avec les mêmes données, pour que deux méthodes puissent se comparer sur le même cas.
Le premier est celui du lundi. Dix commandes attendent. Chacune consomme des heures de machine et rapporte une marge, et il y a cent heures de machine disponibles cette semaine.
| Commande | Désignation | Heures machine | Marge (€) |
|---|---|---|---|
| C1 | Carters de pompe | 38 | 5 200 |
| C2 | Bagues de guidage | 12 | 1 300 |
| C3 | Supports moteur | 27 | 3 300 |
| C4 | Arbres cannelés | 45 | 6 100 |
| C5 | Brides DN80 | 18 | 2 100 |
| C6 | Boîtiers de capteur | 22 | 2 900 |
| C7 | Platines de fixation | 9 | 800 |
| C8 | Pignons | 31 | 4 300 |
| C9 | Galets | 14 | 1 900 |
| C10 | Entretoises | 7 | 600 |
La commande n'est pas divisible : on lance C4 en entier ou pas du tout. La question est simple à poser. Quelles commandes lancer, pour que la marge soit la plus grande possible sans dépasser les cent heures ? C'est un problème de sac à dos (knapsack en anglais) : des objets qui ont chacun un poids et une valeur, un sac dont la capacité ne se dépasse pas.
Avant de modéliser quoi que ce soit, essayer à la main. La figure suivante dessine la semaine de machine comme un conteneur gradué en heures, et chaque commande comme une caisse dont la hauteur est proportionnelle à ses heures. Le but est de charger la sélection la plus rentable qui tienne dans les cent heures. La figure ne dit pas où se trouve la meilleure : elle ne répond qu'à une proposition, une fois celle-ci soumise.
- Heures
- 0 / 100
- Marge
- 0 €
- Capacité
- respectée
Pour répondre « c'est l'optimum », la figure a en coulisse énuméré les 1 024 sélections possibles, ce qu'un atelier ne peut pas toujours faire. Elle propose ensuite de rejouer deux règles de bon sens, celles qu'on essaie d'instinct : les commandes les plus rentables d'abord, ou celles qui rapportent le plus par heure de machine. Une règle aussi naturelle atteint-elle l'optimum ? La figure répond, règle par règle, une fois rejouée : c'est en la regardant charger le conteneur qu'on le constate, pas en croyant ce texte.
Le vocabulaire
Le même petit nombre de mots sert à décrire n'importe quelle décision d'atelier. Ils ont un sens précis, et la moitié des erreurs de modélisation vient de les employer l'un pour l'autre.
Une décision est un choix à faire parmi plusieurs possibilités : quelles commandes lancer, dans quel ordre percer.
Une instance est un cas particulier de ce problème, avec ses données : ces dix commandes et ces cent heures, cette plaque et ces douze trous. Le problème est général, l'instance est ce qu'on doit résoudre lundi matin.
Une solution est une manière complète de trancher : la liste des commandes retenues, l'ordre de perçage. Une solution ne dit rien encore sur sa qualité, ni même sur sa possibilité.
Une contrainte est une condition qu'une solution doit respecter : ne pas dépasser cent heures, percer chaque trou une fois.
Une solution est réalisable si elle respecte toutes les contraintes.
Une fonction de coût (ou fonction objectif) associe à toute solution un nombre : la marge, la longueur parcourue. L'objectif est de rendre ce nombre le plus petit possible, ou le plus grand.
Un optimum est une solution réalisable dont le coût est le meilleur de toutes les solutions réalisables. L'espace des solutions est l'ensemble de toutes les solutions, réalisables ou non.
Le tableau met ces mots en face des deux décisions du chapitre.
| Mot | Les commandes de la semaine | La plaque à percer |
|---|---|---|
| Décision | quelles commandes lancer | dans quel ordre percer |
| Solution | un ensemble de commandes, par exemple C1, C4, C9 | un ordre des douze trous |
| Contrainte | au plus 100 heures de machine | chaque trou percé une fois, retour au départ |
| Coût | la marge, à rendre la plus grande possible | la longueur parcourue, à rendre la plus petite |
| Espace des solutions | 1 024 ensembles possibles | 479 001 600 ordres possibles |
Une remarque sur le sens de l'optimisation. Maximiser une marge et minimiser une longueur sont le même problème vu de deux côtés : maximiser une grandeur revient à minimiser son opposé. Dans la suite, on parlera de coût sans se soucier du sens, et le texte dira chaque fois si l'on cherche le plus petit ou le plus grand.
Évaluer une solution
Avant de chercher une bonne solution, il faut savoir en juger une. C'est la première chose qu'un programme d'optimisation doit savoir faire, et c'est étonnamment facile : évaluer une solution ne demande que de l'additionner.
Trois solutions, trois lignes de résultat, et déjà une surprise : la troisième rapporte le plus, et elle est irréalisable. Ce n'est pas un détail. Une fonction de coût seule, qui ne regarderait que la marge, la préférerait aux deux autres. Un coût sans contrainte recommande l'impossible. Toute la partie « pénalité » plus bas tourne autour de cette phrase.
La première ligne du résultat, « les plus rentables », est justement la règle de bon sens de la figure : on prend la commande la plus rentable, puis la suivante qui tient encore, jusqu'à ne plus pouvoir. Elle donne ici 13 200 euros pour 97 heures. Or aucune des deux règles n'atteint l'optimum, comme la figure le montre en les rejouant, une fois l'optimum trouvé : il existe, dans les deux cas, une sélection réalisable qui rapporte davantage. Une règle de bon sens donne des solutions plausibles, proches les unes des autres, et sans tout essayer on ne sait pas s'il en existe une meilleure. Cette incertitude est le sujet du parcours : une décision se juge par rapport à ce qu'on aurait pu faire, et pour cela il faut d'abord la mettre en forme.
Représenter une solution
Pour manipuler une solution dans un programme, il faut la ranger dans une structure : une liste, un tableau de zéros et de uns, un dictionnaire. Ce choix s'appelle la représentation, et c'est de loin la décision de modélisation qui pèse le plus sur la suite. Un voisinage, un croisement, une mutation, des notions que les chapitres suivants poseront, se définissent sur la représentation et pas sur la solution abstraite.
Une bonne représentation vérifie quatre choses.
- Aucun objet impossible. Tout ce qu'on peut écrire dans la structure désigne une solution qui a un sens. Sinon, il faut tester la validité à chaque étape.
- Aucune solution oubliée. Toute solution utile, l'optimum en particulier, s'écrit. Une représentation qui l'exclut ne le trouvera jamais.
- Peu de doublons. Chaque solution s'écrit d'une seule façon, ou d'un petit nombre de façons. Sinon l'espace se gonfle de copies.
- Un petit changement de l'objet est un petit changement de la solution. C'est ce qui permettra de « bouger un peu » une solution pour la comparer à ses voisines.
Pour les commandes
Trois façons de ranger une sélection de commandes, et le tableau dit ce que chacune laisse passer.
| Représentation | Exemple | Ce qu'elle laisse passer |
|---|---|---|
| Une liste de numéros | [4, 1, 9] | [4, 4, 9] (une commande deux fois), [12] (une commande qui n'existe pas), et [1, 4, 9] comme [4, 1, 9] pour la même sélection |
| Dix zéros et uns, un par commande | [1, 0, 0, 1, 0, 0, 0, 0, 1, 0] | rien d'impossible : les 1 024 listes sont 1 024 sélections, chacune écrite d'une seule façon |
| Un ordre de lancement, avec la règle « on lance chaque commande si elle tient encore » | [4, 1, 9, 6, ...] | rien d'impossible non plus, mais une sélection qui peut encore accueillir une commande ne s'écrit jamais, et beaucoup d'ordres donnent la même sélection |
La liste de numéros paraît naturelle, et elle est la pire : elle n'interdit ni le doublon ni le numéro inexistant, et chaque sélection s'y écrit de plusieurs façons. Les zéros et les uns n'ont aucun de ces défauts. Notons ce qu'ils ne font pas : ils ne garantissent pas la capacité. Une liste de dix zéros et uns est toujours une sélection, mais pas toujours une sélection réalisable, et la contrainte des cent heures reste à tester séparément.
La troisième représentation est plus subtile : elle règle ce problème en faisant de la contrainte une partie de la lecture. Un programme qui décode l'ordre en lançant chaque commande tant qu'elle tient ne produit jamais une sélection irréalisable. Le prix est un décodage à faire et beaucoup d'ordres qui ne changent rien. C'est un compromis, et le parcours en rencontrera d'autres.
Il se chiffre. Les 3 628 800 ordres possibles n'écrivent que 79 des 1 024 sélections : celles où plus aucune commande ne tient. C7 seule n'en fait pas partie, puisque, quel que soit l'ordre, au moins deux commandes se lancent. L'optimum en fait partie, et ce n'est pas un hasard : tant que chaque marge est positive, une sélection à laquelle on peut ajouter une commande est battue par la sélection agrandie. La représentation oublie donc des sélections, mais aucune qui puisse être la meilleure.
Pour la plaque
Même exercice pour l'ordre de perçage.
| Représentation | Exemple | Ce qu'elle laisse passer |
|---|---|---|
| Une liste libre de douze noms | ["T4", "T9", "T4", ...] | un trou percé deux fois, un trou oublié |
| Une permutation des douze trous | ["T4", "T9", "T11", ...] | rien d'impossible, mais un ordre et son inverse mesurent la même chose |
| Pour chaque trou, le trou suivant | {"T1": "T7", "T7": "T4", ...} | des tournées en plusieurs boucles |
La dernière est la plus trompeuse, parce qu'elle a l'air de respecter la règle : chaque trou a un suivant et un seul, chaque trou est le suivant d'un seul autre. Et pourtant.
Le test le plus naturel répond « valide », et la représentation décrit deux boucles distinctes de trois trous : l'outil ne peut pas suivre deux boucles à la fois. Un test de validité incomplet est pire qu'aucun test, parce qu'il donne une confiance qu'il ne mérite pas. Un algorithme qui cherche la tournée la plus courte trouverait, dans un espace qui contient des doubles boucles, des « tournées » sensiblement plus courtes que les vraies, et les annoncerait avec fierté. Le remède est de choisir la permutation, qui ne laisse rien passer, plutôt que de compliquer le test.
1.Une représentation d'une solution est mauvaise quand…
2.Pour chaque trou de la plaque, on note le trou suivant. Un test vérifie que chaque trou a un seul suivant et un seul prédécesseur. Peut-on en déduire que c'est une tournée ?
Le coût : la trajectoire de la perceuse
Passons à la deuxième décision. La perceuse à commande numérique perce, sur une plaque de bride, douze trous dont les positions sont fixées par le plan. L'outil part de l'origine de la plaque, perce les douze trous, et revient à l'origine pour le changement de pièce. Il se déplace à vide à 30 mm par seconde. Ce qui est libre, c'est l'ordre. C'est le problème du voyageur de commerce (travelling salesman problem, TSP en anglais) : visiter chaque point une fois, revenir au départ, et parcourir le moins possible.
La fonction de coût est la longueur de la trajectoire, d'où l'on tire le temps de déplacement en divisant par la vitesse. Les contraintes sont dans la représentation : un ordre est une permutation, donc chaque trou est percé une fois, et le retour au départ fait partie de la mesure.
Dans la figure suivante, on construit soi-même un ordre de perçage en cliquant les trous l'un après l'autre. Le tracé, la longueur et le temps se mettent à jour à chaque trou. La figure ne juge pas l'ordre avant la fin, et l'ordre dans lequel le plan écrit les trous, celui que le programme suit sans réfléchir, peut se superposer à tout moment.
- Trous percés
- 0 / 12
- Longueur
- 0,0 mm
- Déplacement
- 0,0 s
- Cliquer les trous dans l'ordre voulu. Au clavier : Tab pour passer d'un trou à l'autre, Entrée pour le percer, Retour arrière pour annuler.
L'ordre du plan mesure environ 1 080 mm, soit 36 secondes de déplacement. Une fois la tournée complète, la figure donne aussi la meilleure tournée connue, obtenue par un calcul exact mené une fois pour toutes : c'est elle qui sert de référence dans le calcul qui suit.
Ce que vaut un ordre de perçage
- 1.
Combien d'ordres de perçage existe-t-il pour les douze trous (tous les ordres, sans se soucier du sens de parcours) ?
- 2.
Combien de sélections possibles y a-t-il pour les dix commandes, chacune étant retenue ou non ?
- 3.
L'ordre d'écriture fait 1079,8 mm, et la meilleure tournée connue celle que la figure donne à la fin, 633,2 mm. À 30 mm par seconde, combien de secondes de déplacement une plaque économiserait-elle ?
- 4.
Si Valdrome perce 300 plaques de ce modèle par semaine, combien de minutes de machine cela représente-t-il ?
Environ soixante-quatorze minutes de machine par semaine, sans acheter quoi que ce soit ni changer une seule pièce : c'est le rendement d'une bonne modélisation suivie d'une bonne recherche, et c'est pourquoi l'entreprise s'y intéresse.
Et le pire est qu'on ne peut pas se contenter d'essayer tous les ordres : 479 millions pour douze trous, et ce nombre se multiplie par treize au trou suivant. Le chapitre suivant en fait le sujet.
Contrainte dure ou pénalité
La capacité de cent heures est une contrainte dure : une solution qui la viole est irréalisable, et elle est écartée. C'est le cas le plus simple, mais ce n'est pas le seul choix possible. Une autre manière de traiter la capacité est d'autoriser les solutions qui la dépassent, et de les punir : on retranche à la marge un montant proportionnel au dépassement.
Une contrainte dure écarte tout ce qui la viole : une solution qui ne la respecte pas est irréalisable, et n'est jamais retenue.
Une pénalité intègre la contrainte au coût. Si est le dépassement de la solution (nul quand elle est réalisable) et un poids, on note
et on cherche à rendre cette valeur la plus grande possible. La solution irréalisable n'est plus interdite : elle est seulement moins bonne. Une contrainte traitée par une pénalité est dite souple.
Les deux choix ont chacun leur intérêt. La contrainte dure ne recommande jamais l'impossible, mais elle interdit à une recherche de traverser une zone irréalisable pour atteindre une bonne solution de l'autre côté : en imposant de rester dedans, on la coince. La pénalité laisse passer, et tout dépend alors de . Trop faible, la recherche préfère violer la capacité, parce que ça rapporte. Trop forte, elle a peur d'en approcher et se comporte comme une contrainte dure. Le bon se règle en mesurant.
Lire la colonne des heures. Sans pénalité, la meilleure sélection retient les dix commandes, soit 223 heures. Avec un poids modeste, elle dépasse encore la capacité, et à 190 € par heure c'est encore le cas : C1, C6, C8 et C9 (105 heures, 14 300 €) valent 13 350, plus que la meilleure sélection réalisable, 13 300, parce que les cinq heures de trop rapportent 1 000 € et n'en coûtent que 950. Le seuil se lit dans ce rapport, 1 000 € pour cinq heures : au-dessus de 200 € par heure, la recherche revient à la meilleure sélection réalisable.
Au fil du parcours, les deux approches reviendront : la contrainte dure, quand une solution fabriquée est vérifiée puis rejetée ou réparée ; la pénalité, quand une recherche doit pouvoir traverser une zone interdite, comme dans le recuit simulé, une méthode que le parcours présentera plus loin.
1.Une pénalité de 50 € par heure de dépassement est retenue pour une contrainte de capacité. La recherche renvoie une solution qui dépasse la capacité de dix heures. Qu'en conclure ?
2.Laquelle de ces contraintes se modélise le mieux par une pénalité ?
Les erreurs de modélisation d'un débutant
Le fil du parcours
Valdrome revient avec cinq problèmes, toujours les mêmes données, consignées dans un fichier de référence.
| Problème | Décision | Ce qu'on y étudie |
|---|---|---|
| Commandes à lancer | quelles commandes retenir sous une capacité | le sac à dos : contrainte, pénalité, bornes |
| Trajectoire de la perceuse | dans quel ordre percer | le voyageur de commerce : voisinages, recuit, tabou, génétique |
| Découpe de barres | comment ranger des pièces dans des barres de 6 m | le bin packing : règles gloutonnes, bornes |
| Ordonnancement d'une machine | dans quel ordre fabriquer dix ordres | permutations, retards |
| Affectation des opérateurs | qui à quel poste | représentations qui laissent passer l'impossible |
Le chapitre suivant montre pourquoi on ne peut pas tout essayer. Viennent ensuite des bornes, qui disent ce qu'on peut espérer, puis des règles simples de construction, la recherche locale, le recuit simulé, la recherche tabou, les algorithmes génétiques, les fourmis, et enfin la comparaison des méthodes entre elles et avec un solveur. L'ordonnancement de ce parcours n'a ni précédences entre ordres ni conflits à colorer ; si l'on en ajoutait, les chapitres graphes orientés et coloration du parcours Graphes serviraient. Sur la notion de difficulté, on renvoie à ce que le chapitre complexité pose déjà.
Exercices type
Dans la situation d'un atelier qui doit répartir 6 opérateurs sur 6 postes, qu'est-ce que la décision, la solution, les contraintes, le coût ?
La décision : quel opérateur va à quel poste. Une solution est une affectation complète, par exemple « l'opérateur 1 au poste 4, l'opérateur 2 au poste 1, et ainsi de suite ». Les contraintes : chaque opérateur tient un poste, chaque poste a un opérateur. Le coût : le temps total, ou l'un des temps individuels le plus long, selon ce qu'on veut optimiser, et ce choix est déjà une décision de modélisation.
Les affectations réalisables sont au nombre de . L'espace des solutions est plus vaste quand la représentation laisse passer les doubles affectations : avec une liste de six numéros de poste, il compte listes, dont 720 seulement sont réalisables.
Une solution S1 rapporte 13 200 € pour 97 heures, une solution S2 rapporte 14 600 € pour 110 heures. Laquelle est meilleure ?
Le mot « meilleure » dépend de la contrainte. Avec cent heures de capacité dure, S2 est irréalisable, et S1 est la seule des deux qu'on puisse retenir. Avec une pénalité de 250 € par heure, S2 vaut , donc moins que S1 : S1 reste la meilleure. Avec une pénalité de 100 € par heure, S2 vaut 13 600 et l'emporte, ce qui montre qu'un poids trop faible recommande de violer la capacité.
Comparer deux marges sans regarder les contraintes ne compare rien.
Pourquoi ne pas représenter une tournée par « pour chaque trou, le trou suivant » ?
Parce que la structure décrit aussi des solutions qui n'en sont pas. Chaque trou peut avoir un suivant unique et un prédécesseur unique, et pourtant l'ensemble se décompose en plusieurs boucles disjointes, que l'outil ne peut pas suivre d'un seul trait. Un test qui ne vérifie que « un suivant, un prédécesseur » ne les voit pas.
Il faut soit un test supplémentaire (un seul cycle en partant de n'importe quel trou), soit une représentation qui ne laisse pas passer : une permutation. On paie la seconde option une fois, à la conception, au lieu de payer la première à chaque évaluation.
Une sélection est représentée par dix zéros et uns. Combien de listes sont réalisables pour cent heures ?
Le nombre de listes est 1 024, toutes des sélections. Le nombre de listes réalisables est le nombre de sélections qui tiennent dans les cent heures : le contrôle est un programme de trois lignes (parcourir les 1 024 listes, additionner les heures, compter celles qui ne dépassent pas la capacité), et il en trouve 406 sur cette instance. Environ quatre sélections sur dix.
Ce nombre n'est pas connu d'avance et il change avec la capacité, ce qui rappelle que la représentation ne garantit que ce qu'elle garantit : elle exclut l'impossible structurel, pas l'impossible numérique.
Quand une pénalité est-elle préférable à une contrainte dure ?
Quand la violation a un prix réel (heures supplémentaires, retard facturé, sous-traitance), parce qu'alors elle fait partie de la décision. Et quand la recherche a besoin de traverser des solutions irréalisables pour aller d'une région réalisable à une autre : interdire tout passage la couperait en morceaux.
Elle est plus risquée quand la violation est physiquement impossible : un poids mal réglé fait alors recommander l'impossible, et il faut ajouter un contrôle en sortie pour ne jamais présenter une solution irréalisable comme une réponse.
La méthode
- Écrire la décision en une phrase, avec ce qu'on choisit et ce qu'on ne choisit pas.
- Lister toutes les contraintes, y compris celles qui « vont de soi ».
- Écrire la fonction de coût, et dire si l'on minimise ou maximise.
- Choisir la représentation en se demandant quels objets elle laisse passer qui ne sont pas des solutions.
- Décider de chaque contrainte : dure, ou pénalité, en se demandant ce qui se passe réellement quand elle est violée.
- Évaluer à la main quelques solutions, dont une irréalisable, avant de programmer la moindre recherche.
- Fixer l'instance, pour que deux méthodes se comparent sur les mêmes données.
Synthèse
- Une décision se modélise par une instance, une solution, des contraintes et une fonction de coût.
- Une solution est réalisable si elle respecte toutes les contraintes ; l'optimum est la meilleure solution réalisable ; l'espace des solutions contient aussi les irréalisables.
- Évaluer une solution est facile, en temps proportionnel à sa taille ; trouver la meilleure ne l'est pas.
- Un coût sans contrainte recommande l'impossible : il faut deux outils, le coût et le test de réalisabilité.
- La représentation décide de tout ce qui suit. Une bonne représentation n'admet aucun objet impossible, oublie aucune solution utile, en écrit peu de doublons.
- Une représentation qui laisse passer l'impossible oblige à tester à chaque étape, et un test incomplet est pire que pas de test.
- Une contrainte dure écarte toute solution qui la viole ; une contrainte souple passe par une pénalité, qui l'intègre au coût, avec un poids λ à régler en mesurant.
- Le coût est un modèle : la longueur n'est pas le temps. Une bonne solution d'un mauvais modèle est une mauvaise solution.
- Les cinq problèmes de Valdrome reviennent dans tout le parcours avec les mêmes données.
Mettre en pratique
Évaluer des solutions, séparer le coût des contraintes, et refuser une représentation qui laisse passer l'impossible.
- Quatre sélections pour lundi matinNiveau 2
- Le coût des retards d'un atelierNiveau 2
- Débogage : huit opérateurs, des postes qui servent deux foisNiveau 3