バージョン10では,GraphUtilitiesパッケージの機能すべてがWolframシステムに組み込まれている. »

グラフユーティリティパッケージ

グラフユーティリティパッケージには,グラフ理論の応用に便利な関数が多数含まれている.

グラフユーティリティパッケージに含まれる関数

パッケージをロードする.

グラフは,規則のリストあるいはその隣接行列で表すことができる.また,Combinatorica パッケージ形式のグラフもサポートされている.

AdjacencyMatrix

AdjacencyMatrix[g]グラフ g を表すSparseArrayオブジェクトを与える
AdjacencyMatrix[g,n]グラフ g を表すSparseArrayオブジェクトを与え,頂点が n 個あるグラフを生成するために,必要に応じて追加の非連結頂点を加える

グラフの隣接行列を求める

グラフユーティリティパッケージでサポートされる形式のグラフが与えられると,AdjacencyMatrixはそのグラフを表す行列を返す.

グラフ g は規則のリスト,隣接行列,任意グラフの Combinatorica 表現で指定することができる.

SparseArrayオブジェクトの行と列は,VertexList[g]により返される順で頂点に対応する.

以下は小さいグラフの隣接行列を示す.対角要素の2は頂点1の2つのループを意味し,非対角要素の2は2つの多重辺{b->a,b->a}を意味している.
行列のi 番目の行・列は頂点VertexList[g][[i]]を表す.つまり,上の行列では,1行目が頂点bに,2行目が頂点aに対応する.
次はグラフに2つの非連結頂点を加えて,疎行列に変換する.これは基本的に上の行列に2列・2行のゼロを充填したものである.
Combinatorica オブジェクトで指定されたグラフの隣接行列である.
行列形式での入力は変化しない.

Bicomponents

Bicomponents[g]無向グラフ g の二重連結成分を返す

二重連結成分を見付ける

Bicomponents[g]は,無向グラフ g の二重連結成分すべてのリストを返す.

頂点 v とすべての辺を削除するとグラフ g が連結でなくなる場合,頂点 v はグラフ g の切断点であるという.切断点がないグラフは二重連結である.二重連結成分とは切断点を持たない最大の部分グラフである.

2つの頂点が二重連結である単純な線分である.
以下は1つの線分によりつながれた2つの閉路である.それぞれの閉路は二重連結成分を形成する.線分は2つの二重連結成分に分けられる.

ClosenessCentrality

ClosenessCentrality[g]近接中心性を見付ける

近接中心性を見付ける

頂点 u の近接中心性は,u から他のすべての頂点への距離の総和の逆数として定義される.非連結グラフの頂点の近接中心性は,その頂点が属する成分の近接中心性に基づく.

以下で格子グラフの近接中心性を計算し,中心性が高い頂点が赤で彩色されるようグラフをプロットする.
頂点に,他の頂点に到達するような経路がない場合,その頂点の中心性はゼロである.
非連結グラフの中心性は,それぞれの成分を別々に扱うことで計算される.

ClosenessCentralityのオプション

オプション名
デフォルト値
WeightedTrue最短経路の計算で辺の重みを使うかどうか
NormalizeTrue出力を正規化するかどうか

ClosenessCentrality のオプション

Weighted

Weightedオプションは,距離の計算で辺の重みを考慮するかどうかを指定する.可能な値は True(デフォルト)かFalseである.Weighted->Falseでは,辺は単位重みを持つものとされる.

以下は3つの頂点を持つ完全グラフであり,辺2->3のひとつが2度繰り返されるため辺の重みは2となる.これにより頂点2の中心性が低下する.
辺の重みがすべて1と意図するならば,オプションWeighted->Falseを指定しなければならない.
Normalize

Normalizeオプションは,出力が最大中心性1となるよう正規化するかどうかを指定する.可能な値はTrueFalse(デフォルト)である.

以下で3つの頂点を持つ完全グラフの近接中心性を計算する.任意の頂点から他の頂点までの距離の総和は2なので,各頂点に対する近接性はである.
以下で出力を正規化する.

CommunityModularity,CommunityStructureAssignment,CommunityStructurePartition

CommunityStructurePartition[g]グラフ g をコミュニティに分割する
CommunityStructureAssignment[g] グラフ g のコミュニティへの頂点の割当てを与える
CommunityModularity[g,partition]分割したコミュニティのモジュールを与える
CommunityModularity[g,assignment]割当てを行ったコミュニティのモジュールを与える

コミュニティ構造を見付け,評価する関数

CommunityStructurePartitionはグラフをコミュニティに分割する.この分割では,コミュニティ間よりもコミュニティ内の辺の方が密になるよう,頂点がコミュニティにグループ分けされる. CommunityStructureAssignmentは結果を割当てとして与える.

以下で小さいグラフを定義する.
グラフをコミュニティに分割する.
頂点をコミュニティに割り当てる.
どの頂点がどのコミュニティに割り当てられたかを示す.
各コミュニティを異なる色で彩色したグラフをプロットする.

コミュニティ構造を見付けるアルゴリズム

関係を示す情報の多くは,グラフとして表すことができる.グラフの特徴の一つは,コミュニティ構造である.これはグループ間よりもグループ内の辺の密度の方が大きくなるように頂点をグループ分けすることである.グラフのコミュニティ構造の発見と解析は多くの分野で有用である.例えば,ソフトウェア工学では,相互関係のあるルーチンが同じディレクトリに入るよう,ディレクトリ内のソースコードをグループ分けする必要がある場合がある.ソーシャルネットワークでは, 結びつきの強いコミュニティを形成する友達のグループを見付ける必要がある場合がある.また,並列計算では,関係の深いタスクが同じプロセッサ上に置かれるよう,計算タスクを分割することが望ましい.

ネットワーク内のコミュニティ構造を認識するアルゴリズムは多数存在する.そのひとつの例が[16]のアルゴリズムである.その鍵となる概念はコミュニティのモジュールと呼ばれる数量である.関心のあるグラフが であり,頂点集合 がそれぞれの部分集合が1つずつのコミュニティに属するような 個の部分集合 に分割されるとする.そのとき,この分割によるコミュニティのモジュール と定義することができる.

