Adloun

Probleme – Un graphe pour un problème qui n'en a pas l'air

Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 13 — Le modèle des graphes

Énoncé

On dispose de deux seaux non gradués, de et litres, et d'un robinet. On peut remplir un seau, le vider, ou verser un seau dans l'autre jusqu'à ce que le premier soit vide ou le second plein. On veut obtenir exactement litres.

Corrigé

1. Le modèle. Le mot « état » est la clé : un sommet est une situation, un arc est un coup.

Mesuré : sommets et arcs, soit un degré sortant moyen de .

Ce que ce comptage décide. Le graphe est minuscule : n'importe quel algorithme convient, y compris un . Mais le même modèle appliqué à des seaux de et litres donnerait un million d'états, et à trois seaux de litres, un million également. Le graphe des états explose avec le nombre de variables, et c'est pourquoi le chapitre insiste sur les ordres de grandeur avant tout algorithme : on compte les sommets avant de choisir la méthode. C'est la mise en garde du chapitre chap:exploration.

2. La résolution. La question « le moins de coups possible » est une question de plus court chemin dans un graphe non pondéré, donc un parcours en largeur depuis . Mesuré : la solution est en six coups.

coupactionétat
départ
remplir
verser dans est plein, il reste dans
vider
verser dans
remplir
verser dans ne prend qu'un litre

Le parcours en largeur ne fait pas que trouver une solution : il prouve qu'il n'en existe pas de plus courte, puisqu'il découvre les états par distance croissante. Une recherche en profondeur trouverait une solution, mais sans cette garantie — c'est la distinction du chapitre chap:parcours.

Mesuré également : l'excentricité de — la plus grande distance à un état atteignable — vaut . Aucun état ne demande plus de sept coups.

3. Les états inatteignables. Mesuré : des états sont atteignables depuis , et les manquants sont exactement

c'est-à-dire les états où aucun des deux seaux n'est ni vide ni plein.

Démonstration. C'est un invariant. Examinons les six coups : remplir met un seau à sa capacité ; vider met un seau à zéro ; verser dans s'arrête soit quand est vide, soit quand est plein. Après tout coup, au moins un seau est vide ou plein. L'état initial vérifie la propriété ; elle est donc vraie de tout état atteignable, par récurrence sur le nombre de coups.

C'est ainsi qu'on démontre l'impossibilité dans un graphe d'états : non pas en explorant, mais en exhibant une propriété vraie au départ et conservée par tous les arcs. Le parcours, lui, ne fait que confirmer — il donne le nombre , l'invariant donne la raison.

4. Les seaux de et litres. Mesuré : litres sont impossibles ; litres sont atteints en deux coups — remplir le seau de , verser dans celui de .

Le critère général : les quantités atteignables sont exactement les multiples de compris entre et . Chaque coup ajoute ou retranche un multiple de ou de au contenu total, donc tout contenu s'écrit avec entiers, et le théorème de Bézout dit que ces combinaisons sont exactement les multiples du pgcd. Ici : est impair, donc hors d'atteinte ; est un multiple de , donc accessible. Et explique que toute quantité de à soit atteignable avec les seaux du départ. Vérifié sur quatre couples de capacités.

Ce que ce problème enseigne, et c'est la thèse du chapitre. « Presque tout devient un graphe » n'est pas une figure de style. Ici il n'y avait ni réseau, ni carte, ni relation entre objets — seulement un jeu. Le graphe est apparu dès qu'on a nommé les états et les transitions, et la question « en combien de coups ? » est devenue mécaniquement un plus court chemin. C'est exactement le procédé qui modélise le taquin, le Rubik's cube, un automate fini (chapitre chap:automates) ou l'ordonnancement d'un atelier. Le travail d'informaticien n'est pas de trouver l'algorithme : c'est de reconnaître le graphe. L'algorithme, lui, était écrit depuis longtemps.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.