Heuristics
Reading time15 minEn bref
Résumé de l’article
Dans cet article, vous allez apprendre ce que sont les heuristiques. Ces algorithmes aident à approximer la solution à un problème trop complexe pour être résolu exactement.
Points clés
-
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 regarder la vidéo ci-dessous. Vous pouvez aussi lire la transcription 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.
Cependant, utiliser une heuristique ne rend pas toujours une solution non optimale. Rappelez-vous par exemple l’algorithme bruteforce avec backtracking étudié précédemment.
L’efficacité du backtracking dépend fortement de l’ordre dans lequel les branches de l’arbre des solutions sont explorées. Dans la session précédente, vous avez probablement choisi de visiter les sommets restants dans le méta-graphe au fur et à mesure qu’ils apparaissent dans votre structure de méta-graphe comme ceci :
def solve_tsp (graph, source):
...
for vertex in graph.get_neighbors(current_vertex):
if vertex not in current_visited_vertices:
# Explore that 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 à explorer rapidement des chemins courts, ce qui permettrait d’élaguer de nombreuses branches.
Le code partiel suivant est une solution possible, dans laquelle nous proposons d’utiliser un min-heap, qui contiendra tous les voisins, avec une valeur associée correspondant au score donné par l’heuristique. Puisqu’il s’agit d’un min-heap, 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 better, but you could adapt the code to change that
...
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 that branch in priority
...
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, i.e., 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 afin de résoudre un problème.
Les méta-heuristiques permettent d’abstraire le problème de la recherche des 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 choisir celle 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 est juste 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.
Certaines des méta-heuristiques les plus connues sont les colonies de fourmis, les algorithmes génétiques, le recuit simulé, etc.
Pour aller au-delà
-
Un article sur les colonies de fourmis.
Les 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.
-
Page Wikipedia sur les méta-heuristiques.
Si vous souhaitez en apprendre davantage à leur sujet.