2017-03-10 10 views
1

私は、すべてのエッジをカバーするグラフ上のパスを取得しようとしています。 これは、奇数のノードが接続された2つの「終了」ポイントしか存在しないことを意味します。これらのエンドポイントは、1つの接続エッジを有するか、またはループの一部であり、3つの接続を有する。グラフ上のすべてのエッジのパスを見つける

simple

:私はこの順序1-2-3-4-5(又は5-4-3-2-1)内のノードを通過する必要が下に単純なケースでそう

パス以下でより複雑な場合は、1-2-3-4-2(又は1-2-4-3-2)であろうにおいて:以下

--graph

2で、また有効グラフです。終点:1-2-4-3-2-5

complex

は、私はこれを解決するためのアルゴリズムの名前を見つけることを試み、それが「中国のポストマン問題」だと思ったが、この私が期待される結果を提供しなかったhttps://github.com/rkistner/chinese-postman/blob/master/postman.pyのコードに基づいて実施してきました。

オイラーパスはほとんど必要になりますが、networkx implementationは閉ループ(ループ)ネットワークでのみ機能します。

私もHamiltonian Pathを見て、networkx algorithmを試しましたが、グラフの種類がサポートされていませんでした。

理想的には、これを実装するにはPythonとnetworkxを使いたいのですが、すでにライブラリの一部である単純な解決策があるかもしれませんが、見つけられないようです。

+4

に交換しなければなりませんHamiltonian Pathはすべての頂点をカバーしているので、エッジをカバーする[Eulerian Path](https://en.wikipedia.org/wiki/Eulerian_path)をチェックするとよいでしょう。 GeeksForGeeksには[Python](http://www.geeksforgeeks.org/fleurys-algorithm-for-printing-eulerian-path/)の実装例があるようです。 – niemmi

+0

@niemmi - ありがとう!オイラーのtrai(サーキットではなく)が私が探している用語です。アルゴリズムを見て、それが既存のnetworkxメソッドを使用して簡略化できるかどうかを見ていきます。 – geographika

+0

@niemmi適切なリンクを追加することで、それを答えにすることもできます。 –

答えて

2

あなたはEulerian Pathを探しています。すべてのエッジを正確に1回訪問します。 Fleury's algorithmを使用してパスを生成できます。あなたがより効率的なアルゴリズムチェックHierholzer's algorithmが必要な場合は、O(E^2) Ough(E)のOGRが表示されます。

これを実装networkxライブラリのマージされていないプル要求もあります:https://github.com/networkx/networkx/pull/1878

ソースを使用するのは簡単です - https://raw.githubusercontent.com/humberto-ortiz/networkx/eulerpath/networkx/algorithms/euler.py

networkx 1.11 .edgeについては.edge_iter

+0

私が探していたパスタイプの名前がわかったら、networkxで実装を見つけることができました – geographika

関連する問題