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 de Ford-Bellman


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 20
    Points : 20
    Points
    20
    Par défaut Algorithme de Ford-Bellman
    Bonjour,

    Je voudrais utiliser cet algorithme de Ford-Bellman pour obtenir le chemin maximum du sommet A au sommet K dans un graphe orienté.

    Voici mon code :
    Code : 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    #include <iostream>
    using namespace std;
     
    typedef struct {
    	int u, v, w;
    } Arc;
     
    int n;			//nombre de sommets
    int e;			//nombre d'arcs
    Arc arcs[32];      //tableau de 32 arcs maxi
    int d[32];		//tableau des valeurs des distances aux noeuds situés à chaque indices du tableau
     
    //const int INFINITY=10000;
     
    void printDist() {
    	int i;
     
    	cout << "Distances:" <<endl;
     
    	for (i = 0; i < n; ++i)
    		printf_s("au noeud: %c, on a un cout de :%d\n", '@' + i + 1, d[i]);
     
    	cout << endl;
    }
     
    void bellman_ford(int s) {
    	int i, j;
     
    	// Initialiser la matrice des distances à 0
    	for (i = 0; i < n; i++)
    		d[i] = 0;
     
    	d[s] = 0; // Valeur de la distance du sommet de départ
     
    	// Pour chaque sommet
    	for (i = 0; i < n - 1; i++)
    		for (j = 0; j < e; j++) // Parcourir tous les arcs à la recherche de celui dont le cout est le + élevé
    			if (d[arcs[j].u] + arcs[j].w > d[arcs[j].v])
    				d[arcs[j].v] = d[arcs[j].u] + arcs[j].w;
    }
     
    int main(int argc, char *argv[]) {
    	int i, j;
    	int w;
    	errno_t err;
    	FILE *fin; // Fichier "dist.txt"
    	try
    	{
     
    		err = fopen_s(&fin, "dist.txt", "r");
    		if(err) cout << "Le fichier \"dist.txt\" n'a pas pu etre ouvert" << endl;
     
    		fscanf_s(fin, "%d", &n);
    		e = 0;
     
    		for (i = 0; i < n; ++i) 
    			for (j = 0; j < n; ++j) {
    				fscanf_s(fin, "%d", &w);
    				if (w != 0) {
    					arcs[e].u = i; // Premier sommet de l'arc
    					arcs[e].v = j; // Second sommet de l'arc
    					arcs[e].w = w; // Valuation de l'arc
    					++e;
    				}
    			}
     
     
    		//printDist(); 
     
    		bellman_ford(0);
     
    		printDist();
     
    	}
    	catch(...){
    		cout << "Il y a eu une erreur" << endl ;	
    		fclose(fin);
    	}
     
    	return 0;
    }
    Et voici la matrice (du fichier "dist.txt"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    11
    0 2 0 0 0 10 0 0 15 0 0
    0 0 5 0 0 0 25 0 0 0 0
    0 0 0 10 0 0 0 50 0 0 0
    0 0 0 0 25 0 0 45 0 0 0
    0 0 0 0 0 0 0 0 0 0 15
    0 0 0 0 0 0 40 0 20 0 0
    0 0 0 0 0 0 0 20 0 0 0
    0 0 0 0 15 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 5 0
    0 0 0 0 20 0 0 0 0 0 45
    0 0 0 0 0 0 0 0 0 0 0
    Le fait est que pour calculer le chemin minimum, il marche bien, mais pr le chemin maxi, le résultat est faux et j'ai bien l'impression qu'il fait ses tests en colonne au lieu de les faire en ligne. C'est peut être ma façon de faire la matrice qui est fausse ?

    Je place le dessin du graphe en question en pj.

    Est ce que vous voyez l'erreur s'il vous plait ?

    Merci d'avance pour votre aide.
    Images attachées Images attachées  

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Outre que ton code est un affreux mélange de C et de C++, je te conseille de rajouter quelques traces pour voir ce qu'il se passe à chaque étape de ton algo. Cela te permettra d'identifier plus rapidement le problème.
    Bon courage.

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Mélange horrible en effet.
    De C++ il n'y a que le try / catch, très mal utilisé; et une en-tête (iostream, alors que tu utilises printf ! )
    Avec en prime des variables globales !

    Plus sérieusement, je te conseille de jeter un coup d'oeil sur un bon cours C++ (livre ou bien ressources Developpez.com) si tu veux écrire quelque chose de correct.
    Après, si tu veux juste finir vite, suit le conseil de 3DArchi ci dessus.

    Bonne continuation,

    Poukill

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 20
    Points : 20
    Points
    20
    Par défaut Merci je regarde
    Merci je regarde,
    Bon j'ai pas tte la nuit mais à priori pr l'algo c'est bon sur le principe.
    Niveau affreux mélange, je peux faire mieux et je reposterai + tard au sujet du fabuleux c++...

    Et merci encore pr les réponses
    @+

Discussions similaires

  1. Comparaison d'algorithmes : A* et Bellman-Ford
    Par geforce dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 23/05/2015, 22h35
  2. Algorithme de ford
    Par jcaspar dans le forum Mathématiques
    Réponses: 1
    Dernier message: 07/09/2011, 09h58
  3. Algorithme de Ford Fulkerson
    Par camelia136 dans le forum MATLAB
    Réponses: 8
    Dernier message: 10/08/2011, 14h39
  4. Algorithme de Ford-Fulkerson
    Par Du Wassoulou dans le forum C++
    Réponses: 3
    Dernier message: 26/12/2010, 19h29
  5. algorithme de Ford (recherche chemin le plus court)
    Par abstraite dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 19/05/2005, 10h39

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