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

Algorithmes et structures de données Discussion :

Petit problème avec l'algorithme de Dijkstra


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 167
    Points : 85
    Points
    85
    Par défaut Petit problème avec l'algorithme de Dijkstra
    Bonsoir,

    alors voila j'essaye d'implémenter l'algorithme de Dijkstra en Java.

    J'ai bien compris le principe qui consiste à utiliser une table de donnée composé des propriétés "noeud", "traité", "coût" et "chemin" qu'il faudra d'en un premier temps initialiser. Puis, remplir et enfin reparcourir en partant de la fin pour déterminer le plus court chemin.

    J'ai implémenter tout cela à travers des méthodes cependant voila j'ai une méthode qui permet de déterminer le coût non traité le plus faible de ma table de donnée, et aussi surprenant que cela peut-être, d'après l'exécution de mon programme, cette fonction retourne le coût le plus élevé ?? Je ne comprends vraiment pas le problème car la méthode me semble clairement juste (j'ai vérifié une dizaine de fois si je n'avais pas inversé de signes, etc...)

    Voici cette méthode :

    Code Java : 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
     
    public Entree coutMinNonTraite(ArrayList<Entree> tb) {
     
            Entree ent = null;
            boolean test = true;
     
            for (int i = 0; i < tb.size() - 1; i++) {
                if (tb.get(i).isTraite() == false && test == true) {
                    ent = tb.get(i);
                    test = false;
                }
                if ((tb.get(i + 1).isTraite() == false) && (tb.get(i + 1).getCout() < tb.get(i).getCout())) {
                    ent = tb.get(i + 1);
                }
            }
            return ent;
        }

    Elle est utilisé dans ma fonction de remplissage de ma table :

    Code Java : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    public void parcourir(int[][] mat, ArrayList<Entree> table) {
     
            System.out.println("\nDEBUT PARCOURS\n");
     
     
            while (fini(table) == false) {
     
                // 1
     
                Entree temp = coutMinNonTraite(table);
                temp.setTraite(true);
                System.out.println("\nLe noeud " + temp.getNoeud() + " a le plus petit cout et vient d'etre validé");
     
                // 2
     
                for (int i = 0; i < this.nbSommet; i++) {
     
                    int coutCourant = mat[temp.getNoeud() - 1][i];
     
                    if (coutCourant > 0 && coutCourant < 10000) {
     
                        table.get(i).setCout(temp.getCout() + coutCourant);
                        table.get(i).setPred(temp.getNoeud());
                        System.out.println("     Le fils " + (i + 1) + " du noeud père " + temp.getNoeud() +
                                " a un cout de " + coutCourant + " et vient d'etre sauvé dans la table (mais non validé)");
     
                        if (i == this.somFin) {
                            table.get(somFin-1).setTraite(true);
                        }
                    }
     
                }
     
                System.out.println("----------------------------------");
            }
     
            System.out.println("\nFIN PARCOURS\n");
        }

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void initTable(int somDeb) {
            for (int i = 1; i <= nbSommet; i++) {
                this.table.add(new Entree(i, false, 10000, 0));
            }
            this.table.get(somDeb - 1).setCout(0);
        }

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public boolean fini(ArrayList<Entree> table) {
     
            boolean test = true;
     
            for (int i = 0; i < table.size(); i++) {
                if (table.get(i).isTraite() == false) {
                    test = false;
                }
            }
            return test;
        }

    Pour info, Entree correspond à une entrée de la table (composé de "noeud", "traité", "coût" et "chemin".

    Voila je ne vois vraiment pas là où ça ne colle pas, j'ai suivi les étapes à la lettre

    Merci de m'aider.
    "La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !" -Albert Einstein

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    J'ai implémenter tout cela à travers des méthodes cependant voila j'ai une méthode qui permet de déterminer le coût non traité le plus faible de ma table de donnée, et aussi surprenant que cela peut-être, d'après l'exécution de mon programme, cette fonction retourne le coût le plus élevé ?? Je ne comprends vraiment pas le problème car la méthode me semble clairement juste (j'ai vérifié une dizaine de fois si je n'avais pas inversé de signes, etc...)
    Le mieux est encore de faire du print à tout va (c'est une des meilleure méthode de debuggage bas niveau)

    Affiche ton tableau avant de rentrer dans ta boucle. Et affiche ce qui se passe dans ton if (par exemple si tu rentres dans le if affiche la valeur, ce pourquoi tu es rentré dans le if, ...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Points : 231
    Points
    231
    Par défaut
    La structure de la fonction coutMinNonTraite est plutôt bizarre : tu sembles comparer la valeur de l'entrée courante (1) avec la valeur de l'entrée suivante (2), pour garder la meilleure des deux. Malheureusement, tu oublies laquelle c'est à l'itération suivante, et tu compares l'entrée (2) avec la (3), sans connaître la valeur de (1).
    Par ailleurs, même si tu te resservais de la meilleure valeur connue (dans la variable "ent" je suppose) dans la deuxième partie de ta boucle, la première (ci-dessous) l'écrase :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (tb.get(i).isTraite() == false && test == true) {
                    ent = tb.get(i);
                    test = false;
                }

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    C'est exact.

Discussions similaires

  1. Petits problèmes avec une CListCtrl
    Par vanitom dans le forum MFC
    Réponses: 2
    Dernier message: 17/11/2005, 11h45
  2. Un petit problème avec pop
    Par Paulinho dans le forum C++
    Réponses: 4
    Dernier message: 13/11/2005, 20h57
  3. Petit problème avec Line Input
    Par GrosQuicK dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/09/2005, 12h47
  4. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45
  5. Petit problème avec SDL
    Par Nyarlathotep dans le forum C
    Réponses: 10
    Dernier message: 01/07/2005, 09h10

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