ここで は両端がコミュニティ にある辺の数の百分率を, はコミュニティ から始まる辺の百分率である.換言すると,

ということになる.明らかに が成り立つ.通常, のランダム分割では はゼロに近く, の大きい正の値となるような の分割は大きなコミュニティ構造を示す.

従って,[16]のアルゴリズムは,それぞれの頂点をそれ自身のコミュニティに割り当てることにより開始され,2つのコミュニティを1つに統合した結果の の変化を計算する.その後 で最も大きい正の変化を与える2つのコミュニティを統合する.このプロセスは統合されたネットワークで繰り返される.最大の変化が負になったらこのプロセスは終了する.

CommunityStructurePartition,CommunityStructureAssignment,CommunityModularityのWeightedオプション

次のオプションを使うことができる.

オプション名
デフォルト値
WeightedFalse辺の重みを考慮に入れるかどうか

CommunityStructurePartitionCommunityStructureAssignmentCommunityModularityのオプション

Weightedオプションは,辺の重みを考慮に入れるかどうかを指定する.このオプションに可能な値はTrueFalse(デフォルト)である.

以下で,頂点3と4の間の辺の重みが2である以外は辺の重みが1のグラフを定義する.
これは辺の重みを無視して3つのコミュニティを見付け表示する.
辺の重みを考慮に入れると,頂点3と4の間の辺の重みが大きくなることで,これら2つの頂点が同じコミュニティに置かれたことを意味する.

EdgeList

EdgeList[g]グラフ g の辺のリストを与える

辺のリストを見付ける

簡単なグラフの頂点のリストを与える.
これで Combinatorica グラフオブジェクトを規則のリストに変換する.
多重辺を削除する.

ExpressionTreePlot

ExpressionTreePlot[e]e の式の木をプロットする
ExpressionTreePlot[e,pos]根を位置 pos に置いて,e の式の木をプロットする
ExpressionTreePlot[e,pos,lev]根を位置 pos に置いて,e の式の木をレベル lev までプロットする

式の木をプロットする関数

ExpressionTreePlotは式の木をプロットする.これはTreePlotと同じオプションを持つ.

式の木のプロットである.各頂点のツールチップはその頂点から下の部分式を表示する.
根を左に置いて,レベル2までの式の木を表示する.

GraphCoordinatesとGraphCoordinates3D

GraphCoordinates[g]視覚的にアピールする2Dレイアウトを計算し,頂点座標を返す
GraphCoordinates3D[g] 視覚的にアピールする3Dレイアウトを計算し,頂点座標を返す

座標を返すグラフ描画関数

GraphCoordinatesは,グラフ描画アルゴリズムで計算された頂点座標を返す.これは,グラフを描画するよりも頂点座標が必要であるような場合,または同じレイアウトを異なるスタイルで繰り返し描画する必要がある場合に便利である.

GraphCoordinatesGraphPlotと同じオプションを取る.

以下で小さいグラフを定義し,プロットする.
上の描画の頂点座標を返す.
すでに計算されたレイアウトを使って2つの異なるスタイルを持つグラフをプロットする.
頂点と座標の関係は以下で与えられる.

GraphCoordinatesは頂点の位置だけを返すので,LayeredGraphPlotに使われた場合,多重辺や自己ループは描画するが曲線の辺は再生されない.

有向グラフのLayeredGraphPlotを表示する.
上のプロットの頂点座標を見付ける.
頂点1と3の間の曲線の辺は再生されない.

GraphCoordinatesとGraphCoordinates3Dのオプション

GraphCoordinatesGraphCoordinates3DはそれぞれGraphPlotGraphPlot3Dと同じオプションを取る.

GraphDistance,GraphPath,GraphDistanceMatrix

GraphDistance[g,start,end]グラフ g で頂点 i から頂点 j までの距離を与える
GraphPath[g,start,end]グラフ g で頂点 startend の間の最短経路を見付ける
GraphDistanceMatrix[g](i,j) 番目の要素が,グラフ g における頂点 i から頂点 j までの最短経路の長さとなるような行列を与える
GraphDistanceMatrix[g,Parent](1,i,j) 番目の要素が i から j までの最短経路の長さ,(2,i,j) 番目の要素が i から j までの最短経路における j の先行点であるような三次元行列を返す

最短距離,最短経路,および全点対最短距離・経路を見付ける

GraphDistanceは1つの頂点から別の頂点までのグラフ距離を返す.i から j までに経路が存在しない場合は,Infinityが返される.デフォルトで,各辺の重みは1とされる.

GraphPathGraphDistanceMatrixは,それぞれ最短経路および全点対最短経路を見付ける.

以下で2Dの12面体を表示する.
頂点7と18の間の距離は4であることを示し,経路を与える.
頂点7から6へは経路がないことを示している.
以下はすべての頂点間の距離である.
簡単な有向グラフを定義する.
頂点間の距離を計算する.
以下は最短経路の先行点も示している.例えば,1から3への経路には先行点4(prd[[1,3]])があり,1から4への経路には先行点5 (prd[[1,4]])があるので,1から3への経路は{1,5,4,3}である.
以下で最短経路を検証する.

最短経路のアルゴリズム

以下では は辺 の重み, は頂点 から頂点 への最短経路の現在の推定の長さとする.

単一始点最短経路アルゴリズム

単一始点最短経路アルゴリズムは,1つの頂点 から他すべての頂点への最短経路を求める.

ダイクストラ(Dijkstra)法は,辺の重みが非負であるものと仮定する.

以下のように仮定する:

までの最短経路がすでに見付かっている頂点の集合

が「触れる」が に属さず,ヒープに保存される頂点の集合

この場合,アルゴリズムは次のようになる:

1. において最小の の値を持つ頂点 を選ぶ.このステップは二分ヒープあるいはフィボナッチヒープによる計算量 を伴い,すべての場合で 回繰り返される.

2. 頂点 にない場合,頂点 に置き, の隣接頂点 すべてを に挿入する. ならば,が設定され,ヒープが更新される.ヒープへの挿入および更新のすべては,二分ヒープによる計算量 ,フィボナッチヒープによる計算量 があり,すべてにおいて の更新操作との挿入が必要である.

