2012-10-28 8 views
8

私はMartin ErwigのFGL(Functional Graph Library)を使って、以下の単純な有向グラフを表現しています。今FGLで最短経路を見つける

graph

genLNodes :: [LNode String] 
genLNodes = zip [1..5] ["A","B","C","D","E"] 

genLEdges :: [LEdge Int] 
genLEdges = [(1,2,4),(1,3,1),(2,4,2),(3,4,2),(2,5,1),(4,5,1), 
      (2,1,4),(3,1,1),(4,2,2),(4,3,2),(5,2,1),(5,4,1)] 

mygraph :: Gr String Int 
mygraph = mkGraph genLNodes genLEdges 

私は別の、例えば1つのノードからの最短経路を見つけたいですdijkstraのアルゴリズムを使用してAE

dijkstra :: (Graph gr, Real b) => Heap b (LPath b) -> gr a b -> LRTree b 

しかし、私は提供されたインタフェースからそれを使用する方法を見つけ出すことができませんよ。そこData.Graph.Inductive.Query.SPでそれを行うための機能であるように思われます。どんな助けでも大歓迎です。私はまた、他の提案を聞いてみたい、もし私が正しい方法で指示された加重グラフを作成しているのですか、そうするための他の(より良い)パッケージがあれば?

答えて

6

2つのノード間の最短経路を取得するには、モジュールは、(おそらく「最短経路」の略)特殊機能、spを提供するので、最短経路を取得する最も簡単な方法は、

sp 1 5 mygraph 

spでありますdijkstraを使用しています。

spTree :: (Graph gr, Real b) => Node -> gr a b -> LRTree b 
spTree v = dijkstra (H.unit 0 (LP [(v,0)])) 

sp :: (Graph gr, Real b) => Node -> Node -> gr a b -> Path 
sp s t = getLPathNodes t . spTree s 

と、あなたはスパニングツリーを生成し、自分でそれから最短経路を得ることができる方法を見ることができますが、提供される機能を使用しないように非常に良い理由がない限り、それとはあなたはそれにこだわるべきです。

+2

...おそらく[論文](http://web.engr.oregonstate.edu/~erwig/papers/InductiveGraphs_JFP01.pdf)を読むか、少なくともそれを読み飛ばす価値があります。 – AndrewC

+2

@vis 'sp'はとにかくゴミの名前です - あなたがそれを見つけられなかったのも不思議ではありません! – AndrewC

+0

私は完全にその機能を逃した!確かにそれは私が必要としていたすべてです。 @AndrewCは私に紙を指してくれてありがとう。 – vis

関連する問題