A726. La balance à trois plateaux (1er épisode)
On a neuf boules d'apparences identiques mais de poids tous différents et on souhaite les classer par ordre décroissant de poids.
On dispose d'une balance très particulière conçue à l'époque d'Al Khazini (première moitié du XIIième siècle) qui comporte trois plateaux avec trois bras faisant entre eux un angle de 120°.
Au cours d'une pesée on place une boule sur chacun des plateaux : le plateau le plus bas porte la boule la plus lourde, le plateau le plus haut porte la boule la plus légère et l'on repère la boule au poids médian dans le plateau qui occupe une position intermédiaire.
Déterminer le nombre minimum de pesées qui permettent de classer les neuf boules.
Solution (numérique) proposée par Claudio Baiocchi : 8 pesées sont nécessaires et 9 suffisent.
Chaque pesée peut au mieux partager la situation actuelle en six classes également nombreuses . En particulier 7 pesées règlent au plus cas, tandis que la situation de départ prévoit possibilités. Par ailleurs, puisque , rien n’empêcherait qu’on puisse s’en sortir avec 8 pesées. Toutefois on va donner une solution en 9 pesées.
Comme exemples de pesées qui divisent effectivement par 6 le nombre de chaînes restantes, on peut commencer en partageant les boules en trois groups de 3 boules chacun ; après avoir pesé chaque group, il existe trois pesées qui encore partagent la famille restante en six classes également nombreuses : peser les trois éléments le plus lourdes de chaque group ; ou bien les trois les plus légers ; ou encore les trois éléments de poids moyen. Quels que soient les résultats, après quatre pesées on se retrouve à travailler avec seulement 280 cas possibles.
On va noter par les lettres de à les neuf boules ; et on va contrôler « à la machine » ces résultats. Un premier programme (écrit dans mon langage préféré, le Dev-Pascal) examine récursivement les chaînes de caractères constituées par les permutations des lettres ; précisément on est intéressé au chaînes dans lesquelles :
1. la lettre ‘a’ précède la lettre ‘b’ qui à son tour précède la lettre ‘c’ ; ce qui correspond au fait que, après une première pesée de trois boules on a nommé ‘a’ la boule la plus lourde, ‘c’ la plus légère et ‘b’ la boule de poids moyen. Dans la suite on écrira tout simplement cette restriction.
2. Avec la notation qu’on vient d’imposer, la deuxième restriction sera ; 3. la troisième restriction sera .
Notre premier programme va donc se borner à sélectionner et écrire dans un fichier, par exemple de nom les chaînes satisfaisant les inégalités ; le fichier ainsi obtenu contient 1680 chaînes.
Pour décrire ce que fait le deuxième programme (lui aussi écrit en Dev-Pascal) on a besoin d’une remarque préliminaire : les 504 triplets ordonnés formés choisissant trois éléments distincts dans une famille de 9 objectes, peuvent être groupées en 84 familles de 6 éléments chacune (par exemple : dans une famille de nom on a les triplets ).
Les opérations du deuxième programme se partagent en trois phases :
A. Dans la première phase le programme demande le nom d’un fichier à lire (en première exécution on donnera le nom , à savoir le fichier construit par le premier programme) et pour chacune des 84 familles de triplets il évalue six quantités, à savoir le nombre de chaînes du fichier dans lesquelles les trois lettres paraissent dans un des six ordres possibles.
B. Dans la deuxième phase le programme visualise les 84 sextuples de nombres et demande à l’utilisateur d’en choisir une.
C. Dans la troisième phase le programme construit six fichiers, un pour chaque triplet associé à la sextuple choisie. Par exemple, si parmi les informations obtenues dans la deuxième phase on avait choisi un triplet donnant lieu aux six quantités numériques
, le programme écrirait six fichiers (de noms ‘xyz’, ‘xzy’, ‘yxz’, ‘yzx’,
‘zxy’, ‘zyx’) contenant chacun un des comme nombre de chaînes.
Naturellement, quitte à préciser l’interprétations des mots promettant et pire qu’on va utiliser, dans la troisième phase on choisira le sextuplet le plus promettant; et on exécutera à nouveau le
programme en choisissant comme fichier à explorer le pire (ou les pires) parmi les six fichiers qu’on vient de construire.
On va maintenant illustrer sur un exemple l’interprétation qu’on donnera au mot « promettant ». Il s’agit de voir comment continuer après avoir imposé les restrictions ; donc on exécute la partie A du deuxième programme, fournissant comme nomme du fichier à lire.
Dans la liste suivante on trouve quelques uns des sextuplets résultants (nom, puis les six nombres, et ce qu’on appellera le pire des cas) :
abc : 1680 0 0 0 0 0 1680
abd : 336 840 504 0 0 0 840
……
adg : 280 280 280 280 280 280 280
adh : 574 70 196 574 70 196 574
adi : 766 10 64 766 10 64 766
……
beh : 280 280 280 280 280 280 280
……
cfi : 280 280 280 280 280 280 280
cgh : 84 0 0 252 0 1344 1344
……
Naturellement les sextuplets dont le pire des cas vaut 1680 ( , mais d’autres ont été supprimés) correspondent au cas où la pesée n’a donné aucune information supplémentaire (on connaissait déjà le résultat) ; pesées telles que correspondent à des mauvais choix, car les 1680 chaînes ont été partagées en trois groups seulement, et le traitement du plus nombreux, de cardinalité 840, va poser des problèmes ; au contraire les choix et sont les « plus promettant » : le pire des cas à traiter correspond à groups de cardinalité 280. On avait prévu l’existence de quatrièmes pesées dont les résultats sont également répartis; par ailleurs les trois pesées qui réalisent ça sont aussi « très
naturelles » : il s’agit de choisir, comme boules à comparer, les plus lourdes, ou les plus légères, ou celles de poids moyen de chaque triplet.
Remarque Encore deux points avant de poursuivre la recherche : en cas de résultats également repartis on devrait évidemment examiner ce qui se passe dans chacun des cas ; mais il peut aussi se présenter le cas où la cardinalité de quelques-uns des groups résultant est proche du maximum ; ont devrait alors poursuivre l’examen dans chacun des cas « presque pires »
Pour continuer notre recherche, on va décrire la ramification des possibles pesées ; les restrictions étant juste un choix de noms, on part avec qui produit :
Maintenant, deux coups étant suffisants à trier les cas pires, on s’en sort en tout cas avec 9 coups.
Naturellement, après les restrictions , on aurait pu peser , ce qui donne :
Et maintenant le cas de cardinalité 18 demande encore trois pesées, donc 10 pesées. Naturellement on ne va pas discuter la variante , : le choix au lieu que
correspond uniquement à changer le sens des inégalités : on compare d’abord les minimums au lieu que les maximums.