全体的な計算量は,二分ヒープを持つ およびフィボナッチヒープを持つ である.

ベルマンフォード(BellmanFord)アルゴリズムは,辺の重みが負の場合でも使用することができる. ならば と設定され,各辺 を通してループすることにより動作する.このループは回実行されるので,ベルマンフォードアルゴリズムは計算量 であり,ダイクストラ法よりもかなり大きい.従って,これはグラフに負の重みが含まれるときだけ使用される.このアルゴリズムは負の閉路が検出できる.

全点対最短経路アルゴリズム

全点対最短経路アルゴリズムはすべての頂点対の間の最短経路を探す.

ワーシャル・フロイド(FloydWarshall)法では,隣接する頂点間の距離は辺の重みに設定され,それ以外のすべての距離は最初に設定される.次にすべての頂点対 にループし, ならば緩み,に設定される.これにより任意の反復 において,距離 は頂点 の間の最短距離を表し,頂点 だけを通過するようになる.このアルゴリズムの計算量は である.これは負の重みでも使用できるが,負の重みの閉路は検出しない.

辺の重みが非負ならば,単一始点最短経路問題では,各頂点に繰り返しダイクストラ法を適用することができる.この計算量は二分ヒープを伴う ,およびフィボナッチヒープを伴う である.

辺の重みが負ならば,ダイクストラ法を直接適用することはできない.まずジョンソン法で, ならば となるように値 をすべての頂点 に関連付けることによりすべての辺の重みを正にする.辺の重みはその後 で修正される.

辺の重みを変更するためには,重み0ですべての頂点にリンクされる仮想頂点 が加えられる.すべての頂点 に対して, から までの距離として定義される.したがって,すべての辺 に対して が成り立つ.そうでない場合は は真の最短経路の長さではない.よって である.

この修正により最短経路は変更されないので,ダイクストラ法を重みの修正されたグラフに適用することができる.その後,距離は によりもとに戻される.

辺の重みが非負の場合,ジョンソン法はダイクストラ法と同じ計算量を持つ.そうでない場合は,ベルマンフォードアルゴリズムと同じ計算量である.

GraphPath,GraphDistanceMatrix,GraphDistanceのオプション

オプション名
デフォルト値
MethodAutomatic最短経路を見付けるアルゴリズム
WeightedTrue最短経路を計算するときに辺の重みを使うかどうか

GraphPathGraphDistanceMatrixのオプション

オプション名
デフォルト値
WeightedFalse最短経路を計算するときに辺の重みを使うかどうか

GraphDistanceのオプション

Method

オプションMethodは最短経路を見付けるのに使用するアルゴリズムを指定する.デフォルトでは,MethodAutomatic,つまりジョンソン法に設定されている.このオプションに可能な他の値には"BellmanFord""Dijkstra""FloydWarshall""Johnson"がある.

Weighted

オプションWeightedは,最短経路を見付ける場合に辺の重みを考慮に入れるかどうかを指定する.可能な値にはTrueFalseがある.

GraphEdit

GraphEdit[]グラフをインタラクティブに生成・編集する
GraphEdit[g]グラフ g をインタラクティブに編集する

インタラクティブなグラフの編集

GraphEditJ/Link アプリケーションである.この関数を実行すると,Javaウィンドウが開く.これで新規グラフを生成することも既存のグラフを編集することもでき,結果のグラフを Mathematica に戻すことができる.

グラフ g は規則のリスト,隣接行列,グラフの Combinatorica 表現で指定することができる.

頂点および辺はマウスをクリックアンドドラッグして加えることができる.頂点は「Drawing mode」を「Move」に設定し,その頂点上でマウスをドラッグすると動かすことができる.また,「Drawing mode」を「Delete」に設定し,頂点をクリックすると,その頂点が削除される.

GraphEditウィンドウでCtrlキーを押したままで頂点をクリックする(マウスの主ボタンを使って)と,頂点ラベルが編集できる.

ウィンドウを閉じると,グラフの描画,規則のリストとしてのグラフの表現,座標,頂点ラベルが返される.

HamiltonianCyclesとFindHamiltonianCycle

HamiltonianCycles[g,n]n 個のハミルトン閉路のリストを与える
HamiltonianCycles[g]1つのハミルトン閉路のリストを与える
FindHamiltonianCycle[g]ハミルトン閉路を見付けようと試みる

ハミルトン閉路を見付ける

ハミルトン閉路が存在しない場合,HamiltonianCyclesおよびFindHamiltonianCycleはどちらも空リストを返す.どちらも入力グラフを無向グラフとみなす.

HamiltonianCycles[g,All]はすべてのハミルトン閉路を返す.

ハミルトン閉路を見付ける.
上のグラフには合計60個のハミルトン閉路がある.

ハミルトン閉路を見付けるためのアルゴリズム

グラフのハミルトン閉路を見付けることはNP困難問題である.

HamiltonianCyclesでは深さ優先探索法が使われる.これは,大きいグラフのハミルトン閉路をすべて見付ける場合,かなりの時間がかかる場合がある.

FindHamiltonianCycleではハミルトン閉路を見付けるのにAngluin & Valiantのヒューリスティックスを使う.1つの始点からなる経路が構築される.このアルゴリズムは現行の経路の終点から始め,隣接頂点をランダムに加えることにより貪欲に作用する.隣接頂点がすでに経路上にある場合は,「回転」されて,経路の部分の方向が逆行し新しい経路が構築される.その後経路上のすべての辺がグラフから削除され,隣接頂点がなくなるまでこのプロセスが続行する.閉路が見付からない場合は,別の始点が使われ閉路を見付けようとする.これはすべての頂点が始点として使われるまで続く.これで1回の反復となる.

FindHamiltonianCycleのオプション

オプション名
デフォルト値
MaxIterations100反復の最大回数
RandomSeed0使用するランダムシード

FindHamiltonianCycleのオプション

MaxIterations

オプションMaxIterationsは試行の最大反復回数を指定する.可能な値は正の機械整数である.

RandomSeed

