Les Perles de Dijkstra sont un problème de backtracking en programmation énoncé par Edsger Dijkstra dans les Communications de l'ACM au début des années 1970.
L'intérêt du problème vient du fait qu'il est difficile de le programmer sans instruction GO TO, mais que si on le programme avec une telle instruction, on a de fortes chances aussi de se tromper, et de rendre le programme très dur à corriger.
Il a donné lieu aussi à des développements mathématiques simples.
Soit un fil sur lequel on désire enfiler des perles de trois couleurs. Dijkstra propose bleu, blanc et rouge, couleurs du drapeau néerlandais, mais on peut dans une formulation plus neutre les nommer 0, 1 et 2.
Une seule contrainte existe : il ne doit pas y avoir sur le fil deux séquences adjacentes identiques.
Questions :
Elle commence tout d'abord avec un peu de réflexion préalable : chaque choix de perle est un choix parmi trois. Le degré de liberté dans la construction est de l'ordre de 3N. La contrainte, elle, semble diminuer plutôt en N3/2, ce qui conduit à se dire que passé un certain cap, on a assez de marge de manœuvre pour continuer indéfiniment. Mais impression n'est pas démonstration.
Elle contient ensuite avec un peu de simulation à la main :
Nous avons ensuite un souci pour placer une perle supplémentaire :
Est-ce la chaîne la plus longue cherchée ? Non. Nous pouvons toujours remettre en cause un de nos choix (arbitraires) antérieurs pour voir si cela ne débloque pas la situation. Et de fait :
0102012 débloque les choses et permet de continuer. Cette procédure se nomme le backtracking.
Il n'y a plus qu'à programmer.
Mais attention aux programmeurs négligents : si leur programme ne prévoit pas qu'il puisse y avoir de nombreux backtrackings successifs depuis la même position, ils sont partis pour rencontrer de sérieux ennuis. Ennuis qui deviennent vite inextricables si de surcroît ils ont fait usage de l'instruction GO TO, qui interdit toute prédiction facile sur les invariants valides en chaque point du programme.
L'on peut construire une telle chaîne arbitrairement longue. Si l'on considère le morphisme