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

Calcul scientifique Python Discussion :

Breadth-First Search en Python


Sujet :

Calcul scientifique Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2017
    Messages : 24
    Points : 12
    Points
    12
    Par défaut Breadth-First Search en Python
    Bonjour,

    Voila je suis entrain de travailler sur un programme de BFS en python mais mon problème est que j'ai réussi à trouvers des programmes en python comme celui-là :
    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
    def dfs(graph, start):
        visited, stack = set(), [start]
        while stack:
            vertex = stack.pop()
            if vertex not in visited:
                visited.add(vertex)
                stack.extend(graph[vertex] - visited)
        return visited
     
    graph = {'A': set(['B', 'C']),
             'B': set(['A', 'D', 'E']),
             'C': set(['A', 'F']),
             'D': set(['B']),
             'E': set(['B', 'F']),
             'F': set(['C', 'E'])}
     
    print(dfs(graph, 'A')) # # {'E', 'D', 'F', 'A', 'C', 'B'}
    Je voudrai pouvoir utiliser ce programme avec une matrice d'adjacence, donc une liste de liste composé de 1 et de 0, et non un dictionnaire pour pouvoir au lieu de retourner l'ordre des sommets visités retourner leur distance au sommet de départ et s'il n'a pas été visités -1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert BFS([[0, 1, 1, 0, 0], [0, 0, 1, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 0, 0], [1, 0, 1, 0, 0]],0) == [0, 1, 1, 2, -1]
    Merci de votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Soit vous convertissez la matrice en graphe, soit vous utilisez le code que vous aviez posté dans les posts précédents.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2017
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Merci de votre réponse,

    Mais dans les post précédents c'étaient pour un parcours en profondeur et non en largeur.
    J'ai essayer de faire cela mais je n'ai pas une valeur cohérente de la distance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def bfs2(mat, start):
        visited = set()
        distance = [-1 for i in range(len(mat))]
        distance[start] = 0
        temp = 1
        visited.add(start)
        for i in range(len(mat)):
            for j in range(len(mat)):
                if mat[i][j] == 1 and j not in visited:
                    distance[j] = temp
                    visited.add(j)
            temp = temp + 1
        return distance
    Cela me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mat1 = [[0,1,1,0], [1,0,1,0], [1,1,0,1], [0,0,1,0]]
    print(bfs2(mat1, 0)) #[0, 1, 1, 3] au lieu de [0, 1, 1, 2]
    Si quelqu'un a une idée ....

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,
    Essayez avec çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def dfs2(matrix, start):
        visited, stack = [], [start]
        while stack:
            vertex = stack.pop()
            if vertex not in visited:
                visited.append(vertex)
                adjency = [ x for x, e in enumerate(matrix[vertex]) if e and x not in visited ]
                stack.extend(adjency)
        return visited
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2017
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Merci pour la fonction mon problème est que j'ai besoin d'afficher la distance de chaque point au point de départ et je n'arrive pas à avoir une distance qui soit cohérente comme sur mon poste au - dessus.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par nono9196 Voir le message
    Merci pour la fonction mon problème est que j'ai besoin d'afficher la distance de chaque point au point de départ et je n'arrive pas à avoir une distance qui soit cohérente comme sur mon poste au - dessus.
    Mouais, çà serait mieux de déjà vérifier que votre code est un BFS: pas de stack et pas d'ajout à la fin, pour moi, c'est autre chose. Après les distances, c'est encore autre chose.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2017
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    En faite je ne connais pas trop c'est fonction que sont pop et extend du coup j'ai voulu le faire seulement avec ce que je connaissais mais je crois que l'essai n'est pas concluant.

  8. #8
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    list1.extend(list2)  <=>  list1 = list1 + list2
    a = list1.pop()       <=>  a = list1[-1]; del list1[-1]  ### Efface le dernier élément de la liste
    Et si vous ne connaissez pas la fonction del vous pouvez très bien remplacer :
    Donc tout est faisable avec les fonctions dont vous avez connaissances.

    Sinon une petite lecture de la documentation Python sur les listes permettera de faire le point sur les méthodes sur les listes :
    https://docs.python.org/3/tutorial/datastructures.html

Discussions similaires

  1. [Python 3.X] Code SAS vers PYTHON -> Fonction First Last Retain
    Par fred0715 dans le forum Général Python
    Réponses: 3
    Dernier message: 27/01/2017, 12h13
  2. Depth first search sur les arbres binaires
    Par blackbird1 dans le forum C
    Réponses: 2
    Dernier message: 25/03/2015, 17h15
  3. "Breadth first search" sur les arbres binaires de recherche
    Par blackbird1 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 24/03/2015, 12h38
  4. Depth-First Search et plus long trajet
    Par lordfiren dans le forum C
    Réponses: 10
    Dernier message: 18/12/2014, 10h33
  5. breadth / depth first search
    Par hanadi_09 dans le forum Intelligence artificielle
    Réponses: 12
    Dernier message: 27/03/2010, 17h59

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