begin process at 2010 02 09 22:10:03
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > ALGORITHME DE PATHFINDING A STAR (A*)

ALGORITHME DE PATHFINDING A STAR (A*)


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Source .NET ( DotNet ) Classé sous :astar, star, pathfinding, algorithme, algo Niveau :Initié Date de création :23/01/2007 Date de mise à jour :03/01/2009 18:29:08 Vu / téléchargé :15 572 / 1 068

Auteur : Bidou

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
A Star (A*) Algorithme C# - Pathfinding

A* est un algorithme de type pathfinding. C'est à dire que c'est un algorithme qui est capable de trouver un chemin entre deux points, en prenant en compte certaines contraintes. Il existe plusieurs algorithmes de type pathfinding, mais AStar est un des meilleurs en termes de simplicité, performance et ressource.

Presque tous les jeux récents utilisent ce genre d'algorithme (avec bien entendu des améliorations faites maison). Pensez, par exemple, à un jeu où l'ordinateur qui est votre adversaire doit déplacer des unités: il doit les amener d'un point de la map à un autre, en respectant certaines contraintes telles que des unités ennemies, des montagnes où les unités avancent moins vites, peut-être des ruisseaux, etc.

A* est capable de prendre en compte ces différentes contraintes et de calculer le chemin le plus court pour aller de A à B. Le net grouille d'informations qui explique le fonctionnement (assez simple) de cet algorithme, je ne vais donc pas le réexpliquer ici. Vous trouverez néamoins un fichier html qui décrit de manière très simple le fonctionnement (j'ai implémenté l'algorithme grâce à ce document que j'ai trouvé sur le web).

La solution contient trois projets: un projet library qui contient A Star (A*) à proprement parlé, un autre qui contient les classes pour représenter graphiquement le résultat de l'algorithme (cf. capture) et un projet Windows qui utilise les deux autres projets pour qu'on puisse tester.

J'ai rajouté également des maps au projet pour qu'on puisse voir le résultat instantanément. Dans le cas de la map "laby" par exemple, vous verrez des cases bleues et rouges. Ces cases représentent des contraintes, c'est à dire qu'elles ont une certaine pondérations (x2 pour la case bleue, x5 pour la case rouge). Autrement dit, l'algorithme va calculer le chemin le plus adapté en partant du principe que s'il passe sur une case rouge ça lui prendra 5x plus de temps que de passer sur une case normale (pour reprendre la comparaison ci-dessus, ça pourrait être l'équivalent d'un passage dans du sable où les unités sont ralenties).

Il est naturellement possible d'améliorer ce projet, par exemple en gérant les déplacements diagonaux, en prenant en compte des contraintes plus complexes, en améliorant la rapidé de l'algorithme AStar, etc.
Le projet qui implémente l'algo A Star est donc pratiquement prêt à l'emplois tel quel, suffit de le rajouter à votre solution...

N'hésitez pas à soumettre vos remarques, je tâcherai de les prendre en compte dans une future version.

Source

  • public List<MapPoint> CalculateBestPath()
  • {
  • Node.Map = this._map;
  • Node startNode = new Node(null, this._map.StartPoint);
  • this._open.Add(startNode);
  • while (this._open.Count > 0)
  • {
  • Node best = this._open.RemoveFirst(); // This is the best node
  • if (best.MapPoint == _map.EndPoint) // We are finished
  • {
  • List<MapPoint> sol = new List<MapPoint>(); // The solution
  • while (best.Parent != null)
  • {
  • sol.Add(best.MapPoint);
  • best = best.Parent;
  • }
  • return sol; // Return the solution when the parent is null (the first point)
  • }
  • this._close.Add(best);
  • this.AddToOpen(best, best.GetPossibleNode());
  • }
  • // No path found
  • return null;
  • }
        public List<MapPoint> CalculateBestPath()
        {
            Node.Map = this._map;
            Node startNode = new Node(null, this._map.StartPoint);
            this._open.Add(startNode);

            while (this._open.Count > 0)
            {
                Node best = this._open.RemoveFirst();   // This is the best node
                if (best.MapPoint == _map.EndPoint)     // We are finished
                {
                    List<MapPoint> sol = new List<MapPoint>(); // The solution
                    while (best.Parent != null)
                    {
                        sol.Add(best.MapPoint);
                        best = best.Parent;
                    }
                    return sol; // Return the solution when the parent is null (the first point)
                }
                this._close.Add(best);
                this.AddToOpen(best, best.GetPossibleNode());
            }
            // No path found
            return null;
        }

 Conclusion

Remarquez qu'au niveau du Control qui s'occupe de représenter la map en cours, il y a actuellement un petit bug avec les threads que je n'ai pas encore réussi à résoudre, mais j'espère corriger dans une prochaine version.

 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


 Historique

24 janvier 2007 15:29:39 :
Corrections de quelques fautes dans le texte, ajout d'une map dans le projet, prise en compte des commentaires (ajouts dichotomique, RemoveAt)
25 janvier 2007 22:25:27 :
Petites corrections (détails) dans le code
19 février 2007 21:36:15 :
Correction de la description
04 novembre 2008 19:55:25 :
Rien rien :)
03 janvier 2009 18:29:09 :
Class plus générique

 Sources du même auteur

Source avec Zip Source .NET (Dotnet) CHESS GAME CORE - LIBRAIRIE JEU D'ÉCHEC EN C#
Source avec Zip Source avec une capture Source .NET (Dotnet) CUBE-IT: PETIT JEU EN WPF
Source avec Zip Source avec une capture Source .NET (Dotnet) YOUTUBE VIEWER
Source avec Zip Source avec une capture Source .NET (Dotnet) COLOR WHEEL
Source avec Zip Source avec une capture Source .NET (Dotnet) PETIT EXEMPLE UTILISANT XAML ET WPF

 Sources de la même categorie

RECHERCHE DE DEUX SOUS ENSEMBLE DONT LES SOMMES DES ÉLÈMENTS... par deadhand
Source avec Zip Source avec une capture Source .NET (Dotnet) METHODE GRAPHIQUE EN PROGRAMMATION LINÉAIRE par vindos
Source avec Zip Source avec une capture Source .NET (Dotnet) RECTANGLES par krissssss
Source avec Zip Source avec une capture SODOKU MUSING (PERMUTATION & SODOKU) par krissssss
Source avec Zip Source avec une capture Source .NET (Dotnet) ANALYSEUR LEXICAL ET SYNTAXIQUE DES FORMULES PROPOSITIONNELL... par boutemine

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) SUDOKU SOLVER par swonder
Source avec Zip Source avec une capture Source .NET (Dotnet) TRADUCTEUR ALGO VISUAL BASIC .NET/C# par rhonin33
Source avec Zip Source avec une capture Source .NET (Dotnet) UN JEU OU IL FAUT ALIGNER 4 COULEURS POUR CASSER DES BLOCKS... par Mokost
Source avec Zip Source .NET (Dotnet) ENHANCED STRING MATCHING par pch_hotline
Source .NET (Dotnet) APPLICATION DE L'ALGO DE WAGNER ET FISHER par artosane

Commentaires et avis

Commentaire de MoDDiB le 23/01/2007 22:50:07

Je n'ai pas regardé la source mais juste la preview du code :
Node best = this._open[0]; // This is the best node
this._open.Remove(best);

Comme c'est un algo coûteux :
this._open.RemoveAt(0);  
sera un peu plus rapide (à cause du IndexOf dans la fonction Remove (je me doute que tu le sais, je le dis pour les autres :) ))
Ca n'est pas grand chose mais dans un jeu ou dans project hoshimi ça peut être très bénéfique :)

Commentaire de Bidou le 24/01/2007 07:11:58 administrateur CS

Merci pour le commentaire.
Ce n'est pas un algo trop coûteux justement, mais concernant le Remove tu as bien sûr raison (ça sera corrigé dans la prochaine version).
Il est clair que c'est plus rapide d'aller supprimer à un élément précis, que de devoir itérer pour retrouver cet élément [ Remove(object o) fait un IndexOf pour avoir l'index puis un RemoveAt, en gros on gagne donc un IndexOf(). En même temps, puisqu'il s'agit toujours d'un RemoveAt(0), IndexOf n'aura qu'une itération à faire, ce qui est relativement négligeable ]

Commentaire de MoDDiB le 24/01/2007 09:53:04

