【正規品・送料無料】イヴサンローラン ベビードールキッス&ブラッシュデュオスティック 4フロム ミー トゥ ユー+スキンケアセット

グラフ理論は、グラフ・ネットワークに関する学問です。

【正規品・送料無料】イヴサンローラン ベビードールキッス&ブラッシュデュオスティック 4フロム ミー EDT トゥ フレグランス】【レディース・女性用】【DKNY ユー+スキンケアセット

  • グラフ・ネットワークは、社会の色々なところに現れています。
    • 通信ネットワーク
    • 物流ネットワーク
    • 鉄道ネットワーク
    • エネルギーネットワーク
  • グラフ理論を使うと、以下のような色々な問題を解けます。
    • 最短路問題
    • 最小全域木問題
    • 最小費用流問題
    • 最大マッチング問題
    • などなど

グラフとは

  • 頂点vertex, node)とedge, arc)からなる構造をグラフ構造graph)といいます。
    • 通常、頂点や辺は、重み(weight)などの属性を持ちます。
    • 辺上にモノを流す場合は、ネットワークnetwork)といいます。
      • ネットワークでは、辺の重みweight)を考慮します。

        ※ PyQでは、折れ線グラフのようなグラフと、頂点と辺からなるグラフの 2 種類 に対し、同じグラフという言葉を用いているので、文脈に合わせて適宜解釈してください。

        NetworkXとは

        Pythonでは、グラフ・ネットワークを扱うライブラリーとしてNetworkXがあります。 NetworkXを使うと、色々なアルゴリズムを使えます。

        以降では、NetworkXは、import networkx as nxとして使い、nxとして参照します。また、グラフはgで参照します ロリータレンピカ エレイム オードパルファム 80ml LOLITA LEMPICKA ELLE L'AIME EDP。

        参考

        NetworkXのインストール

        コマンドプロンプトで、pip install -U networkxでできます(macOSではpip3 install -U networkx)。

        グラフの表記

        グラフを表記するのに以下の記号を使うことがあります 【ダンヒル】 デザイア オーデトワレスプレー 100ML【送料無料】。Vertex, Edge, Graphから来ています。

        • V:頂点の集合
        • E:辺の集合
        • G:グラフ
          • VとEからなることを明示的に表す場合、G(V, E)と表記します

            NetworkXのグラフの種類

            NetworkXのグラフには4種類あります。

             無向グラフ有向グラフ
            単純グラフなど※GraphDiGraph
            多重グラフMultiGraphMultiDiGraph

            ※ 上表の「単純グラフなど」は、単純グラフ、または 自己ループのみ含む多重グラフを指しています。

            グラフの用語

            • 単純グラフsimple graph):自己ループも多重辺も含まないグラフ
            • 多重グラフmulti graph):単純グラフとは限らないグラフ
            • 無向グラフundirected graph):無向辺だけからなるグラフ
            • 有向グラフdirected graph):有向辺だけからなるグラフ
            • 自己ループloop):両端が同じ頂点となる辺
            • 多重辺multiple edges):2つの頂点の間に複数の辺がある場合、それらを多重辺といいます
            • 有向辺directed edge): 向きがある辺
            • 無向辺undirected edge): 向きのない辺

              • 歩道:ある頂点から辺をたどって別の頂点へ行ける場合、その辺の並びを歩道といいます。
              • :辺が重複しない歩道を路といいます。
              • パス:頂点が重複しない路をパス(path)やといいます。

                • 閉路:始点と終点が同じ路を閉路といいます。
                • サイクル:始点と終点が同じパスをサイクルといいます。

                参考

                • グラフ理論 - 道と閉路
                • 閉路
                • tree):サイクルのないグラフで、連結しているもの。
                • forest):サイクルのないグラフで、連結しているとは限らないもの。

                  グラフ描画

                  Jupyter Notebookでは、nx.draw_networkx(グラフオブジェクト)で、簡単にグラフを描画できます。

                  • 無向グラフGraph)の辺は、で描画されます。
                  • 有向グラフGraph)の辺は、矢印で描画されます。

                    GraphとMultiGraphの違い

                    GraphとMultiGraphの違いは、グラフの辺(u, v)があったときに、以下のようになります。

                    • 辺が一意に決まるグラフ:GraphまたはDiGraphで作成できます。
                    • 辺が一意に決まらないグラフ:MultiGraphまたはMultiDiGraphで作成できます。

                      グラフオブジェクトの変換

                      グラフオブジェクトの作成では、他の種類のグラフオブジェクトを引数に取って、種類を変更できます

                      g1 = nx.Graph() # 無向グラフ
                      g2 = nx.DiGraph(g1) # 有向グラフに変換
                      
                      
                      

                      上記のコードは、無向グラフg1を有向グラフに変換しています(g2)。

                      • 無向グラフ 有向グラフ」は、to_directedメソッドでも変換できます。
                        • g2 = g1.to_directed()
                        • 有向グラフ 無向グラフ」は、to_undirectedメソッドでも変換できます。
                          • g1 = g2.to_undirected()

                            連結グラフとは

                            • 2つの頂点の間にパスが存在するとき連結しているといいます。
                            • 全ての頂点が連結しているグラフを連結グラフconnected graph)といいます。
                              • NetworkXでは、nx.is_connectedでチェックできます。
                              • 有向グラフの任意の2点間にパスが存在する場合、強連結といいます。
                                • NetworkXでは、nx.is_strongly_connectedでチェックできます。
                                • 有向グラフが「無向グラフに変換したときに連結である」ならば、弱連結といいます。
                                  • NetworkXでは、nx.is_weakly_connectedでチェックできます。

                                    参考:連結グラフ

                                    グラフの編集

                                    • add_node(頂点オブジェクト):頂点の追加
                                    • add_edge(頂点オブジェクト1, 頂点オブジェクト2):辺の追加
                                    • 頂点オブジェクトは、辞書のキーに使えるものでないといけません。たとえば、数字や文字列が使えます。リストは使えません。
                                    • add_nodes_from(頂点リスト):頂点リストを一括で作成します。
                                    • add_edges_from(辺リスト):辺リストを一括で作成します。

                                      実は、頂点を追加していなくても、いきなり辺の追加ができます。 辺を追加するときに、指定された頂点が存在しない場合、自動的に頂点の追加も行われます。

                                      add_nodeで頂点の追加が必要な場合
                                      • 指定した順番に頂点のリストを作成したいとき:辺を追加する前に、順番通りに頂点を追加します。
                                      • 頂点に属性を設定したいとき:追加時に属性を指定できます。

                                      属性の指定

                                      頂点や辺に、任意の属性を指定できます。属性は、頂点や辺の辞書に設定されます。

                                      • 頂点の追加:add_node(頂点オブジェクト, 頂点の属性1, 頂点の属性2, ...)
                                      • 辺の追加:add_edge(頂点オブジェクト1, 頂点オブジェクト2, 辺の属性1, 辺の属性2, ...)

                                        補足

                                        • 属性は、キーワード引数として指定します。いくつでも指定できます。任意のキーワードが使えます。
                                        • NetworkXのいくつかの関数では、weightなどの属性を利用しているものがあります。

                                          属性の参照

                                          • g.nodes[0]とすると、頂点0の辞書を取得できます。
                                            • 属性は、g.nodes[0]['name']のようにアクセスできます。
                                            • g[0][1]とすると、辺(0, 1)の辞書を取得できます。
                                              • 属性は、g.edges[0][1]['capacity']のようにアクセスできます。
                                              • g[0][1]の代わりに、g.edges[0, 1]あるいはg.get_edge_data(0, 1)とも書けます。
                                              • nx.get_node_attributes(g, 'name')とすると、全頂点のnameの値を辞書で取得できます。
                                              • nx.get_edge_attributes(g, 'capacity')とすると、全辺のcapacityの値を辞書で取得できます。
                                              • g.nodes.data('name')とすると、全頂点のnameの値をビュー(辞書のようなもの)で取得できます。
                                              • g.edges.data('capacity')とすると、全辺のcapacityの値をビュー(タプルのリストのようなもの)で取得できます。

                                                補足

                                                • 無向グラフに辺(i, j)を追加すると、辺(i, j)としても、辺(j, i)としても、同じものとしてアクセスできます。
                                                  • 辺の追加は、g.add_edge(1, 0, capacity=10)で行いましたが、g.edges[0][1]で参照できます。
                                                  • 有向グラフでは、辺(i, j)と辺(j, i)は、別になります。

                                                    属性と共に一括作成

                                                    方法その1

                                                    add_edges_fromでは、辞書を指定することもできます。

                                                    g = nx.Graph()
                                                    g.add_edges_from([(0, 3, {'weight': 10}),
                                                     (1, 2, {'weight': 15}),
                                                     (1, 3, {'weight': 20})])
                                                    
                                                    
                                                    

                                                    方法その2

                                                    属性が1種類のときは、以下のようにadd_weighted_edges_fromを使えます。

                                                    g = nx.Graph()
                                                    g.add_weighted_edges_from(
                                                     [(0, 3, 10), (1, 2, 15), (1, 3, 20)], 
                                                     weight='weight')
                                                    
                                                    
                                                    

                                                    このように、NetworkXでは、柔軟にグラフを作成できます。

                                                    頂点の削除

                                                    • remove_node(頂点):対象の頂点と、その頂点に接続する辺を削除します。
                                                    • remove_nodes_from(頂点のリスト):複数の頂点を一括で削除します。

                                                      辺の削除

                                                      • remove_edge(辺):対象の辺を削除します。
                                                      • remove_edges_from(辺のリスト):複数の辺を一括で削除します。

                                                        ある頂点に接続する全ての辺を削除したとしても、その頂点は削除されません。

                                                        色々なグラフの作成

                                                        • nx.path_graph(頂点数):パスからなるグラフ

                                                          • nx.cycle_graph(頂点数):サイクルからなるグラフ

                                                            • nx.ladder_graph(段数):はしご状のグラフ

                                                              • nx.circular_ladder_graph(頂点数):端がつながったはしご状のグラフ
                                                              • nx.grid_2d_graph(頂点数1, 頂点数2):2次元の格子グラフ

                                                                ランダムなグラフの作成

                                                                • fast_gnp_random_graph(n, p, seed, directed):ランダムなグラフの作成
                                                                  • n:頂点の数
                                                                  • p:任意の2頂点の間に辺を作成する確率
                                                                  • seed:乱数シード(指定すると、同じ結果を返します)
                                                                  • directed:有向グラフかどうか

                                                                    ランダムな連結グラフの作成

                                                                    ランダムに作成すると、グラフが連結していない可能性があります。 以下のようにすれば、確実に連結グラフを作成できます。

                                                                    while True:
                                                                     g = nx.fast_gnp_random_graph(6, 0.5)
                                                                     if nx.is_connected(g):
                                                                     break
                                                                    
                                                                    
                                                                    
                                                                    

                                                                    完全グラフの作成

                                                                    完全グラフとは

                                                                    • 全ての頂点間に辺が存在するグラフを完全グラフcomplete graph)といいます。
                                                                    • NetworkXでは、nx.complete_graph(頂点数)で作成できます。
                                                                    • 頂点数をnとすると、辺の数はn * (n - 1) // 2で計算できます。

                                                                      参考:完全グラフ

                                                                      空グラフの作成

                                                                      空グラフとは

                                                                      • 辺のないグラフを空グラフといいます。nx.empty(頂点数)で作成できます。

                                                                        参考:空グラフ

                                                                        補グラフの作成

                                                                        補グラフとは

                                                                        • 元のグラフに対して、以下のグラフを補グラフcomplement graph)といいます。
                                                                          • 元のグラフに辺がある → 補グラフの辺を作らない
                                                                          • 元のグラフに辺がない → 補グラフの辺を作る
                                                                        • NetworkXでは、nx.complement(元のグラフ)で作成できます。

                                                                          • 補グラフの補グラフは、元のグラフです 【正規品・送料無料】ジルスチュアート ラスティング&カバーパーフェクション コンシーラー 02(beige)(10g)+お肌ツルツルセット。
                                                                          • 完全グラフの補グラフは、空グラフです。

                                                                          参考:補グラフ

                                                                          2部グラフの作成

                                                                          2部グラフとは

                                                                          • 頂点集合を2つの集合V1とV2に分けます。
                                                                          • それぞれの集合内について、頂点間に辺がないグラフを2部グラフbipartite graph)といいます。
                                                                          • NetworkXでは、nx.bipartiteモジュールに多くの関数が定義されています。

                                                                            参考:2部グラフ

                                                                            完全2部グラフの作成

                                                                            完全2部グラフとは

                                                                            • 2部グラフで、V1の任意の頂点とV2の任意の頂点の間に辺が存在するグラフを完全2部グラフcomplete bipartite graph)といいます。
                                                                            • NetworkXでは、nx.complete_bipartite_graph(頂点数1, 頂点数2)で作成できます。

                                                                              参考:完全2部グラフ

                                                                              完全2部グラフは、割当問題のモデルを作成するときに利用したりします。

                                                                              参考:割当問題 - ORWiki

                                                                              格子グラフ

                                                                              • grid_2d_graph(m, n)は、m x nの格子グラフを作成します。
                                                                              • 頂点は、(i, j)というタプルになります。座標を表します。
                                                                              • 編集不可のグラフ

                                                                                関数説明
                                                                                nx.freeze(g)編集不可のグラフ

                                                                                「凍らせる(freeze)→変更できない」ということです。

                                                                                逆向きのグラフ

                                                                                有向グラフの向きを反転させます。

                                                                                関数説明
                                                                                nx.reverse(g)有向グラフの向きを反転したグラフ

                                                                                reverseは、DiGraphかMultiDiGraphで使えます。

                                                                                線グラフ

                                                                                線グラフとは

                                                                                辺を頂点とみなした新たなグラフ。 元のグラフの2辺が頂点を共有していれば、線グラフline graph)の対応する頂点間に辺を作成します。

                                                                                関数説明
                                                                                nx.line_graph(g)線グラフ

                                                                                line_graphは、GraphかDiGraphで使えます。

                                                                                線グラフと似ているグラフに双対グラフがあります。

                                                                                双対グラフとは

                                                                                平面グラフに対して、「領域を頂点にして、隣接する頂点を辺で結んだグラフ」を双対グラフdual graph)といいます。

                                                                                参考:グラフの双対

                                                                                平面グラフとは

                                                                                平面グラフplane graph)は、辺が交差しないグラフです。

                                                                                参考:平面グラフ

                                                                                線グラフの変換

                                                                                関数説明
                                                                                nx.inverse_line_graph(g)線グラフが元のグラフになるグラフ

                                                                                line_graphは、Graphのみで使えます 。

                                                                                色々なグラフの作成

                                                                                NetworkXで作成できるグラフの一部を紹介します。

                                                                                関数説明
                                                                                nx.circular_ladder_graph(頂点数)端がつながったはしご状のグラフ
                                                                                nx.complete_bipartite_graph(頂点数1, 頂点数2)完全2部グラフ
                                                                                nx.complete_graph(頂点数)完全グラフ
                                                                                nx.cycle_graph(頂点数)サイクル グラフ
                                                                                nx.empty_graph(頂点数)空グラフ
                                                                                nx.fast_gnp_random_graph(頂点数, 辺の作成率)ランダムグラフ
                                                                                nx.grid_graph(各次元のサイズのリスト)多次元の格子グラフ
                                                                                nx.grid_2d_graph(頂点数1, 頂点数2)2次元の格子グラフ
                                                                                nx.ladder_graph(頂点数)はしご状のグラフ
                                                                                nx.path_graph(頂点数)1本のパスからなるグラフ
                                                                                nx.star_graph(頂点数)スターグラフ

                                                                                グラフの情報や性質