Heuristiques
Temps de lecture15 minEn bref
Résumé de l’article
Dans cet article, vous découvrirez les heuristiques. Ce type d’algorithme permet d’approximer la solution d’un problème trop complexe pour être résolu de manière exacte.
À retenir
-
Une heuristique permet de trouver des solutions approximatives à un problème.
-
C’est un compromis entre la qualité de la solution trouvée et le temps de calcul nécessaire.
-
Elle encode une intuition sur la manière d’approximer une solution à un problème complexe.
-
Parfois, les heuristiques peuvent trouver des solutions optimales.
Contenu de l’article
1 — Vidéo
Veuillez consulter la vidéo ci-dessous (en anglais, affichez les sous-titres si besoin). Nous fournissons également une traduction du contenu de la vidéo juste après, si vous préférez.
Pour aller plus loin
2 — Heuristiques et solutions optimales
Comme indiqué précédemment, l’utilisation d’heuristiques peut conduire à trouver une solution correcte à un problème, mais pas nécessairement la solution optimale. C’est le cas par exemple de l’approche gloutonne, qui choisit itérativement des solutions localement optimales pour estimer un optimum global.
Néanmoins, utiliser une heuristique ne rend pas toujours une solution non optimale. Rappelez-vous par exemple l’algorithme de force brute avec backtracking étudié précédemment.
L’efficacité du backtracking dépend fortement de l’ordre dans lequel les branches de l’arbre de solutions sont explorées. Dans la session précédente, vous avez probablement choisi de visiter les sommets restants dans le méta-graphe comme ils apparaissent dans votre structure de méta-graphe ainsi :
def solve_tsp (graph, source):
...
for vertex in graph.get_neighbors(current_vertex):
if vertex not in current_visited_vertices:
# Explore this branch
...Cependant, utiliser une heuristique pour encoder une intuition sur quel voisin devrait être exploré en premier peut être une bonne idée, car (si c’est une bonne heuristique) cela pourrait conduire à l’exploration rapide de chemins courts, conduisant ainsi à l’élagage de nombreuses branches.
Le code partiel suivant est une solution possible, dans laquelle nous proposons d’utiliser un tas min, qui contiendra tous les voisins, avec une valeur associée correspondant au score donné par l’heuristique. Puisque c’est un tas min, plus le score est bas, meilleure est la qualité du voisin :
def heuristic (neighbor, ...):
# Return a score for the neighbor to evaluate
# In this example, the lower the score, the better, but you could adapt the code to change this
...
return XXX
def evaluate_neighbors (neighbors, ...):
# Here, we use our heuristic to give a score to all candidate neighbors
# Then, we use these scores to fill a min heap
scores = []
for neighbor in neighbors:
score = heuristic(neighbor, ...)
heapq.heappush(scores, (score, neighbor))
return scores
def solve_tsp (graph, source) :
...
non_visited_neighbors = [neighbor for neighbor in graph.get_neighbors(current_vertex) if neighbor not in explored_vertices]
scores = evaluate_neighbors(non_visited_neighbors, ...)
while len(scores) > 0 :
best_score, best_neighbor = heapq.heappop(scores)
# Explore this branch first
...Vous pouvez par exemple essayer de choisir comme heuristique de retourner un score qui est la distance entre le sommet exploré et le voisin candidat, c’est-à-dire, le poids dans le méta-graphe.
3 — Méta-heuristiques
Le préfixe “méta” indique que le mot auquel il est associé est placé à un niveau d’abstraction supérieur. Dans ce cas, une méta-heuristique est une heuristique qui sera elle-même utilisée pour trouver des heuristiques pour résoudre un problème.
Les méta-heuristiques permettent d’abstraire le problème de trouver les bonnes heuristiques, en considérant les heuristiques comme une solution à un problème d’optimisation, dont l’objectif est de maximiser la précision sur le problème étudié, tout en limitant la complexité. Ainsi, une méta-heuristique est un algorithme qui va parcourir l’espace des heuristiques possibles, et en choisir une qui sera jugée plus optimale que les autres selon certains critères (d’où la partie heuristique dans le mot).
Les méta-heuristiques ignorent complètement le problème étudié, considérant que l’heuristique recherchée n’est qu’une fonction qui doit être optimisée pour minimiser un critère. Ainsi, la même méta-heuristique peut être utilisée pour produire des heuristiques qui répondent à un très grand nombre de problèmes.
Parmi les méta-heuristiques les plus connues, on trouve les colonies de fourmis, les algorithmes génétiques, le recuit simulé, etc.
Pour aller encore plus loin
-
The Ant Colony Optimization Metaheuristic: Algorithms, Applications, and Advances.
Les algorithmes de colonies de fourmis visent à reproduire le comportement des fourmis pour trouver un chemin le plus court dans un graphe.
-
The Traveling Salesman Problem: When Good Enough Beats Perfect.
Une vidéo sur le TSP et quelques heuristiques pour approximer sa solution.
-
Si vous voulez en savoir plus à les méta-heuristiques en général.