オプションRandomSeedは選ばれたランダムな隣接頂点で使われれるランダムシードを指定する.可能な値は機械整数である.

LineScaledCoordinate

LineScaledCoordinate[{{x1,y1},{x2,y2},,{xk,yk}},r]
{x1,y1}からの r のスケールされた距離において,ポリライン{{x1,y1},{x2,y2},,{xk,yk}}内の点の座標を与える
LineScaledCoordinate[{{x1,y1},{x2,y2},,{xk,yk}}]
LineScaledCoordinate[ {{x1,y1},{x2,y2},,{xk,yk}}, 0.5]に等しい

ポリライン上の点の座標を見付ける

LineScaledCoordinateGraphPlotGraphPlot3DLayeredGraphPlotのオプションEdgeRenderingFunctionとともによく用いられ,グラフの辺にテキストや画像を加える.

以下は矢印に沿って60%のところに辺を形成する頂点を表示する.

MaximalBipartiteMatching

MaximalBipartiteMatching[g]二部グラフ g の最大マッチングを与える

二部グラフの最大マッチングを見付ける

MaximalBipartiteMatchingは二部グラフの2つの頂点集合間の隣接しない辺の最大集合を与える.

m×n 行列により表される二部グラフは,行および列の頂点集合r={1,2,,m}c={1,2,,n}から構成され,行列要素が gij0ならば頂点 irjc は連結されている.

規則のリスト{i1->j1,i2->j2,}で表現される二部グラフは,頂点集合 r=Union[{i1,i2,}]c=Union[{j1,j2,}]で構成され,規則 i->j が規則のリストに含まれているならば頂点 irjc は連結されている.

MaximalBipartiteMatchingは頂点ペアのリスト{{i1,j1},,{ik,jk}}を返す.ここでペアの数 k はどちらの頂点集合よりも小さい.

以下で最大マッチングを探す.

応用

MaximalBipartititeMatchingは可能な限り多くの要素を疎行列の対角上で置換するために使うことができる.

以下で50×60の疎行列を生成する.要素のほぼ4%が非零である.
マッチする行と列を見付ける.
マッチしない行と列を見付ける.
以下で,まずマッチする行と列を主対角ブロックに置換することにより行列を並べる.

MaximalBipartititeMatchingは疎行列の構造的ランクを見付けるために使うことができる.行列の構造的ランクとは,行列の二部グラフの最大マッチングにおける要素の数をいう.これは行列の数値ランクの上限である.行列は,対角にゼロ要素がないように置換できるなら,構造的完全ランクという.

以下は,4%の非零要素を持つランダムな50×50行列は,平均して39.4の構造的ランクを持つことを示す.

MaximalIndependentEdgeSet

MaximalIndependentEdgeSet[g]無向グラフ g の最大独立辺集合を与える

最大独立辺集合を見付ける

MaximalIndependentEdgeSetg の非隣接辺のペアの近似的最大集合を与える.グラフの最大独立辺集合は最大マッチングとも呼ばれる.

グラフを定義し,最大独立辺集合を見付ける.
最大独立辺集合の辺が赤くなるようグラフをプロットする.
辺の重みを持つグラフを定義し,最大独立辺集合を見付ける.
最大独立辺集合の辺が赤で描画されるグラフをプロットする.辺の重みも表示される.
以下はマッチングを探す際に,重みの大きい辺を優先する.
再びグラフをプロットする.

MaximalIndependentEdgeSetのオプション

オプション名
デフォルト値
WeightedTrue最大独立辺集合を構成する際に,重みの大きい辺を優先するかどうか

MaximalIndependentEdgeSet のオプション

Weighted

Weightedオプションは,最大独立辺集合を構成する場合に,重みの大きい辺を優先するかどうかを指定する.可能な値はTrue(デフォルト)かFalseである.

MaximalIndependentVertexSet

MaximalIndependentVertexSet[g]無向グラフ g の最大独立頂点集合を与える
MaximalIndependentVertexSet[g,w]辺の重みが w である g の最大独立頂点集合を与える

最大独立頂点集合を見付ける

MaximalIndependentVertexSetは,1辺に2つの頂点がないような頂点の近似最大集合を与える.入力は無向グラフとして扱われる.

ベクトルの長さ wg の頂点の数と同じでなければならない.

以下で小さいグラフを指定し,最大独立頂点集合を見付ける.
グラフの最大独立頂点集合を赤い丸で囲んでプロットする.
偶数ラベルの付いた頂点を優先して,最大独立頂点集合を見付ける.
新しい最大独立頂点集合を赤い丸で囲んでプロットする.

MinCut

MinCut[g]辺の切断をほぼ最小に抑えて,無向グラフ g 個の部分に分割する

辺切断の最小化

MinCutは入力を無向グラフとして扱い,各部分がほぼ同数の頂点を持ち,その部分(辺のセパレータとして知られる)間の辺の数が最小となるように,頂点を 個の部分に分割する.

グラフを求める.
辺の分断が最小となるように,頂点を2つの部分に分ける.
分割の1つを赤で,もう1つを緑で彩色して,分割のグラフをプロットする.
約2%のゼロ要素を持つランダムな疎行列を生成し,それを対称にする.
MinCutを使い,非対角要素が最小となるような,行列からブロック対角形式への並替えを試みる.
応用

MinCut関数の最も重要な使用法のひとつは,辺の分断数が最小となるようにグラフまたはメッシュを分割し,ほぼ同じ大きさの部分領域に分割することである.これは,各プロセッサが1つのサブドメインで動作し,プロセッサ間のオーバーヘッドが最小限に抑えられなければならい並列計算などの分野で重要である.通信オーバーヘッドは辺の分断数に比例するため,分割による辺の切断数は最小限でなければならないのである.

並列有限要素構造解析が,三次元構造で実行されるとする.構造をモデル化するために不規則なメッシュが生成される.

メッシュの頂点間の接続を表すグラフである.
以下でグラフを4つの部分に分割する.
属する部分に従って各ノードに色付けした分割グラフである.

MinimumBandwidthOrdering

