II – 1) Les débuts 2) Déplacements Dans les jeux, les GPS, les

publicité
II –
1) Les débuts
2) Déplacements
Dans les jeux, les GPS, les guides routiers en ligne qui permettent de déterminer
un itinéraire le plus court selon le temps, la distance, les frais ou autres… est basé
sur un algorithme. Dans les systèmes complexes comme les jeux vidéos ou un
personnage se déplace selon une grille tel un jeu d’échec, on utilisera le procédé
de l’A* (à prononcer « A star » ou « A étoile ») dans les autres cas cités concernant
la route, on pourra utiliser Dijkstra, A* étant plus lent dans un système simple. Ces
procédés seront expliqués dans les parties suivantes.
-
A*
Cet Algorithme est très utilisé dans le domaine du jeu vidéo 2D, 2D isométrique mais
aussi 3D. Celui-ci permet de déterminer le chemin le plus cours séparant deux cellules
en évitant les obstacles qui peuvent être des objets : mur, arbre, ... mais aussi dans le
cas d’un jeu en ligne, les autres joueurs.
Voici un exemple d’application de cet algorithme :
Nous voyons donc que
cette zone noire est divisée en
carrés : les cellules. Ce sont les
zones ou un personnage ou
élément de jeu peut être
placé. Les cellules noires sont
praticables, c'est-à-dire que
les déplacements y sont
autorisés, tandis que les
cellules bleues représentent
un obstacle tel un mur.
La cellule verte est le point de départ du déplacement, c’est actuellement ici que se
situe le personnage. La cellule rouge est l’endroit ou le personnage doit se rendre,
par exemple après un clic sur ce lieu avec la souris, ou parce que l’Intelligence
Artificielle du serveur dirige ce personnage a cet emplacement. Nous allons
rechercher par le procédé de A* le chemin le plus court reliant ces deux cellules.
Voyons maintenant le fonctionnement du début de la recherche grâce à A*. Tout
d’abord, nous allons créer deux listes de cellules : l’une dite « fermée » contiendra les
cellules traitées (vide au départ), l’autre liste dite « ouverte » contiendra celles à
traiter. On commence alors par ajouter la cellule de départ à la liste ouverte, et on la
traite : on ajoute toutes les cellules qui ont un coté ou un point commun à la liste
ouverte en indiquant leur parent et leur poids. Le parent de ces cellules est celle
actuellement en cours de traitement, ici la case de départ. Le poids d’une cellule,
noté F, est la somme de la distance qui la sépare de la cellule de départ (noté G) et de
la distance qui la sépare de la cellule d’arrivée à « vol d’oiseau », distance de
Manhattan, c'est-à-dire que l’on fait la somme de la distance en abscisse et de la
distance en ordonnée. On note cette dernière distance H. Enfin, une fois toutes les
cellules traitées, on met la cellule de départ dans la liste fermée après l’avoir retirée
de la liste ouverte.
On disposera ces valeurs sur les schémas explicatifs de la manière suivante :
On admet dans les schémas explicatifs suivant que la largeur d’une cellule vaut 10 et
que sa diagonale vaut 14 lors des calculs de distances.
Nous pouvons donc illustrer notre étape, une fois terminée, de la manière suivante :
La cellule de départ est
encadrée en bleu turquoise
pour indiquer qu’elle est dans
la liste fermée, les cellules de
la liste ouverte étant encadré
de vert.
L’étape suivante consiste à rechercher la cellule à traiter et lui faire subir la même
chose qu’à la cellule de départ. Pour choisir parmi les différentes cellules, nous
prendrons la cellule qui a la poids F le plus faible, car cela signifie que cette cellule se
trouve sur le chemin le plus court séparant le départ de l’arrivée puisque c’est la
somme des distance Départ -> Cellule + Cellule -> Arrivée. Nous retirons cette cellule
de la liste ouverte et l’ajoutons à la liste fermée. Nous allons analyser les cellules
adjacentes à celle en cours de traitement, pour les ajouter à la liste ouverte si et
seulement si elles ne sont ni des obstacles, ni dans la liste fermée. Si une cellule
adjacente est déjà dans la liste ouverte, on met à jour G, H et F ; sinon, on calcule ces
valeurs et on l’ajoute à la liste ouverte.
Nous obtenons ceci :
Cette étape terminée, on la répète… si deux cellules ont un poids F égal, on peut
prendre l’une ou l’autre, cela n’a pas d’importance.
On arrivera à ceci :
Lorsque la cellule d’arrivée est ajoutée à la liste ouverte, cela signifie qu’on a trouvé
le chemin, on a alors plus qu’à retrouver les parents des cellules à parcourir pour
passer par le chemin le plus court.
Voici un schéma pour une meilleure vision des choses, le chemin est tracé de points
rouges :
Si jamais il arrive un moment ou la liste ouverte est vide, cela signifie qu’il n’y a pas
de solution, par exemple si un personnage est dans un enclos, il ne peut en sortir.
-
Dijkstra
C’est un algorithme plutôt lourd à mettre en place car il nécessite plus d’informations
notamment sur les distances qui séparent les lieux les uns des autres. C’est pour cela
qu’il est plutôt utilisé dans les GPS et autres permettant de créer des itinéraires
routiers. Il va lui aussi utiliser le principe des listes, mais il ne sera pas détaillé ici. Voici
une illustration d’une situation :
Imaginons qu’un voyageur souhaite aller de Paris à Strasbourg, l’algorithme essayera
de passer par Lyon, puis essayera par Arras et choisira le meilleur chemin selon la
distance parcourue. Cet algorithme sera plus long et demandera plus de ressources à
la machine car il va tester toutes les solutions, mais sera plus précis qu’A*. La
différence avec celui-ci est la manière de calculer le poids, ici F = poids de la ville
parente + le poids (la distance) qui sépare la ville actuelle de la ville parente.
Téléchargement