2009-08-17 7 views
0

Je dois faire une méthode pour faire une liste avec tous les chemins dans un graphe. Mon graphe a seulement un noeud de début et un noeud de finition. Chaque noeud a une liste avec ses enfants et une autre liste avec ses parents. Je dois faire une autre liste contenant tous les chemins (chacun d'entre eux dans une autre liste)Calcul des trajectoires dans un graphe

Une suggestion?

+1

tous les chemins de chaque nœud à chaque nœud ou du début à la fin? et y a-t-il des cycles? – palindrom

+0

Vous allez devoir donner plus d'informations. Qu'est-ce qui est autorisé, et qu'est-ce qui n'est pas autorisé? Comme demandé auparavant, les cycles sont-ils présents? –

+0

Ce genre de question est mieux étiqueté comme [devoirs], si c'est ce que c'est. En fait, je m'attendais plutôt à ce qu'un modérateur l'ait déjà marqué. –

Répondre

0

Vous pouvez générer toutes les combinaisons possibles de sommets (en utilisant la combinatoire) et filtrer les chemins qui n'existent pas (où les sommets ne sont pas joints par un bord ou le bord n'a pas la bonne direction).

Vous pouvez améliorer cette idée de base en demandant au code qui génère les combinaisons de vérifier les sommets restants disponibles à partir du sommet en cours. Ceci est supposé que vous avez des graphes acycliques et souhaitez visiter chaque sommet exactement une fois.

6

Cela dépend de si elle est acyclique ou non. De toute évidence, un cycle se traduira par des chemins infinis (une fois autour de la boucle, deux fois ronde, 3 fois ronde ... etc etc). Si le graphique est acyclique, vous devriez être en mesure de faire une recherche en profondeur (DFS) (http://en.wikipedia.org/wiki/Depth-first_search) et simplement compter le nombre de fois que vous rencontrez le nœud de destination.

2

Familiarisez-vous d'abord avec les algorithmes graphiques de base (essayez un manuel, ou google). Déterminez lequel correspond le mieux au problème que vous résolvez et appliquez-le. Vous devrez peut-être adapter un peu l'algorithme, mais en général il existe des algorithmes largement connus pour tous les problèmes de base des graphes.

1

Si vous avez une classe GraphNode qui ressemble à ceci:

public class GraphNode 
{ 
    public IEnumerable<GraphNode> Children { get; set; } 
    // ... 
} 

Alors ce Sould faire le travail:

public static class GraphPathFinder 
{ 
    public static IEnumerable<IEnumerable<GraphNode>> FindAllPathsTo(this GraphNode startNode, GraphNode endNode) 
    { 
     List<IEnumerable<GraphNode>> results = new List<IEnumerable<GraphNode>>(); 
     Stack<GraphNode> currentPath = new Stack<GraphNode>(); 
     currentPath.Push(startNode); 

     FindAllPathsRecursive(endNode, currentPath, results); 

     return results; 
    } 

    private static void FindAllPathsRecursive(GraphNode endNode, Stack<GraphNode> currentPath, List<IEnumerable<GraphNode>> results) 
    { 
     if (currentPath.Peek() == endNode) results.Add(currentPath.ToList()); 
     else 
     { 
      foreach (GraphNode node in currentPath.Peek().Children.Where(p => !currentPath.Contains(p))) 
      { 
       currentPath.Push(node); 
       FindAllPathsRecursive(endNode, currentPath, new List<IEnumerable<GraphNode>>()); 
       currentPath.Pop(); 
      } 
     } 
    } 
} 

Il est une implémentation simple de l'algorithme DFS. Aucune vérification d'erreur, optimisations, thread-sécurité, etc ...

Aussi si vous êtes sûr que votre graphique ne fonctionne pas, vous pouvez supprimer la clause where dans l'instruction foreach dans la dernière méthode.

J'espère que cela a aidé.

Questions connexes