Objectifs

  • Améliorer les performances de l'algorithme de Dijkstra grâce à l'heuristique A*.

Prérequis

  • Votre codage de Dijkstra est correct, validé par plusieurs tests automatiques.

Consignes

Flèches

Cette partie s'intéresse à une extension de l'algorithme de Dijkstra dans lequel les sommets ne sont plus seulement ordonnés en fonction de leur coût par rapport à l'origine mais en fonction de deux coûts : le coût par rapport à l'origine et le coût estimé à la destination. Dans ce cas, le déroulement de l'algorithme de plus court chemin est guidé par la destination du trajet.

Ce principe est une application spécifique de l'algorithme A* (A-star) qui sera étudiée dans sa généralité l'année prochaine en 4ème année IR, parcours Informatique dans le cours d'Intelligence Artificielle.

Estimation du coût à la destination

Le coût estimé entre un sommet donné et la destination se base sur un trajet à vol d'oiseau entre les deux sommets et doit être une borne inférieure du coût réel pour garantir l'optimalité du résultat (cette propriété sera démontrée l'année prochaine mais vous pouvez toujours y réfléchir dès maintenant).

Pour éviter de dire des âneries à la soutenance, notez d'emblée que cet algorithme dérivé de A-star doit fournir le plus court chemin (et non pas une simple approximation).

Les labels

  • Vous avez besoin d'une nouvelle structure LabelStar, qui hérite de Label, pour prendre en compte cette nouvelle information de coût.
  • Sans modifier la classe BinaryHeap faites en sorte que les sommets soient maintenant ordonnés selon l'ordre coût depuis l'origine + coût estimé à la destination croissant. En cas d'égalité, on considèrera en premier le sommet ayant le plus petit coût estimé à la destination.
  • Une siouxe solution consiste à définir une méthode getTotalCost() dans Label, à l'utiliser dans compareTo de Label, puis à redéfinir getTotalCost dans LabelStar.
    La classe LabelStar continue donc d'implémenter l'interface Comparable<Label>.

Visualisation et expérimentation

  • Visualisez le déroulement de l'algorithme. Sur certaines cartes ou certains trajets, la différence doit être frappante.
Validation (2)
  • Effectuez les tests automatiques déjà écrits pour Dijkstra. Votre code étant modulaire, vous pouvez facilement le réutiliser. (réutiliser ne signifie pas copier-coller)
  • Un nouveau test comparant les résultats de Dijkstra et A* est pertinent.

Bilan

  • A* donne les mêmes résultats que Dijkstra.
  • L'algorithme est factorisé : vous avez évité le copier-coller grâce à un héritage maîtrisé.