MinimumBandwidthOrdering[g]グラフ g の内在する無向グラフのバンド幅を最小にする頂点順序 r を見付けるよう試みる
MinimumBandwidthOrdering[m] 行列 m[[r,c]]のバンド幅を最小にする行と列の順列対{r,c}を見付ける.ここで m は行列,rc は置換である.対称の m の場合は rc は同じである

グラフと行列のバンド幅を最小化する順序を見付ける

頂点順序 のグラフ では,グラフのバンド幅は以下のように定義される.

ここで から へのマッピングである.

行列 のバンド幅は

と定義される.行列 では,バンド幅は

と定義される.対称行列の場合,エンベロプの大きさは

と定義される.これは各行の最初の要素から対角要素の位置までの距離の和である.1行に対角要素がない,または対角の前の要素がない場合は,距離はゼロとされる.

行列のプロファイルは,単にエンベロプの大きさと行列の大きさを足したものである.

小さいグラフを定義する.
VertexListの順序を使い,頂点に番号を付ける.
以下で上の順序のグラフのバンド幅を見付ける.
バンド幅を最小化しようとする頂点順序を見付ける.
最小バンド幅順序を使って,頂点の番号を付け替える.
MinimumBandwidthOrderingで与えられる頂点順序を使い,バンド幅を見付ける.
矩形行列を定義する.
行列のバンド幅を最小にしようとする行および列の順序を見付ける.
順序付けの前後での行列のプロットにより,バンド幅の減少が見られる.
疎行列を定義し,最小バンド幅となる順序を見付ける.
行列をグラフとしてプロットする.順序の早い頂点を青,遅いものを赤で彩色する.対称行列では,行と列の順序は同じ()である.
順序付けの前と後の行列である.

バンド幅とエンベロプサイズを最小にするためのアルゴリズム

グラフの最小バンド幅順序を見付ける問題はNP完全問題であることが証明されている.したがって,実践的なアルゴリズムはすべてヒューリスティックであり,近似的な最適順序を見付けることを目標とするものである.

基本的アルゴリズム

連結無向グラフの場合,RCM(逆CuthillMcKee)法[8]はグラフの擬似直径を見付けることから開始する.次に直径の一方の端 から頂点が順序付けされ,多数のレベル集合を形成する.ここで同じレベル集合内の頂点は までの距離が等しい.同じレベル集合内では,可能な限り最低の順序の頂点に連結された頂点が優先される.一旦すべての頂点に順序が付いたら,その順序が逆にされる.順序を逆にすることがバンド幅に与える影響はほとんどないが,順序付けが疎行列の因数分解に使われる場合,順序を逆にすることで記入要素が減ることが多い[13]ということが分かっている.ここでの実装では,変形アルゴリズムのRCMD法を提供する.これは同じ最下位の頂点に接続されている頂点間のつながりを,最低次数の頂点に先に順序を付けることにより破るものである.

RCMあるいはRCMDの結果はさらに精錬してよいものにすることができる.これには[9, 12]のノード重心法と山登り法が使える.山登り法では,グラフのバンド幅と同じバンド幅を持つ重要頂点が見付けられ,その頂点の順序とそれ以外の頂点の順序とを入れ替えようとする.これは重要頂点の数もバンド幅も減少できなくなるまで続けられる.ノード重心法では,グラフのバンド幅に近いバンド幅を持つ準重要頂点が見付けられ,その順序および隣接頂点の順序の平均として新しい順序が計算される.それから頂点はソートされ並べ替えられる.ノード重心法の後には常に山登り法が実行される.山登り法による微調整,あるいはノード重心法と山登り法との組合せは,RefinementMethod->"HillClimbing"RefinementMethod->"NodeCentroidHillClimbing"で指定することができる.

ノード重心法と山登り法は複数レベルの手順と組み合せることもできる.ここでは,もとのグラフからだんだん小さくなる一連のグラフが生成される.最小のグラフに対する最初の順序は,RCMあるいはRCMDを使って見付けることができる.もっと粗いグラフの順序は,細かいグラフへと補間され,ノード重心法と山登り法を使って微調整される.複数レベルのメソッドはRecursionMethod->"Multilevel"で選ぶことができる.

スローン(Sloan)法[10, 11]は,無向グラフの順序のエンベロプサイズを最小化することを目標とする.これはまず のペアで形成されるグラフの擬似直径を見付ける.頂点は4つの互いに素なクラスに分類される.その4つとは,順序付き(すでに順序の付いているもの),アクティブ(1つ以上のアクティブな頂点に連結しているもの), プリアクティブ(1つ以上のアクティブな頂点に連結しているが,順序の付いた頂点には連結していないもの),インアクティブ(順序付き,アクティブ,プリアクティブのいずれでもないもの)である.頂点は から優先順位が決まる.頂点 の優先順位は により与えられる.ここで, はもし次に の順序が付いたらアクティブになり,もし が現在プリアクティブならばプラス1になるプリアクティブおよびインアクティブの頂点数 である.また の間の距離,は2つの正の重みである.このアルゴリズムは,アクティブおよびプリアクティブな頂点から優先順位の最も高い頂点を1つ選ぶことで動作する.一旦頂点が選ばれると,残りのアクティブおよびインアクティブな頂点の優先順位が更新される.最も優先順位の高い頂点を効率よく(ソートしないで)見付けるために,二分ヒープデータ構造が使われる.スローンアルゴリズムは,RCMアルゴリズムおよびその変形よりも大きいバンド幅ではあるが,小さいエンベロプサイズの順序を与える傾向がある.

非対称行列のアルゴリズム

グラフ g に対して,MinimumBandwidthOrderingg の内在する無向グラフのバンド幅を最小化する頂点順序 を見付けようとする.しかし,[12]に従う次元 × の非対称行列 ではMinimumBandwidthOrderingは以下の対称行列

を使う.これは の行および列の二部グラフを表す. に対する順序がまず計算される.次にこれが の順序に変換される.順序 のバンド幅を最小化するとすると, の行順序は 以下の の要素により与えられ,列順序は より大きい要素マイナス で与えられる.以下の通りである.

MinimumBandwidthOrderingのオプション

オプション名
デフォルト値
MethodAutomatic使用するメソッド
RefinementMethodAutomaticさらに順序の質を向上させるために使うアルゴリズム
RecursionMethodNone使用する再帰的メソッド

MinimumBandwidthOrdering のオプション

Method

オプションMethodはバンド幅あるいはエンベロプサイズを最小にするために使われるアルゴリズムを指定する.このオプションに可能な値はAutomatic"RCM""RCMD""Sloan"である.デフォルトではMethodAutomaticに設定されている.

次の例で,バンド幅減少アルゴリズムとエンベロプサイズ減少アルゴリズムとの差を示す.

疎行列を定義する.
以下でRCMD法とスローン法を使って行列を並べ替える.
プロットから,RCMD法の行列の方がバンド幅がずっと小さいことが分かる.
以下で行列のバンド幅とエンベロプサイズを計算する2つの関数を定義する.
RCMD法はバンド幅を最小化しようとするので,小さいバンド幅を与える.
スローン法はエンベロプサイズを最小化しようとする.
RefinementMethod

RefinementMethodオプションは上記のメソッドのいずれか1つを適用した後に,バンド幅をさらに適切なものにするために使用する微調整メソッドを指定する.このオプションに可能な値は,Automatic(デフォルト),None"HillClimbing""NodeCentroidHillClimbing"である.

RecursionMethod

RecursionMethodオプションは複数レベルのプロセスを適用するかどうかを指定する.このオプションに可能な値はNone(デフォルト)と"Multilevel"である.

適用

最小バンド幅順序付けは,数値計算のキャッシュパフォーマンスを最適化する場合にも適用される.例えば,疎行列とベクトルを掛け合せる場合,バンド幅を最小にするようあらかじめ行列に順序が付いていると,ベクトルの要素はランダムにアクセスされないため,キャッシュパフォーマンスが向上する.順序付けそのものに時間がかかるため,このキャッシュパフォーマンスの向上は,行列・ベクトル積の操作を何度も繰り返すときだけに有益である.

バンド化された行列を生成し,ランダムに置換する.
行列・ベクトル積を50回実行する.
バンド幅が最小になるよう行列を置換し,ベクトルにも対応する置換を施す.
これで行列・ベクトル積にかかる時間が少なくなった.
置換を行っても答が同じであることを検証する.

NeighborhoodSubgraph

NeighborhoodSubgraph[g,i,r]r 回以内のホップで頂点 i から到達できる頂点からなる部分グラフを与える
NeighborhoodSubgraph[g,i]頂点 i から到達できる頂点からなる部分グラフを与える

近隣の部分グラフを見付ける

疎行列をインポートし,表示する.また頂点1から3回以内のホップで到達できる頂点の部分グラフを表示する.

NeighborhoodVertices

NeighborhoodVertices[g,i,r]r 回以内のホップで頂点 i から到達できる頂点を与える
NeighborhoodVertices[g,i]頂点 i から到達できる頂点を与える

近隣の頂点を見付ける

疎行列をインポートし,グラフとして表示する.また頂点1,202,249から3回以内のホップで到達できる頂点を表示する.

PageRanks,PageRankVector,LinkRanks,LinkRankMatrix

PageRanks[g]グラフ g のページランクを規則のリストとして与える
PageRankVector[g]グラフ g のページランクをベクトルとして与える

PageRanks関数とPageRankVector関数

以下で小さいグラフのPageRanksPageRankVectorを計算する.
ページランクとグラフを一緒に表示する.
フィードバックリンクをより多く加えることにより,"home"のページランクを上げる.

PageRanksアルゴリズム

大雑把に言うと有向グラフの場合, から までの辺があるならば頂点 は頂点 とリンクしているインターネットを表すと仮定すると,頂点のページランクは,ランダムなインターネットサーファーがその頂点を訪れる確率である.

ランダムなサーファーが時間刻み でページ を訪れるとする.次のステップで,サーファーは同じ確率で の外近傍 の1つからノード をランダムに選ぶ.

ここでサーファーがシンク(出リンクのないノード)に捕まらないようグラフに修正を加える必要がある.出次数がゼロのノード と,それ自身を含むすべてのノードとをリンクするのである.この修正により以下が定義できる.

ページ のページランクは,サーファーが時間刻み でページ にいる確率として定義される.

行列 が,すべてのに対して項目値 を持ち の出次数であるグラフと同じ構造であると定義する.ここでとすると, 番目の行の和は1である.ならば, を頂点の数としてその行のすべての項目を と設定することにより,行 を修正することができる.修正された行列

であり, である.ここで のときに となる以外,すべての1の 次元の列ベクトル, は0の列ベクトルである.したがって ならば項目値 の行 を持ち,その他の行には項目値0である行列となる.

もう1つ修正が必要である. により与えられる有向グラフが強連結でないならば,サーファーは有向グラフの要素に捕らえられる.すべてのページが訪れられるようにするために,サーファーがページ を訪れるときに他のページをランダムに訪れるわずかな確率(転送確率)があるものと仮定する.要約すると,ノード からは,その 近傍を訪れる確率が ,それ自身を含むあらゆるノードを訪れる確率が である.ノード からはあらゆるノードを訪れる確率は となる.行列で言うと,ページランクベクトル

を満足しなければならず,このとき

である. と表記するとページランク計算のタスクは, の固定点を見付けることである.

固定点計算は1のベクトルから開始して,反復的に実行される.ページランクの平均的な変更が許容誤差より小さいならば,プロセスは収束したと考えられる.最終結果は総和が となるようスケールされた,サーファーの確率の近似値である.

シンクを扱う別のモデルに,それをすべてのノードにそれぞれとリンクして削除するのではなく,それ自身にリンクするというものがある.このモデルでは,シンクから抜け出す唯一の方法は転送によるものとなる.サーファーがこのノードにとどまる確率は であり,ノードを訪れる確率は である.このモデルはオプションRemoveSinks->Falseで利用することができる.

PageRanksとPageRankVectorのオプション

以下のオプションを取ることができる.

オプション名
デフォルト値
ToleranceAutomatic収束チェックに使われる誤差許容度
TeleportProbability0.15ランダムなノードを訪れる確率
RemoveSinksTrueシンクとすべてのノードをリンクして,シンクを削除するかどうか

PageRanksPageRankVectorのオプション

Tolerance

Toleranceオプションはページランク計算のための反復アルゴリズムの収束許容度を指定する.平均の変更が許容誤差よりも小さいならば,反復プロセスは終了する.このオプションに可能な値はAutomaticまたは正の機械サイズの数である.

TeleportProbability

TeleportProbablityオプションは,インターネットサーファーが頂点の出リンクに従わず,ランダムにノードを訪れる確率を指定する.

このオプションに可能な値は,1より小さい正の機械サイズ数であり,デフォルト値は0.15である.これより小さい値であると,ページランクは,通常のインターネットサーファーの動作をより正確に反映したものとなる.しかし,ページランクを計算する反復プロセスの収束は遅くなる.

RemoveSinks

RemoveSinksオプションはシンク(出リンクがないノード)をすべてのノードとリンクして,シンクを削除するかどうかを指定する.可能な値はTrueFalseであり,デフォルトはTrueである.

以下は簡単な有向グラフのPageRanksを計算する.
これはシンク(ノード2)を削除しないでグラフのPageRanksを計算する.
結果を理解するために,(PageRanksを使って)ノード のサーファーの確率が で,転送確率が であると仮定する.そのときRemoveSinksTrueでは,サーファーはノード1を訪れるが,シンクを削除した後にノード2から各ノードにリンクが加えられているためにノード2から(の確率)か,転送によりノード1自身から(の確率)か,転送によりノード2から(の確率)かのいずれかが考えられる.ここで が成り立つ.同様に,サーファーがノード2を訪れるとき,転送によりノード1から(の確率)か,リンクに従ってノード1から(の確率),シンクを削除した後に加わったリンクに従ってノード2から(の確率),転送によりノード2から(の確率)のいずれかがあり得る.したがって確率は以下の方程式を満足し,に正規化される.
のとき, に代入する.
シンクが削除されない場合,以下の方程式が満足される.

PseudoDiameter

PseudoDiameter[g]無向グラフ g の擬似直径と,この直径を構成する2つの頂点を与える

無向グラフの擬似直径を見付ける

グラフ測地線はグラフの2頂点間の最短経路である.グラフ直径は,グラフの測地線すべての中で最も長いものである. PseudoDiameterは近似グラフ直径を見付ける.

使用されるアルゴリズムは,頂点 u から始まり,u から最も遠い頂点 v を見付ける.このプロセスは v を新しい開始頂点として扱うことにより繰り返され,グラフ距離がそれ以上増加しなくなったら終了する.最後のレベル集合で,最小次数の頂点が最後の開始頂点 u として選ばれ,グラフ距離が増加できるかどうかを調べるために走査が行われる.このグラフ距離が擬似直径とされる.

グラフが非連結の場合,各連結成分に対する直径と頂点が返される.

五角形グラフの直径が2であることを示す.
擬似直径の2頂点が赤でハイライトされたグラフを示す.
格子グラフを定義し,その擬似直径を見付ける.
頂点1と25の間のグラフの測地線を見付け,赤でハイライトする.
非連結グラフを定義し,各要素に対する擬似直径を見付ける.

PseudoDiameterのAggressiveオプション

オプション名
デフォルト値
AggressiveFalse最適グラフ直径を見付けるのに追加の試みが必要がどうか

PseudoDiameterのオプション

オプションAggressiveは最適グラフ直径を見付けるのに追加の試みが必要かどうかを指定する.可能な値はTrueFalse(デフォルト)である.設定Aggressive->Trueでは,最後のレベル集合の各頂点からの走査が実行される.これにより大きい擬似直径が与えられることもある.

以下は,4%の非零要素を持ち,AggressiveオプションがFalseTrueに設定されている次元100×100の疎行列により表されるランダムグラフの平均擬似直径を見付ける.2つ以上の要素がある場合,最大の擬似直径が選ばれる.

StrongComponentsとWeakComponents

StrongComponents[g]有向グラフのすべての強連結成分のリストを返す
WeakComponents[g]無向グラフ g のすべての弱連結成分のリストを返す

強連結成分を求める

有向グラフにおける強連結成分とは,任意の2ノード間に経路が存在する頂点集合のことである.

StrongComponents[g]は,有向グラフ g の全強連結成分のリストを返す.

有向グラフの弱連結成分とは,頂点の各ペアでその頂点間に経路があるような頂点集合のことである.グラフ g は無向グラフと考えられる.

WeakComponents[g]は無向グラフ g の弱連結成分すべてのリストを返す.

単純な有向グラフである.
下は2つ以上の頂点から構成されるグラフには強連結成分がないことを示している.
3から2への辺を加えると,{2,3,4,5}は強連結成分になる.
以下のどちらのグラフも弱連結である.
以下で非連結グラフを定義する.
このグラフには2つの弱連結成分がある.
次で強連結成分を見付ける.

応用

無向グラフの連結成分の数を求める

StrongComponentsを使って無向グラフ中に連結成分がいくつあるかを調べることができる.

次で非連結グラフを表す対称行列を生成する.
これで,このグラフが2つの非連結成分を持つことが分かる.

規則のリストとして指定されたグラフは,まず対称化し,次にStrongComponentsを使ってその連結された成分を求めることができる.

規則のリストを使ってグラフを指定し,次に無向グラフとしてこれをプロットする.
これでグラフを対称化し,無向グラフにする.次に無向グラフの2つの連結成分を見付ける.
これは100の頂点を持つ無向グラフの成分数が,グラフの平均度数とともにどのように変化するかを示している.RandomSymmetricSparseMatrixは定義済みである.
行列をブロック三角形にする

StrongComponentsからの出力は,行列をブロック三角形に再編成するのに使うことができる.

