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

MATLAB Discussion :

Algorithme de Ford Fulkerson


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Points : 21
    Points
    21
    Par défaut Algorithme de Ford Fulkerson
    bonjour,

    j'ai 2 fonctions pour l'algorithme de Ford Fulkerson qui resout le problème des flots maximums

    la première fonction qui est la fonction principale qui permet d'augmenter la capacité des segments

    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
    function max_flow=ff_max_flow(source,sink,capacity,nodes_number)
     
     
    current_flow=zeros(nodes_number,nodes_number);
     
    max_flow=0;
     
    augmentpath = bfs_augmentpath(source,sink,current_flow,capacity,nodes_number);
     
         %bfs_augmentpath(2,6,current_flow,capacity,6)
     
    while ~isempty(augmentpath)
     
        % if there exits a augment path, update teh current_flow    
        increment = inf;
        for i=1:length(augmentpath)-1
            increment=min(increment, capacity(augmentpath(i),augmentpath(i+1))-current_flow(augmentpath(i),augmentpath(i+1)));
        end
     
        %now increase the current_flow
     
        for i=1:length(augmentpath)-1
            current_flow(augmentpath(i),augmentpath(i+1))=current_flow(augmentpath(i),augmentpath(i+1))+increment;
            current_flow(augmentpath(i+1),augmentpath(i))=current_flow(augmentpath(i+1),augmentpath(i))-increment;
        end
        max_flow=max_flow+increment;
        augmentpath = bfs_augmentpath(source,sink,current_flow,capacity,nodes_number);% try to find new augment path    
     
    end

    et la deuxième

    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
    %WHITE =0;
    %GRAY=1;
    %BLACK=2
     
    function augmentpath=bfs_augmentpath(start,target,current_flow,capacity,n)
        n=10;
        WHITE =0;
        GRAY=1;
        BLACK=2;
        color(1:n)=WHITE;
        head=1;
        tail=1;
        q=[];
        augmentpath=[];
        start=2;
        bInf = 0.5 ;
        bSup = 5 ;
        M    =    6 ;
        N    =    6 ;
     
        capacity = bInf + (bSup-bInf).*rand(M, N);
     
        %ENQUEUE
     
        q=[start q];
     
        color(start)=GRAY;
     
        pred(start) = -1;
     
        pred=zeros(1,n);
     
        while ~isempty (q) 
        %    [u,q]=dequeue(q);
                u=q(end);
                q(end)=[];
                color(u)=BLACK;
        %     dequeue end here
     
                for v=1:n
                    if (color(v)==WHITE && capacity(u,v)>current_flow(u,v) )
        %enqueue(v,q)
                        q=[v q];
                        color(v)=GRAY;
        % enqueue end here
                        pred(v)=u;                        
     
                    end
                end
        end
     
        if color(target)==BLACK       %if target is accessible
           temp=target;
           while pred(temp)~=start
            augmentpath = [pred(temp) augmentpath];     %augment path doesnt containt the start point AND target point
            temp=pred(temp);
           end
           augmentpath=[start augmentpath target];
        else
            augmentpath=[];         % default resulte is empty
        end
    je compile en premier temps la 2em fonction car je l'utilise dans la seconde

    et on me sort comme quoi il y'a erreur dans la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (color(v)==WHITE && capacity(u,v)>current_flow(u,v) )

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Serait-il possible de voir l'erreur que tu obtiens?

    Duf

    P.S. Qu'entends-tu par "compiler", si c'est pour exécuter dans MATLAB il n'y a pas de compilation puisque c'est un langage interprété.
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par duf42 Voir le message
    Bonjour,

    Serait-il possible de voir l'erreur que tu obtiens?

    Duf

    P.S. Qu'entends-tu par "compiler", si c'est pour exécuter dans MATLAB il n'y a pas de compilation puisque c'est un langage interprété.
    oui je veux dire exécuter

    ??? Attempted to access capacity(2,7); index out of bounds because size(capacity)=[6,6].
    
    Error in ==> bfs_augmentpath at 42
                    if (color(v)==WHITE && capacity(u,v)>current_flow(u,v) )
    

    alors que capacité et current_flow sont définie de la même manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        start=2;
        bInf = 0.5 ;
        bSup = 5 ;
        M    =    6 ;
        N    =    6 ;
     
        capacity = bInf + (bSup-bInf).*rand(M, N);
        current_flow= bInf + (bSup-bInf).*rand(M, N);

  4. #4
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Oui mais tu essayes d'accéder à la 7ème colonne alors que ta matrice n'en contient que 6...
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par duf42 Voir le message
    Oui mais tu essayes d'accéder à la 7ème colonne alors que ta matrice n'en contient que 6...
    je n'ai rien essayé , j'ai juste exécuté le programme

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 93
    Points : 98
    Points
    98
    Par défaut
    Peut être alors qu'il y a seulement une erreur dans le programme.

    Maintenant tu peux aller essayer de voir pourquoi il y a cette erreur et essayer de la corriger pour l'application que tu veux en faire

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Pienpien Voir le message
    Peut être alors qu'il y a seulement une erreur dans le programme.

    Maintenant tu peux aller essayer de voir pourquoi il y a cette erreur et essayer de la corriger pour l'application que tu veux en faire
    l'erreur vient de cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    capacity(u,v)>current_flow(u,v)

    ils disent que l'indice dépasse les dimensions de la matrice.

    comment ça se fait alors que les 2 matrices sont de la même dimension

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 94
    Points : 85
    Points
    85
    Par défaut
    tu as défini n=10 et M,N=6.

    A la ligne 42, indiquée par le signal d'erreur, il y a une boucle for qui court de 1 à n=10 et qui lit la colonne i de matrices ayant 6 colonnes. Donc , comme l'a dit DUF, ton programme essaie d'accéder à une colonne inexistante. Error, error.

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par oodbae_adriano Voir le message
    tu as défini n=10 et M,N=6.

    A la ligne 42, indiquée par le signal d'erreur, il y a une boucle for qui court de 1 à n=10 et qui lit la colonne i de matrices ayant 6 colonnes. Donc , comme l'a dit DUF, ton programme essaie d'accéder à une colonne inexistante. Error, error.
    ah oui , j'ai pas fait attention à ça

    merci bien

Discussions similaires

  1. Algorithme de Ford-Fulkerson
    Par moujaprim dans le forum MATLAB
    Réponses: 31
    Dernier message: 04/02/2012, 17h43
  2. Algorithme sur le flot maximal de Ford Fulkerson
    Par witch dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 13/05/2011, 15h57
  3. Algorithme de Ford-Fulkerson
    Par Du Wassoulou dans le forum C++
    Réponses: 3
    Dernier message: 26/12/2010, 19h29
  4. Problème sur un réseau routier avec l'algo de Ford-Fulkerson
    Par Yakurena dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 20/02/2006, 09h35
  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