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 :

[Path Finding] Algorithme A star


Sujet :

C

  1. #1
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut [Path Finding] Algorithme A star
    Bonjour à tous,

    Je dois créer un algorithme de recherche du plus court chemin pour mon jeux vidéo 2D. J'ai bien compris le principe de l'algo en allant sur le net mais pour son implémentation en C, je bloque.

    J'ai déjà créé une structure pour chaque noeud (case) :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct noeud
    {
    int x, y;
    int cout_f, cout_g, cout_h;
    struct noeud * parent;
    }
    Mais est ce que je dois utiliser des listes chainées obligatoirement pour coder cet algorithme en C ? Je ne vois pas comment créer les listes ouvertes et fermés

    Merci beaucoup
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bonjour,
    Je ne vois pas ce que tu appelles listes ouvertes ou fermées. Peux-tu élaborer?

    Au niveau de la structure que tu as créée: Si c'est pour un arbre, alors c'est le format le moins efficace qui existe: L'arbre à chaînage inversé. Ce format peut être sympa pour stocker des données sérialisées (je crois qu'il est assez populaire dans une table de base de données), mais PITA pour manipuler des données en mémoire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Salut,

    Les listes ouvertes et fermés sont celles utilisées dans l'algorithme :
    http://khayyam.developpez.com/articl...o/astar/#LII-1

    Et je n'utilise pas d'arbre, j'utilise une matrice pour découper mon terrain de jeu, exactement comme dans le lien que je viens de te donner.

    Le seul hic, c'est que c'est codé en C++ et non en C et en C++, c'est un langage orienté objet donc plus facile de coder l'algorithme

    Mon problème réside dans la création d'une liste pour stocker des "objets" de type noeud (cf mon typedef) avec les opérations de base (ajout, suppression, insertion).

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    J'avais fait un code réutilisable sympa pour des listes simplement chaînées en C, mais je ne l'ai pas sous la main. Il faudrait que tu me contactes ce soir pour me le demander. Sinon, tu peux essayer de contacter Cyrine, je le lui avais envoyé...

    Sinon, tu peux peut-être essayer les conteneurs de la GLib, je ne m'y suis jamais attaqué, mais j'ai "entendu" dire qu'elle était sympa.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Juste pour info, il y a aussi l'algorithme de Dijkstra pour trouver le plus court chemin. L'inconvénient c'est qu'il ne tient pas compte des info topologiques, mais l'avantage c'est qu'il te garantit le plus court.

    http://fr.wikipedia.org/wiki/Algorithme_de_Dijkstra

    Hadrien

  6. #6
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut
    Tu n'es pas obligé de prendre des listes, tu peux partir sur des tableaux si ça te chante. C'est juste que l'algorithme nécessite de passer des éléments d'un tableau à un autre (donc avec suppression en milieu de tableau).

    La liste chainée est en effet une bien meilleure structure de données que le tableau pour le A* (la liste chainée triée peut même être plus performante encore).

    http://nicolasj.developpez.com/articles/listesimple/ ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    J'ai du mal à voir la performance d'une liste chaînée triée par rapport à une liste chaînée normale.

    Pour moi, ça réduit seulement le temps de recherche d'un facteur deux (puisqu'une recherche dichotomique est impossible, une liste chaînée n'étant pas un arbre) au prix d'une insertion qui passe du temps constant au temps linéaire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    J'ai du mal à voir la performance d'une liste chaînée triée par rapport à une liste chaînée normale.
    c'est juste que l'algo A* a souvent besoin de prendre le "meilleur" élément d'une liste. Si cette liste est triée, la récupération de cet élément se fait en O(1) : c'est le premier de la liste.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Joli.
    Il est temps que je lise l'article sur le A*...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Bonsoir à tous
    Merci pour vos réponses.

    Effectivement, la liste chainée triée permet d'aller plus vite mais pour l'instant, peut importe la vitesse, je veux juste que ca marche et après à la rigeur on optimisera si nécessaire

    Médinoc m'a proposé un code pour les listes chainées, donc si tu pouvais me l'envoyer ou alors l'uploader sur ce thread ca sera super sympa

    Ensuite, avant que je me lance pour rien, pensez vous que la structure de liste chainée soit correcte pour coder la "ListeOuverte" et la "ListeFermée" de l'algo A* ?
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut Projet avec code réutilisable sur les listes chaînées
    Salut,

    Aujourd'hui, je n'ai pas le temps donner un exemple propre et clair d'utilisation du code, donc j'envoie directement le projet.
    Ce projet utilise trois fois le même code de listes chaînées pour trois types différents. Notez qu'il s'agit de listes chaînées intrusives.
    Fichiers attachés Fichiers attachés
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Salut,
    Je ne vois pas le code pour les listes chainées avec les fonctions d'ajout, d'insertion, de suppression, de recherche dans la liste...

    PS : C'est quoi des chaines intrusives ?
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Une liste chaînée est dite intrusive quand le pointeur suivant est un champ de la structure utilisée.

    Le code des fonctions de liste est dans liste.cinc, qui est inclus par plusieurs fichiers source différents.
    Ces fonctions permettent de parcourir la liste (y compris avec un parcours indirect), d'insérer un élément dans la liste (avec un pointeur de pointeur), et de détacher un élément de la liste pour le détruire séparément.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Ton code est un peu compliqué pour moi mais merci de me l'avoir envoyé

    J'ai trouvé un code assez simple sur les listes chainées :
    http://chgi.developpez.com/sortlist/

    Par contre, je voulais créer une fonction qui supprime un élément précis de la chaine :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    int deleteNoeud(slist **sl, t_noeud n)
    {
        slist *tmp;
        if (!*sl) return -1;
     
        while (*sl)
        {
            tmp = (*sl)->suiv;
     
            if (comparerStructure((*sl)->data, n) == 1) // si on a trouvé le bon noeud
            {
                free(*sl); // on le delete
                *sl = tmp;
                return 0;
            }
     
            *sl = tmp;
        }
     
        return -1; // on a pas trouvé
    }
    Le problème c'est que une fois le noeud supprimé (ca marche), ma liste chainée est vide !!!

    J'ai exactement piqué le même code sauf que j'ai remplacé "Val" par une structure t_noeud

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

Discussions similaires

  1. Améliorer mon algorithme A star
    Par kump_ dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 16/08/2009, 15h22
  2. Path finding 3D dynamique et pas cher ?
    Par Harooold dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 25/03/2009, 10h17
  3. Algorithme A Star
    Par Rumpel dans le forum Intelligence artificielle
    Réponses: 3
    Dernier message: 22/01/2009, 17h19
  4. Réponses: 1
    Dernier message: 14/12/2008, 23h39
  5. [path finding] Recherche d'un chemin "plus rapide"
    Par ReiVon dans le forum Intelligence artificielle
    Réponses: 9
    Dernier message: 29/11/2008, 10h31

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