IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Algorithme A* : optimisation


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Avril 2013
    Messages : 32
    Par défaut Algorithme A* : optimisation
    Bonjour !

    J'ai codé un algorithme A* qui fonctionne très bien, mais que j'aimerais optimiser car il devra à terme tourner sur une Raspberry Pi. Le temps d'initialisation (chargement de graphe par exemple) peut être long tant que les recherches de chemin derrière sont rapides. L'objectif serait d'obtenir une recherche de chemin sur une surface de 200*300 avec des pas de 20, en plus d'un lissage post A* afin d'éviter les déplacements saccadés. Est-ce réaliste de viser un temps de calcul de l'ordre de la demi-seconde ?

    J'avais au départ une création à la volée des noeuds à chaque recherche de chemin, que j'ai modifié pour qu'ils soient tous créés dans le constructeur. J'ai rangé les noeuds dans un std::vector, et je les retrouve à l'aide de leur id.
    Je me demandais si ce ne serait pas plus intéressant de créer un tableau à deux dimensions dans lequel je placerais les noeuds à la case correspondant à leur coordonnée sur la surface, quitte à diviser les coordonnées par 20 (le pas) afin d'éviter les cases de tableau vides ?

    Afin d'assurer l'absence de fuite de mémoires, j'utilise des shared_ptr pour manipuler les noeuds, est-ce que cela allégerait notablement les calculs d'utiliser de simples pointeurs ?

    Merci d'avance pour vos réponses !

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Bonjour,

    Attention, vector risque d'être trop lent, si tu fais juste un find.
    Préfère au choix: un arbre ou un binary_search sur un vector trié.

    La grille est envisageable, elle aussi, renseigne-toi sur le quad-tree.

    Si tu as juste une liste constante, un vecteur de pointeurs nus, c'est plus rapide (moins de controles)
    Si en plus, tous tes nœuds sont de la meme classe, un vecteur de nœud est encore mieux.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Avril 2013
    Messages : 32
    Par défaut
    Merci pour tes conseils. Le quad_tree est vraiment intéressant.

    Quand tu dis :
    Si en plus, tous tes nœuds sont de la meme classe, un vecteur de nœud est encore mieux.
    Tu parles d'un std::vector<Noeud> au lieu de std::vector<Noeud*> ?

  4. #4
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par leternel Voir le message
    Attention, vector risque d'être trop lent, si tu fais juste un find.
    Préfère au choix: un arbre ou un binary_search sur un vector trié.
    Ou un unordered_set vu que la recherche se fait par id.

    (binary_search je connaissais pas, je recodais une recherche dichotomique dès que j'avais un vector trié, merci ça va m'éviter de refaire ça à chaque fois.)
    Citation Envoyé par LiquidHuk Voir le message
    Tu parles d'un std::vector<Noeud> au lieu de std::vector<Noeud*> ?
    Oui, un déréfencement de pointeur en moins à chaque accès.

    (edit: bouh binary_search ne retourne pas d'itérateur sur l'élément trouvé. Une fonction équivalente existe retournant un itérateur ?)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Avril 2013
    Messages : 32
    Par défaut
    Je suis désolé, mais je vais revenir sur l'idée de ma grille.

    Il se trouve que quand je recherche un noeud, je possède ses coordonnées sur la surface (je calcule leur id en fonction des coordonnées). Si je range les noeuds de la manière suivante :

    Noeud(x,y) dans grille[x/pas][y/pas].

    Je n'aurais plus à parcourir la grille afin de trouver mon noeud : il me suffira à partir d'une coordonnée (x,y) sur la surface de faire noeud = grille[x/pas][y/pas].

    Je ne vois pas comment parcourir un quad_tree pourrait être plus rapide ?

    Par contre, je pense pencher pour le unordered_set pour les autres listes de noeuds. Je pense que lequad_tree pourrait être utile pour une gestion des obstacles dynamiques, dans le cas où les obstacles ne sont pas connus à l'avance (dans ce cas on vérifie à chaque noeud s'il est sur un obstacle).

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    C'est l'idée du quad-tree, en effet.

    Si ta grille est pleine (math: pour tout (i,j) de la grille, grille(i,j) est un nœud) alors un tableau est rentable.
    Dans ce cas, regarde cette entrée de la faq, et la suivante.

    Sinon, une unsorted-map<Coord, Nœud> (de boost/C++11) permet un acces direct aux entrées.

    Autre possibilité, en te basant sur le code de map que tu trouveras dans ton compilo, implémenter une map2D. Cependant, pour avoir essayez, c'est assez galère d'avoir une sémantique cohérente.

    En fait, ton problème vient d'autre chose: tu n'as pas de classe ou conteneur adapté à ton besoin.
    Cherche la sémantique et les usages voulus de ta grille, et écris l'interface d'une classe qui la proposerait.
    Quand tu nous l'auras présentée, il sera bien plus facile de te guider.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    Citation Envoyé par LiquidHuk Voir le message
    Bonjour !

    J'ai codé un algorithme A* qui fonctionne très bien, mais que j'aimerais optimiser car il devra à terme tourner sur une Raspberry Pi. Le temps d'initialisation (chargement de graphe par exemple) peut être long tant que les recherches de chemin derrière sont rapides. L'objectif serait d'obtenir une recherche de chemin sur une surface de 200*300 avec des pas de 20, en plus d'un lissage post A* afin d'éviter les déplacements saccadés. Est-ce réaliste de viser un temps de calcul de l'ordre de la demi-seconde ?

    Merci d'avance pour vos réponses !
    Hum c'est bizarre mais la CPU utilisée, la taille de la carte et le lissage me font étrangement penser à la coupe de France de robotique

    Connais-tu boost.graph, qui propose l'algo A*? Tu devrais voir s'il n'est pas plus rapide que ton implémentation maison!! http://www.boost.org/doc/libs/1_53_0...tar-cities.cpp

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Avril 2013
    Messages : 32
    Par défaut
    Citation Envoyé par victor_gasgas Voir le message
    Hum c'est bizarre mais la CPU utilisée, la taille de la carte et le lissage me font étrangement penser à la coupe de France de robotique
    Je ne vois pas du tout de quoi tu veux parler !
    J'ai participé l'an dernier et, même si je viendrais aussi cette année, j'ai très peu participé au projet. Je compte faire un pathfinding solide pour les années à venir

    Je vais regarder boost.graph, merci !

Discussions similaires

  1. [Débutant] comment implementer cet algorithme d'optimisation
    Par moslem7 dans le forum MATLAB
    Réponses: 2
    Dernier message: 15/09/2012, 20h26
  2. Algorithme et optimisation
    Par Ismael94000 dans le forum C#
    Réponses: 3
    Dernier message: 16/08/2012, 15h14
  3. recherche algorithme d'optimisation
    Par jlf205 dans le forum MATLAB
    Réponses: 3
    Dernier message: 09/07/2010, 14h32
  4. Algorithme d'optimisation par colonie de fourmis
    Par floopy dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 08/11/2006, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo