begin process at 2010 03 21 20:06:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > ALGORITHME A*

ALGORITHME A*


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :4 570 / 98

Auteur : fjxokt

Ecrire un message privé
Site perso
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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture IMAGESHACK UPLOADER V0.1 ALPHA
Source avec Zip Source avec une capture AUTO COMPLÉTION V1
Source avec Zip CREATION DE TABLEAUX ALPHA
Source avec Zip Source avec une capture STEGBMP (STEGANOGRAPHIE)
Source avec une capture SELECTEUR DE COULEURS

 Sources de la même categorie

AVOIR UNE LISTE D'UTILISATEUR EN COULEURS SELON LEURS SEXE P... par WorldDMT
COMMANDES FANTAISIES ( OP DEOP , VOICE DEVOICE ) ORIGINALES par Orona
Source avec Zip Source avec une capture CORRECTEUR par Orona
Source avec Zip Source avec une capture [DLL] DESSINER COMME LES PICWINS SUR UNE DIALOGBOX (BONUS: J... par uaip
Source avec Zip Source avec une capture [DLL] AJOUT D'UN CONTRÔLE RICHEDIT SCINTILLA SUR LES DIALOG... par uaip

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture PACMAN ONLINE - 4 JOUEURS par wims
Source avec une capture JESSICA ET MELINDA V4.0 par GjMan9
Source avec Zip Source avec une capture AUTO COMPLÉTION V1 par fjxokt
METHODE DE CRYPTAGE par kefou
Source avec Zip Source avec une capture ** GUARD BOT ** BOT EN SOCKET par SornDrixer

Commentaires et avis

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

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é !

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

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

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales