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

Mathématiques Discussion :

Collecte de tous les chemins possibles


Sujet :

Mathématiques

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Collecte de tous les chemins possibles
    J'utilise le langage mapple (qui est facilement compréhensible, c'est un outil mathématique de programmation).

    Soit G un graphe orienté qui contient éventuellement des boucles. On cherche, à partir d'un point donné de ce graphe (qu'on peut appeler l'origine, le point de départ...) le nombre de chemins possibles et par quels points passent ces chemins.

    Exemple type de graphe:
    http://img7.hostingpics.net/pics/572537Test_typeBIS.jpg

    Un chemin doit forcément se terminer par un "cul de sac" ou un "point déjà obtenu"; on ignore les boucles.

    Ici par exemple des chemins sont 1-7-8-5 ou 1-7-9-10-12.

    Notez que dans dans mon algorithme les points sont appelés "paragraphes", donc le nombre de points est NombreParagraphes.

    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
     
    > with(linalg);  //On appelle le pack qui permet d'utiliser les fonctions sur les matrices
    > L[1] := [3, 7]; L[2] := [6, 12]; L[3] := [4, 6, 11]; L[4] := [2, 12]; L[5] := []; L[6] := [4, 12]; L[7] := [8, 9]; L[8] := [10]; L[9] := [10]; L[10] := [5, 12]; L[11] := [4, 12]; L[12] := [];   //On entre les listes de liaisons: le paragraphe 1 est relié au 3 et au 7, etc
     
     
    > NombreParagraphes := 12; //On entre le nombre de paragraphes (le nombre de points)
     
    //On crée la matrice d'adjacence (faite de 0 sur la diagonale, de symbole infini quand il n'y a pas de liaison et de 1 quand il y en a), vous pouvez sauter ça
     
    for i to NombreParagraphes do 
    Ligne[i] := [infinity]; 
        for j from 2 to NombreParagraphes do 
        Ligne[i] := [op(Ligne[i]), infinity] end do 
    end do; 
    for i to NombreParagraphes do Ligne[i][i] := 0 
    end do; 
    for i to NombreParagraphes do 
        for j to nops(L[i]) do 
              if evalb(`in`(L[i][j], SetOf(integer))) then Ligne[i][L[i][j]] := 1 
              end if; 
          end do; 
    end do; 
     
    >MatriceAdjacence := matrix([Ligne[1]]); 
    for i from 2 to NombreParagraphes do 
    MatriceAdjacence := stackmatrix(MatriceAdjacence, Ligne[i]) 
    end do; 
     
    //On initialise les autres variables nécessaires pour l'agorithme
     
    > depart := 1: destination := 12: path := [0]:  #On a déjà initialisé NombreParagraphes:=12;
     for j from 2 to NombreParagraphes do
    path := [op(path), 0]:
     end do;
    path;
    tabou := [false];
    for j from 2 to NombreParagraphes do
    tabou := [op(tabou), false]:
    end do;
    tabou;
     
                        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    [false, false, false, false, false, false, false, false, false, false, false, false]
     
     
    //Voici l'algorithme récursif
     
    > CheminsPossibles := proc (position, depth)
    local i;
     
    path[depth] := position;
     
    if position = destination then
        for i to depth do path[i]; ` `
        end do;
    end if;
     
    tabou[position] := true;
     
    for i to NombreParagraphes do
        if MatriceAdjacence[position, i] <> 1 or tabou[i] then                    CheminsPossibles(i, depth+1)
         end if;
    end do;
     
    tabou[position] := false;
     
     end proc;
    Warning, `path` is implicitly declared local to procedure `CheminsPossibles`
    Warning, `tabou` is implicitly declared local to procedure `CheminsPossibles`

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    > CheminsPossibles(depart, 1);
    Error, (in CheminsPossibles) too many levels of recursion
    Mon problème c'est ce message d'erreur... Est-ce qu'il y a un problème dans mon algorithme? ça m'étonnerait que mapple sature pour 12 points...

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Notez que dans mapple, une liste commence à la case 1 et non à la case 0 comme en PHP par exemple. Donc Si L est une liste et L:=[2,3,5], L[0] n'a pas de sens. En revanche L[1]; affiche 2.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Je m'étais inspiré pour cet algorithme d'un trouvé sur le net, dans un autre langage. Le truc qui me troublait c'était pourquoi donner à une des variable le nom depth, je ne vois pas la signification...

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Ton algo est sans doute une exploration récursive, la variable "depth" représente surement le niveau de la récursion, c'est à dire la longueur du chemin parcouru actuellement.

Discussions similaires

  1. Trouver tous les chemins possibles d'un trajet (d'un point A à un point B)
    Par chakirlbr dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 16/12/2014, 15h54
  2. Réponses: 2
    Dernier message: 01/06/2013, 02h47
  3. Réponses: 0
    Dernier message: 26/05/2009, 02h06
  4. Parcours d'un arbre : examiner tous les chemins possibles
    Par Molos dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 06/04/2009, 18h22
  5. [JGraphT] Obtenir tous les chemin possibles
    Par pmartin8 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 02/06/2006, 20h26

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