以下の実施形態では、頂点と、頂点間を接続する辺とで構成されたグラフに含まれる各頂点について、他の頂点の各々との最短経路を表現する最短経路行列を生成する。
まず、実施形態の詳細を説明する前に、最短経路行列の概要について説明する。
図1にグラフの一例を示す。図1において、頂点を黒丸で表し、頂点に併記した数字で頂点の識別番号(以下、「頂点番号」という)を表している。以下の各図においても同様である。なお、本明細書では、グラフのn個の頂点に1からnまでの頂点番号を付与して、各頂点を識別するものとする。以下、頂点番号xの頂点を「頂点x」と表記する。
図1に示すグラフにおいて、各頂点から頂点1への最短経路を考える。このグラフの最短経路は、図2に示すような最短経路木で表すことができる。
なお、一般的に、最短経路木に含まれる頂点数をnとした場合、最短経路木に含まれる辺の数はn−1である。また、最短経路木は、ある頂点を一番上に、それに繋がる頂点(群)をその下に、さらにその頂点(群)に繋がる頂点をその下に、・・・というように、木を逆にしたような形に書くことができる。この場合、一番上の頂点を「根」という。また、その頂点より下に頂点が存在しない頂点を「葉」という。また、ある頂点vのすぐ下に繋がる頂点wを頂点vの子、頂点vを頂点wの親という。
図2上図は、最短経路の終点である頂点1を根とする最短経路木であり、図2下図は、根を一番上にして表した最短経路木の例である。例えば、頂点6から頂点1への最短経路は、頂点6から順にその親を辿って頂点1に到達するまでに経由する頂点の列として求めることができる。
頂点1を根とする最短経路木は、図3に示すような配列として表現することができる。図3の例では、配列のi番目の要素には、頂点iから頂点1へ辿る際に次に辿るべき頂点の頂点番号、すなわち頂点iから頂点1への最短経路における頂点iの親の頂点番号が格納されている。頂点1は最短経路の終点であり、親は存在しないため、頂点1に対応する配列の要素には、親が存在しないことを示す値を格納する。その値としては、最短経路行列の値として取りえない値、例えば、最大の整数値とすることとし、ここでは、その値をEで表す。すなわち、Eが格納されている要素に対応する頂点は、最短経路の終点であることを示している。
図1に示すグラフに対して、全頂点から全頂点への最短経路木を示す配列を、頂点1に対応する配列から頂点8に対応する配列まで順に並べて二次元の配列として表現した最短経路行列を、図4に示す。このような最短経路行列から最短経路を復元する場合、その最短経路の長さをLとすると、L個の最短経路行列の要素にアクセスする必要がある。最短経路行列の要素へのアクセスにおおよそ比例したディスクの入出力回数を要するので、この最短経路行列へのアクセス回数を削減することができれば、ディスクの入出力回数を削減することができ、最短経路行列から高速に最短経路を復元することができる。
そこで、以下の実施形態では、最短経路行列の要素の値として、上述の親の頂点番号だけではなく、最短経路上に現れる長さ2以上の経路(以下、「中間経路」という)の識別情報を用いる。
なお、中間経路としては、最短経路上に現れる点(以下、「中間点」という)、辺(以下、「中間辺」という)も存在する。中間点は長さ0、中間辺は長さ1の中間経路と考えることができる。ただし、以下の実施形態では、詳細は後述するが、高速に最短経路を復元することを目的とするため、中間経路として、長さ2以上のものを対象とする。なお、以下では、説明を簡単にするため、図1に示すような重みなし無向グラフを例に説明する。重みなしであるため、各辺の長さを1と捉える。したがって、長さ2以上の経路とは、2以上の辺を含む経路を意味する。
<参考例>
次に、以下で詳述する実施形態の理解を助けるために、最短経路行列の要素の値として、中間点及び中間辺の識別情報を用いる場合を参考例として説明する。
図5に、参考例に係る情報処理装置100Rの機能ブロック図を示す。情報処理装置100Rは、付与部12R及び生成部14Rを含む最短経路行列生成部10Rと、復元部22Rを含む最短経路復元部20Rとを含む。
付与部12Rは、グラフに含まれる各頂点間の最短経路を求める。最短経路の求め方は、従来既知の手法を用いることができる。そして、付与部12Rは、最短経路上の中間経路である中間点及び中間辺の各々に、最短経路行列の要素の値として使用するための識別情報を付与する。上述したように、グラフのn個の頂点には、1からnまでの頂点番号が付与されているため、中間点の識別情報としては、この頂点番号をそのまま使用する。辺の識別情報は、通常、辺の両端の頂点の頂点番号の組で表される。この辺の識別情報を中間辺の識別情報として用いてもよい。ただし、この場合、1つの中間辺の識別情報のデータ量は、頂点番号2つ分のデータ量となるため、データ量の小さい識別情報を付与し直してもよい。本参考例では、 付与部12Rは、nを全頂点数として、中間辺の各々に対して、n+1、n+2、・・・という識別情報を付与するものとする。以下では、付与部12Rにより中間辺に付与される識別情報を「中間辺番号」という。
付与部12Rは、中間辺と、その中間辺に付与した中間辺番号とを対応付けて記憶した2つの中間経路表P1、P2を生成する。P1は最短経路行列生成において、P2は最短経路行列復元において用いられる。なお、全ての中間辺に中間辺番号を付与する必要はなく、最短経路行列で用いる中間辺に対してのみ中間辺番号を付与して、中間経路表に記憶すればよい。これにより、中間経路表のサイズを抑えることができる。なお、中間経路表としては、ハッシュ表などのインデクス付表を用いることができる。以下では、中間経路表P1において、両端が頂点k1及び頂点k2である中間辺に中間辺番号「x」を付与したことを表すレコードを、P1[(k1,k2)]=xと表記する。P2は逆に中間辺番号に中間辺を対応させるので、P2[x]=(k1,k2)となる。
生成部14Rは、グラフに含まれる全頂点から全頂点への最短経路を表す行列の各要素の値として、各要素に対応する行及び列に対応する頂点間の最短経路上の頂点(中間点を含む)の頂点番号、及び中間辺の中間辺番号を用いて、最短経路行列を生成する。
ここで、中間点の頂点番号を用いた最短経路行列の生成について考える。頂点iから頂点jへの最短経路、すなわち、頂点iから頂点jへの頂点の列を、σ[i,j]と表す。例えば、図1に示すグラフにおいて、頂点8から頂点1への最短経路、すなわちσ[8,1]は、8,7,5,3,1である。このことを、σ[8,1]=[8,7,5,3,1]と表記する。
また、最短経路行列をSで表した際、最短経路行列Sのi行j列の要素をS[i,j]と表記する。S[i,j]には、頂点iから頂点jへの最短経路における頂点iの親の頂点番号だけでなく、頂点iから頂点jへの最短経路上の中間点の頂点番号が格納される。例えば、図2に示すグラフの最短経路行列について、中間点を使用しない場合には、図4に示すように、S[8,1]=7である。生成部14Rは、これを、例えば、σ[8,1]の中間点を用いて、S[8,1]=3とすることができる。
具体的には、生成部14Rは、付与部12Rにより求められた最短経路σ[i,j]の情報から中間点を取得する。そして、生成部14Rは、取得した中間点の中から選択した中間点の頂点番号をS[i,j]の要素の値として格納する。頂点番号の選択方法としては、例えば、ランダムに選択したり、最も小さい頂点番号を選択したり、既に他の要素の値として選択されている頂点番号のうち、出現頻度が最も高い頂点番号を選択したりするなど、任意の方法を採用することができる。
中間点の場合と同様に、中間辺の中間辺番号を用いた最短経路行列の生成について考える。生成部14Rは、付与部12Rにより求められた最短経路σ[i,j]の情報から取得した中間点に、辺を構成する中間点の組が含まれる場合、その中間点の組で構成される中間辺の中間辺番号を、S[i,j]の要素の値として格納してもよい。具体的には、上記の中間点の場合と同様に、生成部14Rは、最短経路σ[i,j]の情報から中間辺を取得し、取得した中間辺の中から最短経路行列の要素の値として用いる中間辺を選択する。中間辺を選択する際には、付与部12Rが生成した中間経路表P1が参照される。そして、生成部14Rは、選択した中間辺の中間辺番号を中間経路表P1から取得して、S[i,j]の要素の値として格納する。
生成部14Rは、生成した最短経路行列Sを圧縮する。最短経路行列Sは、n画素×n画素の画像と同じデータ構造であるため、ロスレスの画像の圧縮アルゴリズムなどを用いて、圧縮することができる。生成部14Rは、圧縮した最短経路行列Sを、付与部12Rが生成した中間経路表P2と共に、行列データベース(DB)30Rに格納して、所定の記憶領域に記憶する。
なお、生成部14Rは、中間経路表P2も圧縮して、行列DB30Rに格納することもできる。中間経路表P2の圧縮には、既存の圧縮技術を用いることができる。例えば、インデクスとしてB−treeを使うのであれば、内部でキー順にソートされるので、キーのプレフィクスを圧縮することができる。また、どのような中間経路表にも使える単純な方法であるが、既存の情報圧縮技術を使って入出力におけるページ単位に圧縮することもできる。
復元部22Rは、始点及び終点を指定した最短経路の問い合わせを受け付けると、行列DB30Rに格納された最短経路行列S及び中間経路表P2を伸長を行いながら用いて、指定された始点及び終点に対応する頂点間の最短経路を復元する。
具体的には、指定された始点に対応する頂点がi(以下、「始点i」と表記する)、終点に対応する頂点がj(以下、「終点j」と表記する)の場合、すなわち、σ[i,j]を求める場合、復元部22Rは、最短経路行列Sから、S[i,j]の値k1を取得する。まず、S[i,j]の値が中間点番号である場合について説明する。σ[i,j]は、σ[i,k1]とσ[k1,j]との和(2つの最短経路を頂点k1で結合したもの)として求めることができる。復元部22Rは、σ[i,k1]についても、その中間点として、S[i,k1]の値k2を取得し、σ[i,k2]とσ[k2,k1]との和として求める。また、σ[k1,j]についても同様に、S[k1,j]の値k3を取得し、σ[k1,k3]とσ[k3,j]との和として求める。復元部22Rは、中間点で分割された最短経路が一つの経路として繋がるまで、上記の処理を再帰的に繰り返すことにより、全体の最短経路を求める。
また、復元部22Rは、S[i,j]から得られる値が中間辺の中間辺番号xの場合、中間経路表P2を参照して、P2[x]=(k1,k2)から、その中間辺の両端の頂点の頂点番号k1、k2を特定する。そして、復元部22Rは、σ[i,j]として、上記と同様に、σ[i,k1]とσ[k2,j]とを、辺(k1,k2)で結合することにより復元する。
なお、長さ2以上の最短経路σ[i,j]において、中間点kが始点i又は終点jに一致すると、最短経路を復元できなくなる。例えば、k=iの場合、σ[i,j]は、σ[i,i]とσ[i,j]との和ということになり、当初と同じσ[i,j]が出てきてしまい、再帰処理が進まないためである。k=jの場合も同様である。したがって、σ[i,j]が長さ2以上の最短経路の場合、始点i、及び終点jを中間点とすることはできない。また、σ[i,j]が長さ1の最短経路の場合、すなわち、始点iと終点jとが隣接している場合も上記と同様に、中間点kが始点iに一致すると、最短経路を求めることができなくなる。k=jの場合は、親の頂点番号を用いる場合と同様であるため、問題ない。したがって、σ[i,j]が長さ1の最短経路の場合、始点iを中間点とすることはできない。
次に、参考例に係る情報処理装置100Rの作用について説明する。まず、情報処理装置100RにグラフG(G=(V,E))が入力され、最短経路行列の生成が指示されると、情報処理装置100Rの最短経路行列生成部10Rにおいて、図6に示す最短経路行列生成処理が実行される。そして、最短経路行列が生成されて行列DB30Rに格納された状態で、最短経路σ[i,j]の探索要求を受け付けると、情報処理装置100Rの最短経路復元部20Rにおいて、図7に示す最短経路復元処理が実行される。以下、参考例における最短経路行列生成処理及び最短経路復元処理の各々について詳述する。
まず、図6に示す最短経路行列生成処理のステップS1で、付与部12Rが、入力されたグラフGに含まれる各頂点(1,・・・,n)間の最短経路を求める。そして、最短経路上の中間辺の各々に中間辺番号(n+1,n+2,・・・)を付与する。付与部12Rは、中間辺(k1,k2)と、その中間辺に付与した中間辺番号(x)とを対応付けて格納した中間経路表(P1[(k1,k2)]=x、P2[x]=(k1,k2))を生成する。
次に、ステップS2で、生成部14Rが、グラフに含まれる全頂点から全頂点への最短経路を表す行列の各要素の値を、以下の手順で求める。まず、生成部14Rは、σ[i,j]の中間点の頂点番号を、付与部12Rが求めた最短経路の情報から取得する。そして、生成部14Rは、取得した中間点の頂点番号から、最短経路行列の要素の値として用いる頂点番号又は中間辺を選択する。そして、中間辺を選択した場合は付与部12Rが生成した中間経路表P1から中間辺番号を取得し、選択した頂点番号又は中間辺番号をS[i,j]の要素の値として格納する。
次に、ステップS3で、生成部14Rが、生成した最短経路行列Sを圧縮して、付与部12Rが生成した中間経路表P2と共に、行列DB30Rに格納して、所定の記憶領域に記憶する。そして、最短経路行列生成処理は終了する。
次に、図7に示す最短経路復元処理について説明する。
ステップS6で、復元部22Rが、受け付けた最短経路σ[i,j]の問い合わせについて、行列DB30Rに格納された最短経路行列Sから、S[i,j]の値kを取得する。kが中間点の頂点番号の場合、復元部22Rは、σ[i,k]とσ[k,j]との和として、σ[i,j]を求める。kが中間辺の中間辺番号の場合、復元部22Rは、中間経路表P2からkに対応する中間辺(k1,k2)を特定する。そして、復元部22Rは、σ[i,k1]とσ[k2,j]とを、中間辺(k1,k2)で結合することにより、σ[i,j]を求める。復元部22Rは、σ[i,k]、σ[k,j]、σ[i,k1]、σ[k2,j]等についても、中間点又は中間辺で分割された最短経路が一つの経路として繋がるまで、ステップS6及びS7の処理を再帰的に繰り返す。これにより、復元部22Rは、全体の最短経路σ[i,j]を復元し、復元した最短経路σ[i,j]を出力して、最短経路復元処理を終了する。なお、最短経路行列や中間経路表P2にアクセスする際には伸長処理を行う。
<実施形態>
以下、図面を参照して開示の技術に係る実施形態の一例を詳細に説明する。なお、本実施形態において、参考例と共通する内容については、詳細な説明を省略する。
上述したように、本実施形態では、中間経路として、長さ2以上の経路を対象とする。この理由について、上記の参考例を参照しながら説明する。
参考例では、最短経路行列の要素の値として、最短経路上の中間点の頂点番号、又は中間辺の中間辺番号を用いる場合について説明した。この場合、最短経路の復元時に、最短経路行列(の要素)及び中間経路表へのアクセス回数が多くなる。最短経路行列及び中間経路表へのアクセスが多くなると、最短経路の復元処理に時間を要してしまう。
例えば、図2のグラフにおける最短経路σ[8,1]=[8,7,5,3,1]の例で説明する。最短経路行列の要素の値として、親の頂点番号のみを用いる場合は、S[8,1]に頂点8の親である頂点7の頂点番号「7」が格納されているため、次に、S[7,1]にアクセスする。S[7,1]には、「5」が格納されているため、次に、S[5,1]にアクセスし、S[5,1]には、「3」が格納されているため、次に、S[3,1]にアクセスする。S[3,1]には終点である「1」が格納されているため、最短経路σ[8,1]は、この時点で[8,7,5,3,1]であることがわかり、S[1,1]にアクセスする必要はない。すなわち、最短経路行列へのアクセス回数はS[8,1]、S[7,1]、S[5,1]、及びS[3,1]の4回である。最短経路行列の要素の値として親の頂点番号のみを用いる場合は、一般に、長さLの最短経路を求めるために必要な最短経路行列へのアクセス回数は、L回である。
最短経路行列の要素の値として中間点の頂点番号を用いる場合は、最短経路行列へのアクセス回数が、中間点を入れる毎に1回増えてしまう。例えば、S[8,1]=5であったとする。この場合、σ[8,1]=σ[8,5]+σ[5,1]と計算できる。σ[8,5]及びσ[5,1]については、親を順次辿る方法で求めるとする。その場合、σ[8,5]及びσ[5,1]のそれぞれについて2回、最短経路行列へのアクセスが必要になる。すなわち、最短経路行列へのアクセスが全体で5回必要で、上記の親の頂点番号のみを用いた場合に比べ、1回増えることになる。さらに、σ[8,5]及びσ[5,1]についても中間点を使った場合は、最短経路行列へのアクセスがそれぞれ1回増えるため、全体で3回増えることになる。このように、最短経路行列の要素の値として中間点を用いる場合は、中間点1個に対し、最短経路行列へのアクセス回数が1回増えることになる。
次に、最短経路行列の要素の値として中間辺の中間辺番号を用いる場合を考える。S[8,1]=9で、「9」は、中間辺(5,3)の中間辺番号であるとする。したがって、σ[8,1]=σ[8,5]+[5,3]+σ[3,1]と計算できる。ここまでで、最短経路行列へ1回、中間経路表へ1回アクセスを要している。σ[8,5]及びσ[3,1]は、親を順次辿る方法で求める場合、σ[8,5]について2回、σ[3,1]について1回の最短経路行列へのアクセスが必要になる。したがって、全体で、最短経路行列へのアクセスが4回、中間経路表へのアクセスが1回必要になる。すなわち、上記の親の頂点番号のみを用いた場合に比べ、中間経路表へのアクセスが1回分増える。
一方、中間経路として、長さが2以上の経路を考える。S[8,1]=10で、「10」は、長さが2以上の[7,5,3]という中間経路を表しているものとする。したがって、σ[8,1]=σ[8,7]+[7,5,3]+σ[3,1]と計算できる。ここまでで、最短経路行列へ1回、中間経路表へ1回アクセスを要している。σ[8,7]及びσ[3,1]は、親を順次辿る方法で求める場合、σ[8,7]に1回、σ[3,1]に1回の最短経路行列へのアクセスが必要になる。したがって、全体で、最短経路行列へのアクセスが3回、中間経路表へのアクセスが1回必要になる。すなわち、上記の親の頂点番号のみを用いた場合に比べ、最短経路行列へのアクセスが1回減ったものの、中間経路表へのアクセスが1回増えたことになる。
最短経路行列へのアクセスと中間経路表へのアクセスとは、処理負荷が同じとは限らない。圧縮率の違いやデータの並びにより入出力回数が異なったり、CPUの処理負荷が異なったりする可能性があるためである。最短経路行列へのアクセスの方が、中間経路表へのアクセスより処理負荷が重い場合、中間経路長が2以上であれば、最短経路行列の要素の値として中間経路を用いる方が、親の頂点番号のみを用いる場合よりも高速に最短経路行列を復元できることになる。
一方、最短経路行列のアクセスの方が、処理負荷が軽い場合は、中間経路長が2以上のある整数以上であれば、親の頂点番号のみを用いる場合よりも高速に最短経路行列を復元可能になる値があると考えられる。そこで、本実施形態では、この値を「最小中間経路長(Lmin)」とし、中間経路長がLmin以上の中間経路の識別情報(以下、「中間経路番号」という)のみを、最短経路行列の要素の値として用いる場合について説明する。なお、本実施形態では、Lmin=2として説明する。
また、最短経路行列に用いる中間経路が長いほど、最短経路の復元時の最短経路行列へのアクセス回数は減る。しかし、逆に中間経路を長くすれば、アクセス回数が減るとは限らない。その長い中間経路を含む最短経路はそう多くないはずだからである。このように中間経路長とアクセス回数との関係は一概には言えないが、中間経路表のサイズとアクセス回数との間にはトレードオフの関係があることが予想される。すなわち、中間経路表のサイズが大きくなればアクセス回数が減り、逆に中間経路表のサイズが小さくなればアクセス回数が増える傾向があると予想される。極端な例では、最短経路行列へのアクセス回数を最小化する場合には、全ての最短経路を中間経路表で管理すれば、最短経路行列へのアクセス回数は1回で済む。しかし、この場合、中間経路表のサイズは膨大なものになる。一方、中間経路表のサイズを最小化する場合には、中間経路を中間経路表に持たせなければよい。しかし、この場合、親の頂点番号のみを用いる場合と同じ回数の最短経路行列へのアクセス回数が必要になる。
したがって、中間経路表のサイズをできるだけ小さく保ちながら、最短経路行列へのアクセス回数をできるだけ削減できるように調整できることが望ましい。本実施形態では、このような調整も可能とする場合について説明する。
まず、本実施形態の概要を以下に示す。各項目の詳細については後述する。
(1)グラフをクラスタリングすると共に、切断点を求める。
(2)頂点クラスタ対応表、及び中間経路表を生成する。
(3)長さが最小中間経路長(Lmin)以上の中間経路の中間経路番号を用いて最短経路行列を生成する。
(4)最短経路行列及び中間経路表P2を圧縮する。
上述のように、中間経路の長さは、中間経路表のサイズをできるだけ小さく保ちながら、最短経路行列へのアクセス回数をできるだけ削減できるように調整する必要がある。上記(1)に示すように、グラフをクラスタリングするのはこのためである。クラスタリングの結果、グラフは、切断辺で連結された複数のクラスタに分割される。なお、切断辺とは、辺の一端の頂点と他端の頂点とが、異なるクラスタに属する辺である。また、切断辺の両端の頂点を切断点という。そして、各クラスタの切断点を始点及び終点とし、そのクラスタ内に含まれる頂点だけからなる最小中間経路長Lmin以上の最短経路を、中間経路として用いる。
図8に示すように、本実施形態に係る情報処理装置100は、付与部12及び生成部14を含む最短経路行列生成部10と、復元部22を含む最短経路復元部20とを含む。最短経路行列生成部10は、開示の技術の最短経路行列生成装置の一例であり、付与部12は、開示の技術の付与部の一例であり、生成部14は、開示の技術の生成部の一例である。
付与部12は、入力されたグラフを、指定された数の部分グラフに分割(クラスタリング)する。クラスタリングの手法としては、従来既知の手法を用いることができる。そして、付与部12は、各部分グラフについて、その部分グラフに含まれる頂点を用いて表され、かつ切断点を始点及び終点とする経路を中間経路とし、その中間経路に中間経路番号を付与する。
具体的には、付与部12は、全体のグラフをG=(V,E)とし、1≦i≦pとして、以下に示すように、グラフGを、Viと、両端がViに含まれる頂点からなる辺の集合Eiとからなる部分グラフGi=(Vi,Ei)の列G1,G2,・・・,Gpに分割する。
Gi=(Vi,Ei)
Ei={(v1,v2)∈E|v1,v2∈Vi}
このように、1つのグラフを複数のグラフに分割することは、上述のように、「クラスタリング」と呼ばれ、各連結部分グラフGi(i=1,2,・・・,p))は「クラスタ」と呼ばれる。また、以下では、pを「クラスタ数」という。このクラスタリングにより、グラフGをp個の互いに重複がない連結部分グラフに分割でき、かつ切断点が求められたことになる。各部分グラフGiは連結しているものとする。
なお、無向グラフの部分グラフ内の任意の2頂点について、一方から他方への経路がある場合、その部分グラフは連結であるといい、連結している部分グラフを連結部分グラフと呼ぶ。
グラフを分割する際には、上述のように、中間経路表のサイズをできるだけ小さく保ちながら、最短経路行列へのアクセス回数をできるだけ削減できるように調整することを考慮して、次の2つの要求がなるべく満たされるような制約条件を設定する。
1)各Viに含まれる頂点の数は均等
2)切断辺の数が少ない
なお、辺e=(v1,v2)が2つのグラフG1=(V1,E1)とG2=(V2,E2)と に跨っている、すなわち、v1∈V1、v2∈V2である場合、頂点v1及びv2が「切断点」であり、辺eが「切断辺」である。すなわち、切断辺の数が少ないとは、p個の部分グラフG1,G2,・・・,Gpに跨る辺、すなわち、どのGiにも含まれない辺の数が少ないことを意味する。
また、付与部12は、前述のように、各クラスタGi内の切断点を始点及び終点とし、Gi内に含まれる頂点のみからなる最小中間経路長Lmin以上の最短経路を、中間経路として用いる。
pの値によってクラスタが決まり、中間経路も決まるため、中間経路を管理する中間経路表の大きさが決まる。pの値は、グラフ全体の大きさに基づいて適切な値に設定しておくことができる。ただし、適切な値に設定するため、以下に述べるような注意が必要である。例えば、pを大きくしてnに近づければ、中間経路の平均長は小さくなるため、最短経路行列へのアクセス回数は増えるように思われるが、中間経路を使える最短経路が増え、逆にアクセス回数は減る可能性もある。その場合は、前述のように、中間経路表のサイズは大きくなると予想される。逆に、pを小さくすれば、中間経路の平均長は大きくなるため、最短経路行列へのアクセス回数は減るようにも思われるが、中間経路を使える最短経路は少なくなり、逆にアクセス回数は増える可能性もある。その場合は、中間経路表のサイズは小さくなると予想される。このように、トレードオフの関係にあると予想される最短経路行列へのアクセス回数と中間経路表のサイズは、pを変動させることで変わる。上述のようにその動きがpと平均中間経路長の間の関係のようには予測できない面はあるものの、少なくともpの値を1からnまでの間の適当な範囲で変動させることで、ユーザに最適と思われるバランスに調整することが可能である。
また、付与部12は、各頂点がいずれのクラスタに属するかを示す頂点クラスタ対応表を生成する。例えば、付与部12は、頂点番号iをキーとし、頂点iが属するクラスタGkの番号kを値とするインデクス付表で、頂点クラスタ対応表Cを生成する。本実施形態では、インデクス付表Tにおいて、キーxに対する値をT[x]と表す。したがって、頂点クラスタ対応表Cの場合、キーiに対する頂点クラスタ対応表Cの値をC[i]で表す。すなわち、C[i]=kである。なお、インデクス付表とは、例えば、主記憶上のハッシュ表や二分木、又は二次記憶上のB−treeやハッシュ表のように、キーからインデクスを使って値に直接アクセスできる表をいう。
また、付与部12は、最短経路σ[i,j]上に、[k1,k2,・・・,kL+1](2≦L)という中間経路、すなわち長さLのσ[k1,kL+1]という中間経路があれば、その中間経路に中間経路番号を付与して、中間経路表で管理する。[k1,k2,・・・,kL+1]という中間経路の情報を中間経路表で管理することで、参考例における中間辺の辺番号と同様に、最短経路行列の要素の値として用いることができる。また、この長さLの中間経路の中間経路番号を最短経路行列の要素の値とすることで、最短経路行列へのアクセス回数をL−1回減らすことが可能となる。
付与部12は、中間経路表として、最短経路行列で用いる中間経路を管理する中間経路表P1、及び中間経路表P2を生成する。中間経路表P1は、最短経路行列の生成時に、各中間経路に付与された中間経路番号を参照する際に使用される。中間経路表P2は、最短経路の復元時に、最短経路行列で用いられている中間経路番号が示す中間経路を特定する際に使用される。例えば、付与部12は、中間経路表P1及びP2の各々をインデクス付表で生成することができる。
具体的には、付与部12は、中間経路の始点をi、終点をjとすると、中間経路表P1のキーをiとjとのタプル(i,j)とし、(i,j)のiを「start」、jを「end」と定義する。これにより、中間経路表P1において、key=(i,j)とした場合、iの値はkey.start、jの値はkey.endで参照できるものとする。付与部12は、始点i及び終点jの中間経路に中間経路番号を付与し、その中間経路番号をP1[(i,j)]の値として格納することで、中間経路表P1を生成する。
また、中間経路を[i1,i2,・・・,ih]とし、この中間経路の中間経路番号をunoとすると、付与部12は、中間経路表P2のキーをunoとし、P2[uno]の値として[i1,i2,・・・,ih]を格納することで、中間経路表P2を生成する。[i1,i2,・・・,ih]は、頂点i1、i2、・・・、及びihからなるリストである。
より具体的には、付与部12は、各クラスタGk(k=1,2,・・・,p)について、Gk内の切断点間の最短経路を、既存の最短経路を求めるアルゴリズムを用いて求める。例えば、以下に述べる幅優先探索アルゴリズムを、全点から全点への最短経路を求めるのではなく、切断点を出発点として、全ての切断点に到達した時点で終了するようなアルゴリズムにすることで求めることが可能である。
例えば、付与部12は、全頂点の数をnとした場合、求めた各中間経路にn+1から順に中間経路番号を付与し、各中間経路と対応付けて、中間経路表P1及びP2に登録する。なお、中間経路表P1及びP2のサイズを小さくするため、中間経路表P1のキー(i,j)は、i<jを満たすものとする。キー(j,i)に対応する中間経路であって、キー(i,j)に対応する中間経路の逆順の中間経路は、中間経路表P1に格納しない。始点をj、終点をiとする中間経路については、P1[(i,j)]を利用する。同様に、中間経路表P2についても、中間経路番号unoの中間経路を[i1,i2,・・・,ih]とした場合、i1<ihを満たす中間経路のみを格納する。[ih,ih−1,・・・,i1]については、P2[uno]=[i1,i2,・・・,ih]の順序を逆転させて利用する。なお、逆転したものであることを示すために、後述のように中間経路番号unoを反転した値を最短経路行列の値として用いる。
生成部14は、中間経路表P1で管理されている中間経路を用いて、参考例における生成部14Rと同様に、最短経路行列Sを生成する。
ここで、本実施形態における最短経路行列の生成方式は、既存の全頂点から全頂点への最短経路を求めるアルゴリズム、具体的には、幅優先探索アルゴリズムに修正を加えたものである。そのため、本実施形態における最短経路行列の生成方式の理解を容易にするために、まず、幅優先探索アルゴリズムによる最短経路行列の生成について説明する。この方式では、最短経路行列の要素には、親の頂点番号が格納される。
まず、頂点j毎に、その頂点に隣接する頂点の頂点番号のリスト(以下、「隣接頂点リスト」という)A[j]が与えられているものとする。例えば、頂点jに隣接する頂点がk1及びk2であれば、A[j]=[k1,k2]である。そして、図9に示す幅優先探索アルゴリズムで詳述するように、頂点jからの距離が0、1、2、・・・である頂点を同心円状に順に求めていく。この同心円的な振る舞いの様子を図10に示す。図10は、頂点1、頂点2、頂点3、頂点4、及び頂点5を含むグラフで、頂点1を根とした場合の例である。なお、図10に示すグラフにおいて、実線で示す辺は、幅優先探索アルゴリズムで最短経路として辿った辺であり、破線で示す辺は最短経路として辿らなかった辺を示している。
具体的には、図9に示す幅優先探索アルゴリズムのS1001で、n行n列の空の最短経路行列Sを用意し、最短経路行列Sにおける処理対象の列、すなわち、求める最短経路の終点を特定するための変数jに1を設定する。
次に、ステップS1002で、jがグラフに含まれる頂点の個数n以下か否かを判定する。j≦nの場合には、ステップS1003で、頂点jからの距離を示す変数dに0を設定し、頂点jからの距離がdの同心円上に存在する頂点のリストR[d]にjを格納する。また、求める最短経路の始点を特定するための変数iに1を設定する。
次に、ステップS1004で、iがn以下か否かを判定する。i≦nの場合には、ステップS1005で、S[i,j]に初期値として「I」を格納する。最短経路行列Sの要素S[i,j]には、頂点iから頂点jへの最短経路における頂点iの親の頂点番号を格納していくが、初期値としては、最短経路の探索において、頂点iが未だ辿られていないことを示す値I(Initialの意)を格納しておくものである。
次に、ステップS1006で、iを1インクリメントしてステップS1004に戻る。ステップS1004で、i>nと判定されると、ステップS1007で、S[j,j]に最短経路の終点を示す値(ここでは、「E」)を設定する。
次に、ステップS1008で、R[d]が空か否かを判定し、空ではない場合には、ステップS1009へ移行する。ステップS1009では、dを1インクリメントし、R[d]を空のリスト([ ])で初期化する。
次に、ステップS1010で、R[d−1]に本ステップ以降の処理が未処理の頂点iが存在するか否かを判定する。未処理の頂点iが存在する場合には、ステップS1011へ移行し、未処理の頂点iが存在しない場合には、ステップS1008に戻る。
ステップS1011では、R[d−1]から未処理の頂点iを1つ選択し、その頂点iの隣接頂点リストA[i]に本ステップ以降の処理が未処理の頂点kが存在するか否かを判定する。未処理の頂点kが存在する場合には、処理はステップS1012へ移行し、未処理の頂点kが存在しない場合には、処理はステップS1010に戻る。
ステップS1012では、A[i]から未処理の頂点kを1つ選択し、S[k,j]がI、すなわち初期値か否かを判定する。S[k,j]=Iの場合には、ステップS1013へ移行し、S[k,j]≠Iの場合には、ステップS1011に戻る。
ステップS1013では、最短経路行列SのS[k,j]に、上記ステップS1011で選択した頂点の頂点番号iを格納する。また、R[d]に、上記ステップS1012で選択した頂点の頂点番号kを追加する。すなわち、頂点jから距離dの位置にある頂点であることが判明した頂点の頂点番号を、R[d](d=0,1,2,・・・)に格納していく。そして、ステップS1011に戻る。
上記ステップS1008で、R[d]が空であると判定されると、ステップS1014で、jを1インクリメントして、ステップS1002に戻る。そして、j>nと判定されると、幅優先探索アルゴリズムは終了する。
上記の処理を、図10に示すグラフを例に、より具体的に説明する。
j=1の場合において、ステップS1002〜S1007の処理までが終了すると、最短経路行列Sは、図11のS−1に示すように、j=1についての初期状態となる。このとき、R[d=0]=[1]であるので、ステップS1009に進み、R[d=0+1]=[ ]となる。R[d−1=0]には「1」が格納されており、A[i=1]=[k=2,3]である。まず、ステップS1012で、k=2が選択されたとすると、ステップS1013で、S[k=2,j=1]=1が格納され、R[d=1]=[2]となる。そして、ステップS1011に戻って、k=3が選択され、ステップS1013で、S[k=3,j=1]=1が格納され、R[d=1]=[2,3]となる。
この段階で、A[i]に未処理の頂点kが存在しなくなり、また、R[d−1]に未処理の頂点iが存在しなくなるため、ステップS1008に戻る。このとき、R[d=1]=[2,3]であるので、ステップS1009に進み、R[d=1+1]=[ ]となる。R[d−1=1]には2及び3が格納されている。まず、ステップS1011で、i=2が選択されたとすると、A[i=2]=[k=1,3,4,5]である。まず、ステップS1012で、k=1が選択されたとすると、S[k=1,j=1]=E≠Iであるため、ステップS1011に戻る。次に、k=3が選択されたとすると、S[k=3,j=1]=1≠Iであるため、ステップS1011に戻る。次に、k=4が選択されたとすると、S[k=4、j=1]=Iであるため、ステップS1013で、S[k=4,j=1]=2が格納され、R[d=2]=[4]となる。そして、ステップS1011に戻って、k=5が選択され、ステップS1013で、同様にS[k=5,j=1]=2が格納され、R[d=2]=[4,5]となる。
次に、ステップS1010に戻って、R[d−1]に未処理の頂点3が存在するため、ステップS1011で、i=3が選択される。A[i=3]=[k=1,2]であり、ステップS1012で、k=1,2のいずれが選択された場合も、S[k=1or2,j=1]≠Iであるため、ステップS1010を経由してステップS1008に戻る。
このとき、R[d=2]=[4,5]であるので、ステップS1009に進み、R[d=2+1]=[ ]となる。R[d−1=2]には4及び5が格納されており、まず、ステップS1011で、i=4が選択されたとすると、A[i=4]=[k=2,5]である。ステップS1012で、k=2,5のいずれが選択された場合も、S[k=2or5,j=1]≠Iであるため、ステップS1010に戻る。ステップS1011で、i=5が選択され、A[i=5]=[k=2,4]である。ステップS1012で、k=2,4のいずれが選択された場合も、S[k=2or4,j=1]≠Iであるため、ステップS1010を経由してステップS1008に戻る。
このとき、R[d=3]は空であるため、j=1についての処理は終了する。この段階での最短経路行列Sは、図11のS−2に示す状態となる。j=2,3,4,5についても同様に処理し、j=5についての処理終了時には、最短経路行列Sは、図11のS−3に示す状態となる。
上記の幅探索アルゴリズムを踏まえて、本実施形態における最短経路行列の生成について説明する。本実施形態における最短経路行列の生成では、上記の幅優先探索アルゴリズムに、次のように変更を加える。
幅優先探索アルゴリズムにおいて、頂点jから距離dの位置にある頂点の頂点番号iが格納されるリストR[d]について、R[d]に格納される要素として、頂点番号iだけでなく、頂点iの状態に関する情報mを格納する。すなわち、本実施形態では、R[d]は、タプル(i,m)のリストである。ここでいう頂点iの状態に関する情報mとは、頂点iから頂点jへの最短経路上の中間経路を見つける過程における頂点iの状態を示す情報である。
本実施形態では、mをm=(state,uno,len)という3つの要素からなるタプルとして定義する。state、uno、及びlenの各要素は、それぞれm.state、m.uno、及びm.lenで参照可能であるとする。m.stateは、頂点iの状態を表す(詳細は後述)。m.unoは、中間経路の終点となる切断点の頂点番号、又は中間経路の中間経路番号である。m.lenは、中間経路の長さを表す。m.stateは、辿ってきた経路の現時点での状態を番号で表すものである。m.stateに用いられる番号と、その意味とを以下に示す。
NP:頂点iが最短経路探索の出発点と同じクラスタ内にいて、未だ中間経路に遭遇していない。
IP:頂点iが最短経路探索の出発点と別のクラスタ内にいて、未完結の中間経路又は中間経路になる可能性のある経路に遭遇。
CP:長さが最小中間経路長Lmin以上の完結した中間経路に遭遇。
中間経路が完結とは、最短経路の探索が、経路が長さがLmin以上の中間経路を経由して、その中間経路とは別のクラスタに移り、その中間経路がさらに延長されないことが確定したことを意味する。逆に、未完結とは、経路上で中間経路には遭遇しているが、その中間経路があるクラスタから他のクラスタに移っていないため、その中間経路が完結していなくて、さらに伸びる可能性があることを意味する。
m.stateの値としては、例えば、NP、IP、及びCPの各々に、NP<IP<CPとなる番号、例えば、0、1、2を割り当てる。なお、NPはNo Path、IPはIncomplete Path、CPはComplete Pathの略である。以下では、説明を分かり易くするため、0、1、2等の番号ではなく、NP、IP、及びCPの記号を用いて説明する。
mの各要素は、m.stateの値に応じて、以下に示す値をとる。
NPの場合 (NP,None,None)
IPの場合 (IP,u,len)
CPの場合 (CP,u,len)
Noneはオブジェクトがないことを意味する定数である。IPの場合、uは中間経路になる可能性のある経路の終点の頂点番号、lenはその経路の頂点iから終点uまでの長さである。CPの場合、uは完結した中間経路の中間経路番号、lenはその中間経路の長さであり、Lmin≦lenである。
生成部14は、上記のmを更新しながら幅優先探索により最短経路を求め、その最短経路上で経由する頂点の頂点番号、又は中間経路の中間経路番号を最短経路行列の対応する要素に格納することにより、最短経路行列Sを生成する。生成部14は、生成した最短経路行列Sを、付与部12が生成した中間経路表P2と共に圧縮して行列DB30に格納する。
復元部22は、始点及び終点を指定した最短経路の問い合わせを受け付けると、行列DB30に格納された最短経路行列S及び中間経路表P2を用いて、指定された始点及び終点に対応する頂点間の最短経路を復元する。
情報処理装置100は、例えば図12に示すコンピュータ40で実現することができる。コンピュータ40は、Central Processing Unit(CPU)41、一時記憶領域としてのメモリ42、及び不揮発性の記憶部43を備える。また、コンピュータ40は、入出力装置44、記憶媒体49に対するデータの読み込み及び書き込みを制御するRead/Write(R/W)部45、及びインターネット等のネットワークに接続される通信interface(I/F)46を備える。CPU41、メモリ42、記憶部43、入出力装置44、R/W部45、及び通信I/F46は、バス47を介して互いに接続される。
記憶部43はHard Disk Drive(HDD)、Solid State Drive(SSD)、フラッシュメモリ等によって実現できる。記憶媒体としての記憶部43には、コンピュータ40を情報処理装置100として機能させるための最短経路行列生成プログラム50及び最短経路復元プログラム60が記憶される。最短経路行列生成プログラム50は、付与プロセス52と、生成プロセス54とを有する。最短経路復元プログラム60は、復元プロセス62を有する。また、記憶部43は、行列DB30を構成する情報が記憶される情報記憶領域70を有する。
CPU41は、最短経路行列生成プログラム50及び最短経路復元プログラム60の各々を記憶部43から読み出してメモリ42に展開し、最短経路行列生成プログラム50及び最短経路復元プログラム60が有するプロセスを順次実行する。
CPU41は、付与プロセス52を実行することで、図8に示す付与部12として動作する。また、CPU41は、生成プロセス54を実行することで、図8に示す生成部14として動作する。また、CPU41は、復元プロセス62を実行することで、図8に示す復元部22として動作する。また、CPU41は、情報記憶領域70から情報を読み出して、例えば、行列DB30の必要な情報をメモリ42に展開すると共に、メモリ42の必要な情報を情報記憶領域70に書き出す。これにより、最短経路行列生成プログラム50及び最短経路復元プログラム60の各々を実行したコンピュータ40が、情報処理装置100として機能することになる。なお、プログラムを実行するCPU41はハードウェアである。
なお、最短経路行列生成プログラム50及び最短経路復元プログラム60により実現される機能は、例えば半導体集積回路、より詳しくはApplication Specific Integrated Circuit(ASIC)等で実現することも可能である。
次に、本実施形態に係る情報処理装置100の作用について説明する。まず、情報処理装置100にグラフG(G=(V,E))が入力され、最短経路行列の生成が指示されると、情報処理装置100の最短経路行列生成部10において、図13に示す最短経路行列生成処理が実行される。最短経路行列生成処理は、開示の技術の最短経路行列生成方法の一例である。そして、最短経路行列が生成されて行列DB30に格納された状態で、最短経路σ[i,j]の問い合わせを受け付けると、情報処理装置100の最短経路復元部20において、図21に示す最短経路復元処理が実行される。以下、本実施形態における最短経路行列生成処理及び最短経路復元処理の各々について詳述する。
まず、図13に示す最短経路行列生成処理のステップS10で、付与部12が、1)各Viに含まれる頂点の数は均等、及び、2)切断辺の数が少ない、という制約下で、グラフGをp個にクラスタリングする。
次に、ステップS20で、表生成処理が実行される。ここで、図14を参照して、表生成処理について詳述する。
ステップS21で、付与部12が、クラスタの番号を示す変数kに1を設定する。また、付与部12が、初期状態の頂点クラスタ対応表Cとして、空のインデクス付表を作成する。
次に、ステップS22で、付与部12が、kが、上記ステップS10で分割されたクラスタ数p以下か否かを判定する。k≦pの場合には、処理はステップS23へ移行する。
ステップS23では、付与部12が、クラスタGkに本ステップ以降の処理が未処理の頂点iが含まれるか否かを判定する。未処理の頂点iが含まれる場合には、処理はステップS24へ移行する。
ステップS24では、付与部12が、未処理の頂点iを1つ選択して、頂点クラスタ対応表のC[i]の値としてkを格納して、処理はステップS23に戻る。クラスタGkに未処理の頂点が存在しなくなると、処理はステップS25へ移行し、付与部12が、kを1インクリメントして、処理はステップS22に戻る。ステップS22で、k>pと判定されると、処理はステップS26へ移行する。
ステップS26では、付与部12が、中間経路番号を示す変数uに、頂点の個数(頂点番号の最大値)nを設定する。また、付与部12が、初期状態の中間経路表P1、P2の各々として、空のインデクス付表を作成する。さらに、付与部12が、クラスタの番号を示す変数kに1を設定する。
次に、ステップS27で、付与部12が、kがクラスタ数p以下か否かを判定する。k≦pの場合は、処理はステップS28へ移行する。ステップS28では、付与部12が、クラスタGkの切断点を始点及び終点とし、クラスタGkに含まれる頂点のみを通る最短経路を中間経路として求め、中間経路の集合Pを生成する。なお、中間経路の始点をi1、終点をihとした場合、i1<ihを満たす中間経路のみを生成する。中間経路となる最短経路の求め方としては、例えば、上述した幅優先探索アルゴリズムを用いることができる。
次に、ステップS29で、付与部12が、中間経路の集合Pに、本ステップ以降の処理が未処理の中間経路[i1,i2,・・・,ih]が存在するか否かを判定する。未処理の中間経路が存在する場合には、処理はステップS30へ移行する。
ステップS30では、付与部12が、uを1インクリメントし、中間経路表P1のP1[(i1,ih)]の値としてuを格納し、中間経路表P2のP2[u]の値として[i1,i2,・・・,ih]を格納して、処理はステップS29に戻る。中間経路の集合Pに未処理の中間経路が存在しなくなると、処理はステップS31へ移行し、付与部12が、kを1インクリメントして、処理はステップS27に戻る。ステップS27で、k>pと判定されると、表生成処理は終了し、最短経路行列生成処理(図13)に戻る。
次に、最短経路行列生成処理のステップS40で、行列生成処理が実行される。ここで、図15を参照して、行列生成処理について詳述する。
ステップS41で、生成部14が、n行n列の空の最短経路行列Sを用意し、最短経路行列Sにおける処理対象の列、すなわち、求める最短経路の終点を特定するための変数jに1を設定する。
次に、ステップS42で、生成部14が、jがグラフに含まれる頂点の個数n以下か否かを判定する。j≦nの場合には、ステップS43で、生成部14が、頂点クラスタ対応表CからC[j]の値を取得して、変数cに設定し、頂点jからの距離を示す変数dに0を設定する。また、生成部14が、頂点jからの距離がdの同心円上に存在する頂点の頂点番号i、及び頂点iの状態を示す情報mのタプル(i,m)のリストR[d]に(j,(NP,None,None))を格納する。さらに、生成部14が、求める最短経路の始点を特定するための変数iに1を設定する。
次に、ステップS44〜S47で、上述の幅優先探索アルゴリズム(図9)のステップS1004〜S1007と同様に、最短経路行列Sの要素S[i,j](i=1,2,・・・,n)に初期値「I」、S[j,j]に終点を示す値「E」を設定する。
次に、ステップS48で、生成部14が、R[d]が空か否かを判定し、空ではない場合には、ステップS49へ移行する。ステップS49では、生成部14が、dを1インクリメントし、R[d]を空のリスト([ ])で初期化する。
次に、ステップS50で、生成部14が、R[d−1]に本ステップ以降の処理が未処理のタプル(i,m)が存在するか否かを判定する。未処理のタプル(i,m)が存在する場合には、処理はステップS51へ移行し、未処理のタプル(i,m)が存在しない場合には、処理はステップS48に戻る。
ステップS51では、生成部14が、R[d−1]から未処理のタプル(i,m)を1つ選択し、頂点iの隣接頂点リストA[i]に本ステップ以降の処理が未処理の頂点kが存在するか否かを判定する。未処理の頂点kが存在する場合には、処理はステップS52へ移行し、未処理の頂点kが存在しない場合には、処理はステップS50に戻る。
ステップS52では、生成部14が、A[i]から未処理の頂点kを1つ選択し、S[k,j]がI、すなわち初期値か否かを判定する。S[k,j]=Iの場合には、ステップS60へ移行し、S[k,j]≠Iの場合には、ステップS51に戻る。
ステップS60では、生成部14が、最短経路を頂点iから頂点kに辿った場合における頂点kとその状態を示す情報m’のタプル(k,m’)を取得するための(k,m’)取得処理を実行する。ここで、図16を参照して、(k,m’)取得処理について説明する。
ステップS61で、生成部14が、上記ステップS51で選択したタプル(i,m)のm.stateがNPか否かを判定する。m.state=NPの場合には、処理はステップS62へ移行し、m.state≠NPの場合には、処理はステップS65へ移行する。
ステップS62では、生成部14が、頂点クラスタ対応表CのC[k]の値が、上記ステップS43で設定したcの値と同じか否かを判定する。すなわち、生成部14は、頂点kが属するクラスタが、頂点jが属するクラスタと同じか否かを判定する。C[k]=cの場合には、生成部14は、頂点kは、最短経路探索の出発点である頂点jと同じクラスタに存在しており、未だ中間経路表P1で管理されている中間経路に遭遇していないと判断する。そこで、処理はステップS63へ移行し、生成部14が、上記ステップS51で選択したタプル(i,m)のmを、m’に設定し、処理はステップS76へ移行する。
一方、C[k]≠cの場合には、生成部14は、頂点kは、頂点jが属するクラスタとは別のクラスタに移ったと判断する。すなわち、頂点kは、別のクラスタの切断点であり、中間経路となり得る経路の終点である。そこで、処理はステップS64へ移行し、生成部14が、m’に(IP,k,0)を設定し、処理はステップS76へ移行する。
ステップS65では、生成部14が、上記ステップS51で選択したタプル(i,m)のm.stateがIPか否かを判定する。m.state=IPの場合には、処理はステップS66へ移行し、m.state≠IPの場合には、生成部14は、m.stateはCPであると判断し、処理はステップS63へ移行する。
ステップS66では、生成部14が、頂点クラスタ対応表CのC[k]の値が、C[m.uno]の値と同じか否かを判定する。m.unoは、上記ステップS51で選択されたタプル(i,m)のm.unoの要素である。C[k]=C[m.uno]の場合には、処理はステップS67へ移行する。
ステップS67では、生成部14が、頂点kは頂点iと同じクラスタ内に存在すると判断し、m’を、mが表す頂点iの状態から、中間経路長を1延長させた値に変更する。すなわち、生成部14は、m’に(IP,m.uno,m.len+1)を設定し、処理はステップS76へ移行する。
上記ステップS66で、C[k]≠C[m.uno]と判定される場合、頂点kは、頂点iとは異なるクラスタへ移ったこと、すなわち、m.unoを終点とする中間経路が頂点iを始点として完結したことを表す。そこで、処理はステップS68へ移行し、生成部14が、頂点iと頂点m.uno間の中間経路長m.lenが最小中間経路長Lmin以上か否かを判定する。Lmin≦m.lenの場合には、処理はステップS69へ移行する。
ステップS69では、生成部14が、iがm.unoよりも小さいか否かを判定する。i<m.unoの場合には、処理はステップS70へ移行し、生成部14が、中間経路表P1からP1[(i,m.uno)]の値、すなわち、始点がi、終点がm.unoである中間経路の中間経路番号を取得し、その値を変数unoに設定する。一方、i≧m.unoの場合には、処理はステップS71へ移行し、生成部14が、中間経路表P1からP1[(m.uno,i)]の値を取得して、その値の符号を反転させる。すなわち、生成部14は、始点がm.uno、終点がiである中間経路の中間経路番号にマイナスを付与した値を、始点がi、終点がm.unoの中間経路の中間経路番号とし、変数unoに設定する。
次に、ステップS72で、生成部14が、m’を、頂点iで中間経路が完結したことを表す値に変更する。すなわち、生成部14は、m’に(CP,uno,m.len)を設定し、処理はステップS76へ移行する。
一方、上記ステップS68で、Lmin>m.lenと判定された場合には、生成部14は、完結した中間経路は、中間経路表P1で管理されている中間経路ではないため、未だ中間経路に遭遇していない状態であるとみなし、処理はステップS73へ移行する。
ステップS73では、生成部14が、C[k]=cか否かを判定する。C[k]=cの場合には、生成部14は、頂点kは、最短経路探索の出発点である頂点jと同じクラスタに存在しており、未だ中間経路表P1で管理されている中間経路に遭遇していないと判断する。そこで、処理はステップS74へ移行し、生成部14が、m’に(NP,None,None)を設定し、処理はステップS76へ移行する。
一方、C[k]≠cの場合には、処理はステップS75へ移行し、生成部14は、上記ステップS64と同様に、m’に(IP,k,0)を設定し、処理はステップS76へ移行する。
ステップS76では、生成部14が、m’.stateがCPか否かを判定する。m’.state=CPの場合、頂点kの状態は、IPからCPへ変わったか、又は元々CPであったことを表す。そこで、処理はステップS77へ移行し、ステップS77で、生成部14が、S[k,j]の値にm’.uno、すなわち、上記ステップS70又はS71で取得した中間経路番号を格納する。
一方、m’.state≠CPの場合には、処理はステップS78へ移行し、生成部14が、S[k,j]の値に、頂点kの親の頂点番号iを格納する。そして、生成部14は、タプル(k,m’)を返し、処理は行列生成処理(図15)に戻る。
次に、ステップS80で、生成部14が、(k,m’)取得処理から返されたタプル(k,m’)をリストR[d]に追加し、処理はステップS51に戻る。
上記ステップS48で、R[d]が空であると判定されると、処理はステップS81へ移行し、生成部14が、jを1インクリメントして、処理はステップS42に戻る。そして、ステップS42で、j>nと判定されると、行列生成終了は終了し、処理は最短行列生成処理(図13)に戻る。
次に、ステップS90で、参考例における最短経路行列生成処理(図6)のステップS3と同様に、生成した最短経路行列S、及び付与部12が生成した中間経路表P2を圧縮し、行列DB30に格納して、所定の記憶領域に記憶する。そして、最短経路行列生成処理は終了する。
上記の最短経路行列生成処理について、特に行列生成処理を中心に、図17に示す単純な線状のグラフを用いて、具体的に説明する。
図17に示すグラフに含まれる頂点の個数nは、n=10である。分割数(クラスタ数)p=4として、例えば、図18に示すようにグラフがクラスタリングされたものとする。なお、図18において、破線で示す辺が切断辺である。すなわち、頂点の集合Vは次のように分割される。
V1=[1,2]、 V2=[3,4,5]、
V3=[6,7,8]、 V4=[9,10]
V1、V2、V3、及びV4はそれぞれクラスタ(連結部分グラフ)G1、G2、G3、及びG4に含まれる。G1とG2との間の切断辺は(2,3)であり、G2とG3との間の切断辺は(5,6)であり、G3とG4との間の切断辺は(8,9)であり、切断点は2、3、5、6、8、及び9である。したがって、頂点クラスタ対応表Cは、次のように生成される。
C[1]=1、 C[2]=1、
C[3]=2、 C[4]=2、 C[5]=2、
C[6]=3、 C[7]=3、 C[8]=3、
C[9]=4、 C[10]=4
また、中間経路表P1、及び中間経路表P2は、次のように生成される。
P1[(3,5)]=11、 P1[(6,8)]=12
P2[11]=[3,4,5]、 P2[12]=[6,7,8]
次に、図15に示す行列生成処理の動作について具体的に説明する。以下、求める最短経路の終点をjとして、各頂点から終点j(j=1,2,・・・,10)までの最短経路を求める場合について説明する。
j=1の場合、ステップS43で、C[j=1]=1であるので、c=1となる。また、R[d=0]=[(j=1,(NP,None,None))]が設定される。
ステップS44〜S47の処理が実行されると、最短経路行列Sは、図19のS−11に示すように、j=1についての初期状態となる。このとき、R[d=0]にはタプルが1つ格納されているため、ステップS49に進み、R[d=0+1]=[ ]となる。R[d−1=0]にはタプル(1,(NP,None,None))が格納されており、ステップS51で、このタプルが未処理のタプル(i,m)として取り出される。すなわち、i=1、m=(NP,None,None)である。A[i=1]=[2]であるので、ステップS52で、k=2が選択され、S[k=2、j=1]=Iであるので、図16に示す(k、m’)取得処理が実行される。
m.state=NP、C[k]=1=c(=1)であるので、ステップS63で、m’=mとする。m’ .state=NPであるので、ステップS78で、S[k=2,j=1]=i(=1)を格納し、(k=2,m’=(NP,None,None))を返す。これにより、R[1]=[(2,(NP,None,None))]となる。
この段階で、A[i]に未処理の頂点kが存在しなくなり、また、R[d−1]に未処理のタプル(i,m)が存在しなくなるため、ステップS48に戻る。このとき、R[d=1]=[(2,(NP,None,None))]であるので、ステップS49に進み、R[d=1+1]=[ ]となる。このとき、R[d−1=1]にはタプル(2,(NP,None,None))が格納されており、ステップS51で、このタプルが未処理のタプル(i,m)として取り出される。すなわち、i=2、m=(NP,None,None)である。A[i=2]=[1,3]であるので、ステップS52で、まず、k=1が選択されたとすると、S[k=1、j=1]≠Iであるので、ステップS51に戻る。
次に、k=3が選択され、S[k=3、j=1]=Iであるので、図16に示す(k、m’)取得処理が実行される。m.state=NP、C[k]=2≠c(=1)であるので、ステップS64で、m’=(IP,k=3,0)とする。m’ .state=IPであるので、ステップS78で、S[k=3,j=1]=i(=2)を格納し、(k=3,m’=(IP,k=3,0))を返す。これにより、R[2]=[(3,(IP,3,0))]となる。
この段階で、A[i]に未処理の頂点kが存在しなくなり、また、R[d−1]に未処理のタプル(i,m)が存在しなくなるため、ステップS48に戻る。このとき、R[d=2]=[(3,(IP,3,0))]であるので、ステップS49に進み、R[d=2+1]=[ ]となる。このとき、R[d−1=2]にはタプル(3,(IP,3,0))が格納されており、ステップS51で、このタプルが未処理のタプル(i,m)として取り出される。すなわち、i=3、m=(IP,3,0)である。A[i=3]=[2,4]であるので、ステップS52で、まず、k=2が選択されたとすると、S[k=3、j=1]≠Iであるので、ステップS51に戻る。
次に、k=4が選択され、S[k=4、j=1]=Iであるので、図16に示す(k、m’)取得処理が実行される。m.state=IP、C[k]=2=C[m.uno=3](=2)であるので、ステップS67で、m’=(IP,m.uno=3,m.len+1=1)とする。m’.state=IPであるので、ステップS78で、S[k=4,j=1]=i(=3)を格納し、(k=4,m’=(IP,3,1))を返す。これにより、R[3]=[(4,(IP,3,1))]となる。
この段階で、A[i]に未処理の頂点kが存在しなくなり、また、R[d−1]に未処理のタプル(i,m)が存在しなくなるため、ステップS48に戻る。このとき、R[d=3]=[(4,(IP,3,1))]であるので、ステップS49に進み、R[d=3+1]=[ ]となる。このとき、R[d−1=3]にはタプル(4,(IP,3,1))が格納されており、ステップS51で、このタプルが未処理のタプル(i,m)として取り出される。すなわち、i=4、m=(IP,3,1)である。A[i=4]=[3,5]であるので、ステップS52で、まず、k=3が選択されたとすると、S[k=3、j=1]≠Iであるので、ステップS51に戻る。
次に、k=5が選択され、S[k=5、j=1]=Iであるので、図16に示す(k、m’)取得処理が実行される。m.state=IP、C[k]=2=C[m.uno=3](=2)であるので、ステップS67で、m’=(IP,m.uno=3,m.len+1=2)とする。m’ .state=IPであるので、ステップS78で、S[k=5,j=1]=i(=4)を格納し、(k=5,m’=(IP,3,2))を返す。これにより、R[4]=[(5,(IP,3,2))]となる。
この段階で、A[i]に未処理の頂点kが存在しなくなり、また、R[d−1]に未処理のタプル(i,m)が存在しなくなるため、ステップS48に戻る。このとき、R[d=4]=[(5,(IP,3,2))]であるので、ステップS49に進み、R[d=4+1]=[ ]となる。このとき、R[d−1=4]にはタプル(5,(IP,3,2)))が格納されており、ステップS51で、このタプルが未処理のタプル(i,m)として取り出される。すなわち、i=5、m=(IP,3,2)である。A[i=5]=[4,6]であるので、ステップS52で、まず、k=4が選択されたとすると、S[k=4、j=1]≠Iであるので、ステップS51に戻る。
次に、k=6が選択され、S[k=6、j=1]=Iであるので、図16に示す(k、m’)取得処理が実行される。m.state=IP、C[k]=3≠C[m.uno=3](=2)、Lmin(=2)≦m.len=2、i=5>m.uno=3であるので、ステップS71で、P1[m.uno=3,i=5]=11を取得し、符号を反転し、uno=−11とする。そして、ステップS72で、m’=(CP,uno=−11,m.len=2)とする。m’ .state=CPであるので、ステップS77で、S[k=6,j=1]=m’.uno(=−11)を格納し、(k=6,m’=(CP,−11,2))を返す。これにより、R[5]=[(6,(CP,−11,2))]となる。
この段階で、A[i]に未処理の頂点kが存在しなくなり、また、R[d−1]に未処理のタプル(i,m)が存在しなくなるため、ステップS48に戻る。このとき、R[d=5]=[(6,(CP,−11,2))]であるので、ステップS49に進み、R[d=5+1]=[ ]となる。このとき、R[d−1=5]にはタプル(6,(CP,−11,2))が格納されており、ステップS51で、このタプルが未処理のタプル(i,m)として取り出される。すなわち、i=6、m=(CP,−11,2)である。A[i=6]=[5,7]であるので、ステップS52で、まず、k=5が選択されたとすると、S[k=5、j=1]≠Iであるので、ステップS51に戻る。
次に、k=7が選択され、S[k=7、j=1]=Iであるので、図16に示す(k、m’)取得処理が実行される。m.state=CPであるので、ステップS63で、m’=mとなる。m’.state=CPであるので、ステップS77で、S[k=7,j=1]=m’.uno(=−11)を格納し、(k=7,m’=(CP,−11,2))を返す。これにより、R[6]=[(7,(CP,−11,2))]となる。
一旦m.state=CPとなると、以降同様の処理となるため、S[k=8,j=1]=S[k=9,j=1]=S[k=10,j=1]=−11である。したがって、j=1の終了時には、最短経路行列Sは、図19のS−12に示す状態となる。j=2,・・・,10についても同様に処理し、j=10についての処理終了時には、最短経路行列Sは、図20のS−13に示す状態となる。
次に、図21に示す最短経路復元処理について説明する。
ステップS101で、復元部22が、受け付けた最短経路σ[i,j]の問い合わせについて、i=jか否かを判定する。i≠jの場合には、処理はステップS102へ移行し、i=jの場合には、処理はステップS110へ移行する。
ステップS102では、復元部22が、行列DB30に格納された最短経路行列Sにアクセスし、S[i,j]の値kを取得する。この際、最短経路行列Sのデータを伸長した上で、S[i,j]の値kを取得する。
次に、ステップS103で、復元部22が、上記ステップS102で取得した値kが、グラフGの頂点の数(頂点番号の最大値)nより大きいか否かを判定する。n<kの場合には、kは中間経路番号であることを表しているため、処理はステップS104へ移行し、復元部22が、伸長した中間経路表P2からP2[k]に対応付けられた中間経路を取得し、変数ipathに設定する。また、復元部22は、ipathの始点を変数k1、終点を変数k2に設定する。
次に、ステップS105で、復元部22が、以下に示すように最短経路を復元する。
path=σ[i,k1] + ipath + σ[k2,j]
一方、上記ステップS103で、n≧kと判定された場合には、処理はステップS106へ移行し、復元部22が、kが−nより小さい否かを判定する。k<−nの場合には、kは中間経路番号の符号を反転した値であることを表しているため、処理はステップS107へ移行し、復元部22が、中間経路表P2からP2[−k]に対応付けられた中間経路を取得し、変数ipathに設定する。また、復元部22は、ipathの終点を変数k1、始点を変数k2に設定する。
次に、ステップS108で、復元部22が、以下に示すように最短経路を復元する。
path=σ[i,k1]
+ reverse(ipath) + σ[k2,j]
ここで、reverse(ipath)は、ipathが示す頂点列を逆順にすることを表す。
また、上記ステップS103及びS106が否定判定になる場合は、kは頂点iの親の頂点番号であることを表している。そこで、処理はステップS109へ移行し、復元部22が、以下に示すように最短経路を復元する。
path=[i,k] + σ[k,j]
なお、上記ステップS105及びS108におけるσ[i,k1]及びσ[k2,j]、並びに上記ステップS109におけるσ[k,j]については、本最短経路復元処理のステップS101〜S110を再帰的に実行することにより求める。
また、上記ステップS101で、i=jと判定された場合には、最短経路行列Sにアクセスすることなく、ステップS110で、復元部22が、path=[i]とする。
次に、ステップS111で、復元部22が、最短経路σ[i,j]の問い合わせに対して、pathを出力し、最短経路復元処理は終了する。
以上説明したように、本実施形態に係る情報処理装置によれば、最短経路行列生成部が、グラフに含まれる各頂点間の最短経路を表す最短経路行列の各要素の値として、最短経路上の長さ2以上の中間経路の識別情報を用いる。これにより、最短経路行列から最短経路を復元する際の最短経路行列へのアクセス回数を削減することができ、最短経路を高速に復元することができる。
なお、上記実施形態では、最短経路行列から最短経路を復元する際に、最短経路行列に親の頂点番号のみを用いる場合には不要である中間経路表P2へのアクセスが必要にはなるが、以下で説明するように、その影響は少ないと考えられる。
図22に示すように、線状にn個の頂点が並んでいるグラフの左端にある始点から右端にある終点までの最短経路におけるアクセス回数を考える。両端にそれぞれ、m/2個の頂点からなるクラスタと、それらの間にあるそれぞれm個の頂点からなる10個のクラスタ、計12個のクラスタに分割されていて、各クラスタ間は切断辺で結ばれているものとする。すなわち、n=11mが成り立っている。
この始点から終点までのアクセス回数を、最短経路行列に親の頂点番号のみを用いる方式(以下、「比較方式」という)と上記実施形態の方式(以下、「本方式」という)とで比較した結果を図23に示す。最短経路行列へのアクセス回数は比較方式ではn−1回、本方式では、m+19(=m/2×2+19)回である。また、中間経路表P2へのアクセス回数は、比較方式では中間経路表P2を用いないため0回であり、本方式では、途中で通過するクラスタ10個に対応して、10回である。
上述のように最短経路行列へのアクセスと、中間経路表P2へのアクセスでは処理負荷が異なる可能性があるが、大きくは変わらないと想定して、ここでは処理負荷が同じものとして、合計アクセス回数を計算している。したがって、合計アクセス回数は、比較方式の場合がn−1回、本方式の場合がm+29回となる。そして、合計アクセス回数は、n=110の場合は、比較方式に比べ本方式が約1/2.8で済み、n=1100の場合は、約1/8.5で済むことを示している。
また、上記実施形態では、グラフの分割数pを調整することで、中間経路表P2のサイズと、最短経路行列及び中間経路表P2へのアクセス回数とのバランスを取ることができる。
図24に、17個の頂点からなるグラフにおいて、分割数pを1から4まで変化させた場合のクラスタリングの例を示す。p=1の場合は、分割した結果のクラスタの数が1個である場合、すなわち、分割していない元のグラフを表している。
図25に、pの値毎に、中間経路表P2のサイズと、最短経路行列及び中間経路表P2への平均アクセス回数と、それらの合計とを示す。中間経路表P2は通常ディスクに格納される。ただし、ここでは、サイズが小さいため、中間経路表P2は主記憶上にあることを仮定した。また、中間経路表P2のサイズを計算するに当たっては、中間経路表P2がハッシュ表であり、ハッシュバケットの数が要素数に等しいこと、要素毎にネクストポインタを持つこと、経路を記憶するためにその長さも記憶しておくことが必要なことを仮定した。また、平均アクセス回数は、頂点2から17、3から11、9から17、及び3から15の4つの最短経路の平均アクセス回数をもとに計算した。
中間経路表P2のサイズが10までしか許容できないのであれば、p=1又はp=2を選択することになるが、平均合計アクセス回数はともに7.25で同じであるため、どちらを選んでもよい。一方、中間経路表P2のサイズが20まで許容できるのであれば、より平均合計アクセス回数が少ないp=3を選択する。さらに、中間経路表P2のサイズが40まで許容できたとしても、p=4の場合、中間経路表P2のサイズがさらに増えるにも関わらず、平均合計アクセス回数は6.5回とかえって増えてしまうため、やはりp=3を選ぶことになる。なお、p=2の場合、2つのクラスタに分割されるが、それぞれ切断点を1つしか有しないため、中間経路表に登録される中間経路は存在しない。
この例ではグラフが小さい(頂点数が少ない)ため、中間経路を使わない比較方式に相当する場合(p=1,2)と、中間経路を使う場合(p=3,4)との差や、中間経路を使う場合でのp=3とp=4との差が少ない。しかし、大きなグラフ(頂点数が多いグラフ)では、この差が大きくなることが想定される。
なお、上記実施形態では、重みなし無向グラフに含まれる頂点間の最短経路を表す最短経路行列を生成する場合について説明したが、開示の技術は、その他の態様のグラフにも適用することができる。
具体的には、上記実施形態で説明した重みなしの無向グラフのクラスタリングを重みありグラフへ適用する場合、重みがないものとみなして、又は重みが全て1であるものとみなして、上記実施形態と同様の方法でクラスタリングすればよい。また、有向グラフへ適用する場合は、有向グラフを無向グラフとみなして、上記実施形態と同様の方法でクラスタリングすればよい。
また、上記実施形態における中間経路表の生成を重みありグラフへ適用する場合、切断点間の最短経路、すなわち中間経路を求める際に、重みありグラフに適した手法を用いればよい。例えば、実施形態のように幅優先探索ではなく、重みありグラフの最短経路を求めるアルゴリズムとしてよく知られているDijkstraの方法を用いることで対応することができる。
また、上記実施形態における中間経路表の生成を有向グラフへ適用する場合、無向グラフの場合と異なり、全ての切断点間の最短経路が存在するとは限らない。例えば、切断点k1からk2への中間経路が存在しても、k2からk1への中間経路が存在するとは限らない。ただし、この点は、上記実施形態における中間経路表の生成において問題とならない。2つの中間経路表のいずれも、辿れる経路だけが参照されるため、辿れない経路を登録する必要はないからである。なお、無向グラフでは、スペースの節約のため、k1<k2となる中間経路だけを格納した。上記のことから、有向グラフでは、k1>k2でk1からk2への中間経路が存在するが、k2からk1への中間経路が存在しない場合には、k1からk2への中間経路を格納する必要がある。
また、上記実施形態における中間経路番号を用いた最短経路行列の生成を重みありグラフへ適用する場合、上述のDijkstra法に、上記実施形態のような改造を加えることで対応することが可能である。具体的には、Dijkstra法では、頂点を長さと共に優先度付キューで管理するが、その際に、上記のmの値も同時に管理するようにすることで、実現可能となる。
また、上記実施形態における中間経路番号を用いた最短経路行列の生成を有向グラフへ適用する場合、強連結でない限り、ある頂点iからある頂点jへの最短経路が存在しないということが起きる。すなわち、各頂点iから終点であるjまでの最短経路を求める際に、有向グラフの場合は、到達できないjが存在する可能性がある。したがって、その到達できていないjに関しては、アルゴリズムの処理が終わった時点でS[i,j]の値が初期値であるIのままになっている。このIをiからjへは到達できないことを意味するものと読み替えることで、有向グラフにも対応することが可能である。
また、上記実施形態を非連結なグラフに適用する場合、以下のように対応することが可能である。なお、無向グラフの場合、連結でない場合、そのグラフは非連結であるということにする。また、有向グラフの場合、辺の向きを無視して無向グラフとみなしたときに連結でない場合、そのグラフは非連結であるということにする。
まず、既存の方法を用いてグラフGを連結部分グラフに分割する。ここで、q個の連結部分グラフG1,G2,・・・,Gqに分割されたものとする。また、各Giは、Gi=(Vi,Ei)であるものとする。この際、後述の行列の合成を簡易にするため、Vの頂点に付与されている1からnまでの番号を、i<jとして、Viの頂点番号の方がVjの頂点番号よりも小さくなるように付与し直すものとする。
そして、1≦i≦qとして、各連結部分グラフGiに対し、上記実施形態で述べた方法を用いて、それぞれの最短経路行列Si及び中間経路表P2,iを生成する。中間経路番号は、n+1から始めて、q個の連結部分グラフに渡って一意に付与するものとする。そして、こうして求められたq個の最短経路行列と中間経路表を次のように合成する。
まず、最短経路行列の合成について説明する。q個の最短経路行列S1,S2,・・・,Sqを、図26に示すように合成して、最終的な最短経路行列Sを生成する。図26中の網掛け部分の要素には、有向グラフの場合にIが経路がないことを意味したのと同様に、経路がない(親がない)ことを示す意味でIを格納する。
次に、中間経路表の合成について説明する。合成の結果を格納する中間経路表をP2とする。そして、P2,i(1≦i≦q)の要素を順にP2に格納し直す。すなわち、中間経路[i1,i2,・・・,ih]に対する統合番号がunoであり、P2,i[uno]=[i1,i2,・・・,ih]の場合、P2[uno]=[i1,i2,・・・,ih]となるようにする。
また、上記実施形態では、中間経路表を、最短経路行列を生成する前に生成する場合について説明したが、これに限定されない。前もって中間経路表を生成するのではなく、最短経路行列を生成する際に、中間経路表を生成してもよい。具体的には以下のとおりである。
1) 空の中間経路表P1を準備する。
2) 最短経路行列を生成中に、切断点間の中間経路に遭遇した際に、その中間経路が中間経路表P1に登録されているか否かをチェックする。登録されていなければ、この時点で登録する。
3) 中間経路表P2も中間経路表P1に登録された中間経路に限って生成する。
以上を実現するために、最短経路中の中間経路や、中間経路を見つける過程における状態に関する情報を記憶するmに、切断点以降の経路も記憶しておく。この改善を加えることで、切断点間の最短経路を前もって求める処理が省略され、中間経路表P1、P2に登録する中間経路を必要最小限に絞ることができる。
なお、上記実施形態では、最短経路行列生成プログラム50、及び最短経路復元プログラム60が記憶部43に予め記憶(インストール)されている態様を説明したが、これに限定されない。CD−ROMやDVD−ROM等の記憶媒体に記録された形態で提供することも可能である。
以上の実施形態に関し、更に以下の付記を開示する。
(付記1)
複数の頂点と頂点間を接続する辺とで表されたグラフにおける各頂点間の最短経路上の2以上の辺を含む中間経路の各々に識別情報を付与し、
前記グラフに含まれる全頂点から全頂点への最短経路を表す行列の各要素の値として、前記各要素に対応する行及び列に対応する頂点間の最短経路上の中間経路の識別情報を用いて最短経路行列を生成する
ことを含む処理をコンピュータに実行させるための最短経路行列生成プログラム。
(付記2)
前記グラフを、指定された数の部分グラフに分割し、各部分グラフについて、前記部分グラフに含まれる頂点を用いて表され、かつ他の部分グラフと辺で接続された頂点を始点及び終点とする経路を、前記中間経路とする付記1に記載の最短経路行列生成プログラム。
(付記3)
前記中間経路と、前記中間経路の識別情報とを対応付けた中間経路表を生成し、
前記最短経路行列の各要素の値として前記中間経路の識別情報を用いる際、前記中間経路表を参照する
付記1又は付記2に記載の最短経路行列生成プログラム。
(付記4)
前記中間経路表として、インデックス付表を用いる付記3に記載の最短経路行列生成プログラム。
(付記5)
付記3又は付記4に記載の最短経路行列生成プログラムにより生成された前記最短経路行列及び前記中間経路表を用いて、指定された頂点間の最短経路を復元する処理をコンピュータに実行させるための最短経路復元プログラム。
(付記6)
複数の頂点と頂点間を接続する辺とで表されたグラフにおける各頂点間の最短経路上の2以上の辺を含む中間経路の各々に識別情報を付与する付与部と、
前記グラフに含まれる全頂点から全頂点への最短経路を表す行列の各要素の値として、前記各要素に対応する行及び列に対応する頂点間の最短経路上の中間経路の識別情報を用いて最短経路行列を生成する生成部と、
を含む最短経路行列生成装置。
(付記7)
前記付与部は、前記グラフを、指定された数の部分グラフに分割し、各部分グラフについて、前記部分グラフに含まれる頂点を用いて表され、かつ他の部分グラフと辺で接続された頂点を始点及び終点とする経路を、前記中間経路とする付記6に記載の最短経路行列生成装置。
(付記8)
前記付与部は、前記中間経路と、前記中間経路の識別情報とを対応付けた中間経路表を生成し、
前記生成部は、前記最短経路行列の各要素の値として前記中間経路の識別情報を用いる際、前記中間経路表を参照する
付記6又は付記7に記載の最短経路行列生成装置。
(付記9)
前記付与部は、前記中間経路表として、インデックス付表を用いる付記8に記載の最短経路行列生成装置。
(付記10)
最短経路行列生成装置により生成された前記最短経路行列及び前記中間経路表を用いて、指定された頂点間の最短経路を復元する復元部
を含む最短経路復元装置。
(付記11)
複数の頂点と頂点間を接続する辺とで表されたグラフにおける各頂点間の最短経路上の2以上の辺を含む中間経路の各々に識別情報を付与し、
前記グラフに含まれる全頂点から全頂点への最短経路を表す行列の各要素の値として、前記各要素に対応する行及び列に対応する頂点間の最短経路上の中間経路の識別情報を用いて最短経路行列を生成する
ことを含む処理をコンピュータが実行する最短経路行列生成方法。
(付記12)
前記グラフを、指定された数の部分グラフに分割し、各部分グラフについて、前記部分グラフに含まれる頂点を用いて表され、かつ他の部分グラフと辺で接続された頂点を始点及び終点とする経路を、前記中間経路とする付記11に記載の最短経路行列生成方法。
(付記13)
前記中間経路と、前記中間経路の識別情報とを対応付けた中間経路表を生成し、
前記最短経路行列の各要素の値として前記中間経路の識別情報を用いる際、前記中間経路表を参照する
付記11又は付記12に記載の最短経路行列生成方法。
(付記14)
前記中間経路表として、インデックス付表を用いる付記3に記載の最短経路行列生成方法。
(付記15)
付記13又は付記14に記載の最短経路行列生成方法により生成された前記最短経路行列及び前記中間経路表を用いて、指定された頂点間の最短経路を復元する処理をコンピュータが実行する最短経路復元方法。
(付記16)
複数の頂点と頂点間を接続する辺とで表されたグラフにおける各頂点間の最短経路上の2以上の辺を含む中間経路の各々に識別情報を付与し、
前記グラフに含まれる全頂点から全頂点への最短経路を表す行列の各要素の値として、前記各要素に対応する行及び列に対応する頂点間の最短経路上の中間経路の識別情報を用いて最短経路行列を生成する
ことを含む処理をコンピュータに実行させるための最短経路行列生成プログラムを記憶した記憶媒体。