Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ALGORITHME A*


Information sur la source

Catégorie :Divers Classé sous : algorithme, IA, A star, pacman, cacahuete Niveau : Débutant Date de création : 06/05/2008 Vu / téléchargé: 3 247 / 52

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Salut,
Je vous poste ici une petite implémentation de l'algo A* (ou A star), un algorithme de recherche de chemin dans un graphe ou la première solution proposée est l'une des meilleures existantes.
C'est un code que j'ai fait il y a bien longtemps, et que j'ai essayé d'optimiser au max pour qu'il soit utilisable pour du temps réel.
Je voulais illustrer ce code en faisant un petit pacman, mais je n'en n'ai jamais eu la motivation.

Bref, cet algo prend en entrée une hashmap ou chaque item est un nombre représentant le poid de la case correspondante.

Exemple la hashmap TEST contient ces données : 1 2 2 4 5 1 8 5 4 2 0 1 2 5 4 0 4 5 (18 items)

On charge le chemin a l'aide de la methode /Astar_load
Elle prend en paramètre la hashmap et la taille en largeur et en hauteur de la grille
ex: /Astar_load TEST 6 3
La carte sera donc représentée comme en rectangle de 6 * 3 :
1 2 2 4 5 1
8 5 4 2 0 1
2 5 4 0 4 5

Les 0 représentent des obstacles, et plus le nombre est grand, plus le "chemin" est long.
Par exemple, on pourrait dire que des 1 représentent le sol, des 2 de l'eau ou l'on marcherait moins vite etc..
Des poids négatifs peuvent également être rentrés (on ira encore plus vite).

Une fois chargée avec /Astar_load, la méthode $Astar_find(position depart, position arrivée) retourne la suite de "cases" qu'il faut parcourir pour atteindre le plus vite la position d'arrivée en partant de la position de départ. Si il n'y a pas de solution, rien n'est retourné.
A noter que la position de départ et celle d'arrivée sont a donner en imaginant que la carte est "a plat", donc sur une seule ligne.

Pour voir la liste des cases a parcourir, on peut par exemple faire ceci:

  var %res = $Astar_find(2, 15)
  var %i = 1
  while ($gettok(%res, %i, 32)) { echo -a Etape %i : case $v1 | inc %i }

Pour terminer correctement votre script, lorsque vous n'avez plus besoin d'utiliser l'algo, utilisez la commande /Astar_clear

Dernière chose, le chemin ne prend pas en compte les diagonales, mais si vous voulez en tenir compte, il suffit de modifier l'alias Astar_getNeighbors en rajoutant les tests de diagonales. (dans ce code je ne teste que si il y a des cases au dessus, en dessous, a gauche et a droite d'une certaine case).
 

Source

  • ;zip
  • /*
  • le zip contient un fichier lvl.txt ou chaque ligne est une case (de poid 0 ou 1)
  • il y a un exemple avec ce fichier.
  • Pour l'exécuter, placer le fichier .txt a la racine de mirc et taper la commande /test_astar
  • on peut changer les pos de depart et d'arrivée en changeant les valeurs à ces lignes dans la methode /test_astar:
  • var %deb 22
  • var %fin 120
  • (il faut bien sur que ces val soit dans l'intervalle 1 -> taille de la grille)
  • */
;zip

/*
 le zip contient un fichier lvl.txt ou chaque ligne est une case (de poid 0 ou 1)
 il y a un exemple avec ce fichier.
 Pour l'exécuter, placer le fichier .txt a la racine de mirc et taper la commande /test_astar
 on peut changer les pos de depart et d'arrivée en changeant les valeurs à ces lignes dans la methode /test_astar:
   var %deb 22
   var %fin 120
 (il faut bien sur que ces val soit dans l'intervalle 1 -> taille de la grille)
*/

Conclusion

Petite chose:
N'oublions pas de mirc reste mirc, et que cet algo aurait du mal a marcher si il y avait dans un jeu par exemple 4 intelligences artificielles cherchant leur chemin en même temps, et/ou si les grilles utilisées sont trop grandes.
Pour accélérer les choses, il est possible de définir certaines cases comme étant des points intermédiaires entre la position de départ et celle d'arrivée.
Ainsi au lieu de chercher par ex le chemin de 1 a 100 sur une grille 10 * 10, cherchez d'abord le chemin de 1 a 30 puis de 30 a 60 etc...
Ainsi il serait tout a fait possible que plusieures ia agissent en même temps avec un temps de calcul raisonnable.
Il faut bien sur placer ces points intermédiaires de manière intelligente, sous peine de voir votre ia faire de drôles de parcours.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de wims le 06/05/2008 22:29:39

Ah ouais carrément quoi !? (je reposterai quand j'aurais testé, c'étais histoire de marqué le coup!) ça a l'air bien, mais difficile pour ceux qui débute :o

signaler à un administrateur
Commentaire de PaDa le 06/05/2008 23:19:50 10/10

Wow, très intéressant ;-)
J'avais implémenté Dijkstra pour un cours en matlab, puis pour le défi de l'ami Wims sur scriptsdb.org, mais c'est extrêmement lent parce que récursif et "exhaustif", alors que ton truc est vraiment très efficace dès lors qu'on sait où aller et que notre map est pas trop tordu (cf http://fr.wikipedia.org/wiki/Algorithme_A*).
Je n'ai pas regardé encore l'implémentation en détail, mais en tout cas félicitation pour avoir tout commenté, ça rend la lecture beaucoup plus aisée ! Ca vaut bien un 10/10 rien que pour l'originalité !

signaler à un administrateur
Commentaire de RCA ArKanis le 08/05/2008 12:11:14

très sympathique :)
moins d'une seconde (700ms) pour trouver le chemin et l'afficher

Tu devrais juste remplacer ta ligne 4 par ça : var %file $scriptdir(lvl.txt), même si ça n'intervient que pour le test. Ca pourrait permettre à plus de personnes de le tester :p

Les aliases sont expliqués et leur syntaxe donnée, c'est agréable.
L'originalité et le résultat sont là. Il en est de même pour la propreté du code.
Donc, pour résumer, bravo :D

signaler à un administrateur
Commentaire de CsDarkman le 12/05/2008 15:51:35 10/10

interessant ta bien fai j'ai testé tn code et il fonctonne bien
voila plus 10 en attendant tn prochain code :D

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

ia bot de tiot [ par J4Gu4R ] voila G trouvé cette idée très interessante pour qu'un ami qui connais strictement rien à l'mirc puisse être guidé pas à pas sans être obligé d'être p un peu d'aide ne fait pas de mal [ par calopsfr ] je suis en train de créer une calculette pour mirc en dialog.... ou devrais-je dire, j'ia créé une calculette pour mirc en dialog. je cherche juste à demande d'algorithme [ par brownman ] je demande si vous pouvez trouver l'algorithme de ce type de codes:AB CD EF GH IJ KLet voila quelques codes:68 42 51 15 61 16 2858 55 29 89 25 27 1900


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.