Oui effectivement le gain n'est pas trop important comme il est en première position.
Disons que j'ai du utiliser cet algo il y a 3 ans pour un jeu de stratégie temps réel avec 70 unités en même temps sur une carte 500*500 et forcément là il vaut mieux tout faire pour être le plus performant.
Comme par exemple pour l'insertion tu utilises un comparer alors que normalement la liste est déjà entièrement triée : tu peux donc obtenir l'index où insérer en faisant une recherche dichotomique.
De la même manière pour tester si un noeud appartient à la liste open tu fais un Contains alors qu'un tableau à 2 dimensions de booléens seraient beaucoup plus rapide.
Bien entendu pour présenter une source à code source j'aurais fait comme toi et préféré un joli code plutôt qu'un code moche et performant : ces indications sont surtout pour ceux qui veulent l'utiliser dans un jeu temps réél.
Enfin bref 10 : l'algo aussi bien présenté manquait à csharpfr :)

Commentaire de Bidou le 24/01/2007 11:12:39 administrateur CS

Merci pour la note ;-)
Le but est effectivement de présenter l'algorithme de manière agréable et comme je l'ai précisé il s'agit d'une version de base qui peut (qui doit) être améliorée. En tout cas merci pour les différentes idées, j'en tiendrai certainement compte pour les prochaines versions!

Commentaire de sebmafate le 24/01/2007 16:06:31 administrateur CS

sympa... ca me ramène quelques années en arrière... à l'époque où j'apprenais le LISP :)
c'était sympa la fac :p

Commentaire de notavelido le 25/01/2010 07:14:35

Bonjour à tous,
Ce programme semble des plus intéressant et pourrait vraiment m'aider à la réalisation d'un de mes projets, cela dit j'ai un petit problème. Quand j'essaie de lancer la solution, une erreur survient en me disant que: "Le fichier projet ou le site Web a été déplacé ou ne se trouve pas sur mon ordinateur."
Quelqu'un saurait-il comment pallier à ce problème?

En vous remerciant d'avance

Commentaire de Bidou le 25/01/2010 09:15:33 administrateur CS

Bonjour,
Une fois le zip téléchargé et extrait, ouvrir la solution et sélectionner le bon projet comme projet de démarrage (AStarTester). C'est tout.

Commentaire de notavelido le 25/01/2010 10:50:20

Re-Bonjour,
Et merci pour la réponse rapide ;-)

Bonne fin de journée

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

recherche algo de trie alphabetique en C [ par mikolemarseillais ] salut à tousje souhaite créer une fonction en C qui pourra trier les donnés d'un fichier(par ex: trier par nom) par ordre alphabetique.Merci de m'aide Je comprends pas cette algorithme [ par kaiwoo ] private bool AUneVirgule (double nb){long tmp = (long)nb;if (tmp == nb)return false;elsereturn true;}Pour info, il a été fait par un super membre du f Algorithme de placement [ par oberown ] Je cherche des noms d'algorithmes ou des idées, pour résoudre ce genre de problème.On a trois jours, et chaque jours 2 personnes peut se présenter. On conversion algo / C++ [ par Kirdream ] Bonjour, j'ai commencé à écrire la programmation de la fenêtre et des menus mais je bute sur la fonction de la conversion.Est-ce que vous auriez une i Algorithme Mot Caché [ par nuns ] Salut tout le monde,Je voudrais savoir si il y a quelqu ' un qui aurait un générateur de mot Caché, le jeux, avec les grille ou il faut chercher les m PathFinding A* [ par gomoz ] Bonjour, je dois programmer un PathFinding mais j'ai vraiment du mal :(.Est-ce que vous pourriez m'aider &#224; comprendre le fonctionnement de A* ?Vo algorithme génétique programmé en c# [ par johelle ] slt,je veux savoir si'il ya quelqu'un dans ce forum qui a un programme d'un algorithme g&#233;n&#233;tique en c#et merci. Algorithme de dijkstra [ par RM50Man ] Est - ce que quelqu'un pourrait comment trouver la matrice ligneds l algorithme de dijkstra!!!!Merci!!!RM50man Algo FFT de multiplication rapide [ par Gruh ] &nbsp;&nbsp;&nbsp;Voil&#224;, je suis en deuxi&#232;me ann&#233;e de pr&#233;pa maths et je suis au d&#233;s&#233;spoir pour mon Tipe ( travail perso ca c'est un beug pour lse star de C# [ par hred1 ] Bonjour,J'ai rajout&#233; cette partie du code dons mon projet et depuis mon programe beug public struct TUserData {<FO


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

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,686 sec (4)

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