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

R Discussion :

igraph - trouver les voisins les plus proches avec un certain label


Sujet :

R

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut igraph - trouver les voisins les plus proches avec un certain label
    Bonjour,

    J'ai à ma disposition un graphe représentant des rivières dans lequel chaque noeud a, soit la catégorie "croisement", soit "riviere".

    J'aimerais pouvoir partir dans toutes les directions à partir d'un noeud de type "croisement" afin de voir quels sont les noeuds "croisement" autour selon une condition.
    La condition est que tous les noeuds qui se situent entre mon départ et d'arrivée, soient de type "rivière" et qu'ils soient de degré 2 (ce qui signifie pas d'embranchement à leur niveau).

    Voici un petit dessin qui montre ce que je souhaite (avec un cercle, les noeuds croisement) :
    Nom : pb igraph.jpg
Affichages : 466
Taille : 118,6 Ko

    Auriez-vous une idée sur la marche à suivre ?

    Bien à vous,

    Mathieu

  2. #2
    Membre éprouvé

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Points : 1 189
    Points
    1 189
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    que penses tu des bases de données orientées graph pour résoudre tes problèmes, mais on sort complètement du cadre de langage R.

    Bien cordialement

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut
    Bonjour,

    Je ne connais pas les bases de données graphe.

    A la base, je possède des données géographiques desquelles je dérive un graphe. R permet d'effectuer le traitement de la source, de l'intégration des données à leur transformation.

    A vrai dire, je travaille ici sur un cas bien précis. Je n'ai jamais eu à travailler avec les réseaux avant et cela risque peu de se représenter plus tard.

    J'apprends donc au fur et à mesure avec le langage que je connais, R. Je ne pense pas investir dans une autre technologie d'autant plus que je pense avoir à disposition tous les outils qu'il faut avec R et igraph.

    Encore une fois, si vous avez une idée pour le problème cité, je suis preneur

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur en études décisionnelles
    Inscrit en
    Février 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en études décisionnelles

    Informations forums :
    Inscription : Février 2013
    Messages : 134
    Points : 351
    Points
    351
    Par défaut
    Bonsoir,

    Je pense que tu peux t'inspirer de l'algorithme de parcours en profondeur.
    C'est une fonction récursive. Du coup pour marquer les sommets visités, il te faut une variable globale, que tu modifieras avec la syntaxe "x <<- ..."

    A côté de ça, tu ajoutes un test lorsque tu arrives sur un sommet. Lorsque le noeud respecte la condition que tu nous a donné, tu le définis comme croisement. Par exemple sur un vecteur de la taille du nombre de sommets, tu mettras "1".

    Mais bon, après ce n'est pas trop du R, c'est plus de l'algorithmie...

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut
    Bonjour Emmanuel et à tous,

    J'ai créé ma fonction récursive de DFS en m'appuyant sur un exemple test basé sur un graphe de 10 noeuds auxquels sont attribués les couleur "rose" et "orange".

    Ici, je choisis, à partir d'un noeud, de détecter le premier noeud "rouge" rencontré, et ce, dans toutes les "directions".

    Je pense arriver quasiment au bout car mon algo détecte bien les noeuds "rouges". Par contre, j'éprouve des difficultés à stocker dans une variable la liste de ces noeuds.

    Voici le code reproductible, si jamais vous avez une idée (on y est presque, je pense )

    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
    library(igraph)
     
    g <- make_tree(10, mode="undirected")
    a <- as_adj_list(g)
     
    V(g)$color <- "orange"
    V(g)$color[c(5,6,7,9)] <- "red"
     
     
    dfs.f <- function(a, s, nodes=NULL, okNodes=NULL) {
      nodes <- c(s, nodes)
     
      for (child in a[[s]]) {
        if (!(child %in% nodes)) {
     
          v <- V(g)[child]
          cat(v, v$color, "\n")
     
          if(v$color=="red") {
            okNodes <<- c(as.numeric(v), okNodes)
            return
          } else {
            dfs.f(a, child, nodes, okNodes)
          }
        }
      }
    }
     
    # dfs.f(adjacency list, root node)
    res <- dfs.f(a, 1)
     
    okNodes #cette variable globale insérée dans ma boucle ne renvoie qu'un élément au lieu de 4

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut
    Par tâtonnements, j'ai abouti à ce code, bien qu'il me paraisse assez peu orthodoxe..

    Je pense que je maîtrise finalement peu les rouages de la programmatique avancée, le système des récursions, des variables globales.

    Voici donc mon code qui fonctionne pour ce que je veux mais qui fait un peu "bricolage".

    En particulier, j'aimerais, plutôt que d'employer une variable globale, avoir une fonction qui me retourne comme résultat la liste des noeuds "rouges" rencontrés.

    N'hésitez pas pour toute suggestion !

    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
    library(igraph)
     
    g <- make_tree(10, mode="undirected")
    a <- as_adj_list(g)
     
    V(g)$color <- "orange"
    V(g)$color[c(5,6,7,9)] <- "red"
     
     
    okNodes <- NULL
     
    dfs.f <- function(a, s, nodes=NULL) {
      nodes <- c(s, nodes)
     
      for (child in a[[s]]) {
        if (!(child %in% nodes)) {
     
          v <- V(g)[child]
     
          if(v$color=="red") {
            okNodes <<- c(okNodes, as.numeric(v))
            return
          } else {
            dfs.f(a, child, nodes)
          }
        }
      }
    }
     
    # dfs.f(adjacency list, root node)
    res <- dfs.f(a, 1)
    # res ne renvoie rien puisque return ne renvoie pas de variable : c'est cela que j'aimerais accomplir..
    okNodes

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut
    Bonjour,

    Une solution m'a été donnée sur un autre forum.

    La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    findRed <- function(graph,node) {
      paths  <- get.shortest.paths(graph,node,V(graph)[V(graph)$color=="red"])$vpath
      colors <- lapply(paths, function(x) V(graph)$color[x] )
      unique(Map(function(p,c) as.vector(p[seq(1,match("red",c))]), paths, colors))
    }
    Merci pour vos lumières

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Google Maps] Tri markers avec les destinations le plus proches
    Par Rhino Onizuka dans le forum APIs Google
    Réponses: 22
    Dernier message: 12/02/2014, 05h57
  2. [2008R2] Comment trouver quelques sont les mots le plus souvent répétées
    Par bisou007 dans le forum Développement
    Réponses: 3
    Dernier message: 01/07/2013, 16h47
  3. Trouver le chiffre le plus proche d'un autre
    Par crunchy63 dans le forum Général Python
    Réponses: 3
    Dernier message: 07/02/2013, 22h27
  4. [Références ?] Trouver le segment le plus proche
    Par souviron34 dans le forum Mathématiques
    Réponses: 13
    Dernier message: 30/01/2013, 12h08
  5. Trouver l'occurence la plus proche dans un tableau
    Par Benjamin Delespierre dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 8
    Dernier message: 12/06/2012, 19h20

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