Dans les problèmes de satisfaction de contraintes, l'heuristique peut être utilisée pour améliorer les performances d'un solveur de bactracking. Trois heuristiques communément données pour les solveurs de retour arrière simples sont:
- Valeurs minimales restantes (combien de valeurs sont encore valides pour cette variable)
- Degré heuristique (combien d'autres variables sont affectées par cette variable)
- Valeur la moins contraignante (quelle valeur laissera le plus de valeurs pour les autres variables)
Les deux premiers sont assez évidents et simples à mettre en œuvre. Choisissez d'abord la variable qui a le moins de valeurs dans son domaine, et s'il y a des liens, choisissez celle qui affecte le plus de variables. De cette façon, si une étape parent du solveur a sélectionné une mauvaise affectation, vous êtes susceptible de le découvrir plus tôt et ainsi de gagner du temps si vous choisissez la variable avec le moins de valeurs restantes qui affecte le plus d'autres choses.
Celles-ci sont simples, clairement définies et faciles à mettre en œuvre.
La valeur la moins contraignante n'est pas clairement définie, partout où j'ai regardé. L'intelligence artificielle: une approche moderne (Russel & Norvig) dit simplement:
Il préfère la valeur qui exclut le moins de choix pour les variables voisines dans le graphe de contraintes.
La recherche de «valeur la moins contraignante» n'a révélé que de nombreux diaporamas universitaires basés sur ce manuel, sans plus d'informations sur la façon dont cela serait fait de manière algorithmique.
Le seul exemple donné pour cette heuristique est un cas où un choix de valeur élimine tous les choix pour une variable voisine, et pas l'autre. Le problème avec cet exemple est qu'il s'agit d'un cas trivial, qui serait éliminé immédiatement lorsque l'affectation potentielle est vérifiée pour la cohérence avec les contraintes du problème. Donc, dans tous les exemples que j'ai pu trouver, l'heuristique de valeur la moins contraignante n'a en fait pas profité aux performances du solveur, à l'exception d'un petit effet négatif de l'ajout d'une vérification redondante.
La seule autre chose à laquelle je peux penser serait de tester les affectations possibles des variables voisines pour chaque affectation, et de compter le nombre d'affectations possibles des voisins qui existent pour chaque affectation possible de cette variable, puis de classer les valeurs de cette variable basé sur le nombre d'affectations de voisins disponibles si cette valeur est choisie. Cependant, je ne vois pas comment cela offrirait une amélioration par rapport à un ordre aléatoire, car cela nécessite à la fois de tester de nombreuses combinaisons de variables et un tri basé sur les résultats du comptage.
Quelqu'un peut-il donner une description plus utile de la valeur la moins contraignante et expliquer comment cette version de la valeur la moins contraignante entraînerait réellement une amélioration?