次は大きさが100×100で平均度数が2のランダムな有向グラフを生成する.
以下で行列を表示する.
これで強連結頂点を求める.
これは強連結頂点のリストを使って行/列を対称的に置き換えることで,行列を順序付ける.次は並べ替えられた行列である.
整列し直した行列はブロック三角形で,1つの大きなブロックがある.その他の要素は単一頂点である.
対角線状に非零要素ができるだけないようにしたブロック三角行列の作成は,まず最初にMaximalBipartiteMatchingを使って対角上の要素を置き換え,次にStrongComponentsを使って強連結成分を探す.
これで,ブロックがずいぶん小さくなった.強連結成分の残りは単一の頂点からなっている.

ToCombinatoricaGraph

ToCombinatoricaGraph[g]グラフ gCombinatorica 形式を返す
ToCombinatoricaGraph[g,n]n 個の頂点を持つグラフを生成するために,必要に応じて付加的な非連結頂点を加え,グラフ g を返す

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

ToCombinatoricaGraphグラフユーティリティパッケージで取ることのできるすべての形式のグラフを Combinatorica グラフオブジェクトに変換する.

簡単なグラフを定義する.
Combinatorica オブジェクトを表示する.
ここではオプショナルの第2引数を使い,グラフを追加の非連結頂点で充填する.

ToCombinatoricaGraphのMethodオプション

オプション名
デフォルト値
MethodAutomaticグラフをレイアウトするために使うメソッド

ToCombinatoricaGraphのオプション

オプションMethodは,グラフをレイアウトするために使うメソッドを指定する.このため計算される座標は結果の Combinatorica グラフオブジェクトに埋め込まれる.可能な値はGraphPlotMethodオプションの値と同じである.デフォルトはAutomaticで,GraphPlotのデフォルトメソッドを使う.しかし,入力が Combinatorica オブジェクトの場合は,オブジェクトの座標は変更されない.

以下で簡単なグラフを定義する.
以下は上のグラフを Combinatorica オブジェクトに変換したグラフであり,GraphPlotによる描画と比較する.
以下では座標を見付けるために,バネ埋込み法が使われている.
Combinatorica オブジェクトを定義する.
Combinatorica オブジェクトがToCombinatoricaGraphの適用後も変更されないことを示す.
余分な頂点を加える.
"SpringEmbedding"メソッドを使って余分な頂点を加える.

VertexList

VertexList[g]グラフ g の全頂点のリストを与える

全頂点のリストを得る

VertexListはグラフ g の頂点のリストを返す.

規則のリストを使って指定されたグラフでは,頂点は最初に現れる順序で返される.

GraphCoordinatesPageRankVector等の関数はVertexListで与えられる順序で頂点に関する情報を返す.

簡単なグラフの頂点のリストを返す.
小さいグラフを定義し,GraphCoordinatesを計算する.
頂点リストと座標との間の関係を示す.
座標情報を使ってグラフを描画する.
VertexListの頂点の順序は,頂点ラベルの辞書並び順と同じとは限らない.

参考文献

[1] G. Di Battista, P. Eades, R. Tamassia, and I. G. Tollis, Graph Drawing: Algorithms for the Visualization of Graphs, Englewood Cliffs, NJ: Prentice-Hall, 1999.

[2] T. M. J. Fruchterman and E. M. Reingold, "Graph Drawing by Force-Directed Placement," SoftwarePractice and Experience, 21(11), 1991 pp. 11291164.

[3] P. Eades, "A Heuristic for Graph Drawing," Congressus Numerantium, 42, 1984 pp. 149160.

[4] N. Quinn and M. Breuer, "A Force-Directed Component Placement Procedure for Printed Circuit Boards," IEEE Transactions on Circuits and Systems, CAS-26(6), 1979 pp. 377388.

[5] T. Kamada and S. Kawai, "An Algorithm for Drawing General Undirected Graphs," Information Processing Letters, 31(1), 1989 pp. 715.

[6] D. Harel and Y. Koren, "Graph Drawing by High-Dimensional Embedding," in Proceedings of 10 th Int. Symp. Graph Drawing (GD'02); Lecture Notes in Computer Science, Vol. 2528, London: Springer Verlag, 2002 pp. 207219.

[7] C. Walshaw, "A Multilevel Algorithm for Force-Directed Graph-Drawing," Journal of Graph Algorithms and Applications, 7(3), 2003 pp. 253285.

[8] E. Cuthill and J. McKee, "Reducing the Bandwidth of Sparse Symmetric Matrices," in Proceedings of the 24 th National Conference of ACM, New York: ACM Publications, 1969 pp. 157172.

[9] A. Lim, B. Rodrigues, and F. Xiao, "A Centroid-Based Approach to Solve the Bandwidth Minimization Problem," in Proceedings of the 37 th Annual Hawaii International Conference on System Sciences (HICSS'04), Track 3, Vol. 3, Washington D.C.: IEEE Computer Society, 2004 p. 30075.1.

[10] S. T. Barnard, A. Pothen, and H. D. Simon, "A Spectral Algorithm for Envelope Reduction of Sparse Matrices," Journal of Numerical Linear Algebra with Applications, 2(4), 1995 pp. 311334.

[11] S. Sloan, "A Fortran Program for Profile and Wavefront Reduction," International Journal for Numerical Methods in Engineering, 28(11), 1989 pp. 26512679.

[12] J. K. Reid and J. A. Scott, "Ordering Symmetric Sparse Matrices for Small Profile and Wavefront," International Journal for Numerical Methods in Engineering, 45(), 1999 pp. 17371755.

[13] J. A. George, "Computer Implementation of the Finite-Element Method," Report STAN CS-71-208, Ph.D. thesis, Department of Computer Science, Stanford University, Stanford, California, 1971.

[14] K. Sugiyama, S. Tagawa, and M. Toda, "Methods for Visual Understanding of Hierarchical Systems," IEEE Transactions on Systems, Man, and Cybernetics, 11(2), 1981 pp. 109125.

[15] E. R. Gansner, E. Koutsofios, S. C. North and K.-P. Vo, "A Technique for Drawing Directed Graphs," Software Engineering, 19(3), 1993, 214230.

[16] A. Clauset, "Finding Local Community Structure in Networks," Physical Review E, 72, 026132, 2005.

[17] Y. F. Hu, "Efficient, High-Quality Force-Directed Graph Drawing," The Mathematica Journal, 10(1), 2005 pp. 3771.