(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024162516
(43)【公開日】2024-11-21
(54)【発明の名称】部分グラフ数え上げ方法、部分グラフ数え上げ装置及びプログラム
(51)【国際特許分類】
G06F 17/10 20060101AFI20241114BHJP
【FI】
G06F17/10 Z
【審査請求】未請求
【請求項の数】6
【出願形態】OL
(21)【出願番号】P 2023078081
(22)【出願日】2023-05-10
(71)【出願人】
【識別番号】000004226
【氏名又は名称】日本電信電話株式会社
(74)【代理人】
【識別番号】110004381
【氏名又は名称】弁理士法人ITOH
(74)【代理人】
【識別番号】100107766
【弁理士】
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【弁理士】
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100124844
【弁理士】
【氏名又は名称】石原 隆治
(72)【発明者】
【氏名】中村 健吾
(72)【発明者】
【氏名】西野 正彬
(72)【発明者】
【氏名】安田 宜仁
(72)【発明者】
【氏名】湊 真一
【テーマコード(参考)】
5B056
【Fターム(参考)】
5B056AA06
(57)【要約】 (修正有)
【課題】各頂点に対する部分グラフ数え上げ問題を高速に解く方法、装置及びプログラムを提供する。
【解決手段】方法は、連結な無向グラフと、ワイルドカードを含む連結性制約と、各辺の重みと、基礎となる部分グラフ集合とを入力する入力手順と、前記無向グラフの特定の頂点の集合の間の連結性に関する情報を持つノードで構成されるゼロサプレス型二分決定グラフZDDを構築する手順と、構築されたゼロサプレス型二分決定グラフと、前記各辺の重みとに基づいて、前記特定の頂点の集合の間の連結性に関する情報を利用した動的計画法により、各頂点に対して、前記部分グラフ集合に含まれる部分グラフであって、かつ、前記連結性制約に含まれるワイルドカードを頂点に置き換えた連結性制約を満たす部分グラフに含まれる辺の重みと前記部分グラフに含まれない辺の重みとを用いた重み付きカウント値を計算する計算手順と、を実行する。
【選択図】
図8
【特許請求の範囲】
【請求項1】
連結な無向グラフG=(V,E)と、ワイルドカード*を含む連結性制約P*と、各辺e∈Eの重みwe
+,we
-∈Rと、基礎となる部分グラフ集合F⊆2Eとを入力する入力手順と、
前記無向グラフGと、前記連結性制約P*と、前記部分グラフ集合F⊆2Eとに基づいて、前記無向グラフGの特定の頂点v∈Vの集合の間の連結性に関する情報を持つノードで構成されるゼロサプレス型二分決定グラフZを構築する構築手順と、
前記構築手順で構築されたゼロサプレス型二分決定グラフZと、前記各辺e∈Eの重みwe
+,we
-∈Rとに基づいて、前記特定の頂点v∈Vの集合の間の連結性に関する情報を利用した動的計画法により、各頂点v∈Vに対して、前記部分グラフ集合Fに含まれる部分グラフE'であって、かつ、前記連結性制約P*に含まれるワイルドカード*を頂点vに置き換えた連結性制約P*[v]を満たす部分グラフE'に含まれる辺e∈E'の重みwe
+と前記部分グラフE'に含まれない辺e∈E\E'の重みwe
-を用いた重み付きカウント値count(v)を計算する計算手順と、
をコンピュータが実行する部分グラフ数え上げ方法。
【請求項2】
前記部分グラフ集合F⊆2Eは、前記無向グラフGの部分グラフのうち、前記連結性制約P*以外の所定の制約を満たす部分グラフの集合である、請求項1に記載の部分グラフ数え上げ方法。
【請求項3】
前記構築手順は、
前記部分グラフ集合FがF=2Eである場合、前記ワイルドカード*も前記無向グラフGの頂点の1つと扱ったフロンティア法により、前記部分グラフ集合F=2Eを表現する前記ゼロサプレス型二分決定グラフZを構築する、請求項1に記載の部分グラフ数え上げ方法。
【請求項4】
前記構築手順は、
前記部分グラフ集合FがF≠2Eである場合、前記ワイルドカード*も前記無向グラフGの頂点の1つと扱ったフロンティア法により、部分グラフ集合2Eを表現するゼロサプレス型二分決定グラフZ1を構築し、
フロンティア法により、前記部分グラフ集合Fを表現するゼロサプレス型二分決定グラフZ2を構築し、
前記ゼロサプレス型二分決定グラフZ1と前記ゼロサプレス型二分決定グラフZ2との共通部分を前記ゼロサプレス型二分決定グラフZとして構築する、請求項2に記載の部分グラフ数え上げ方法。
【請求項5】
連結な無向グラフG=(V,E)と、ワイルドカード*を含む連結性制約P*と、各辺e∈Eの重みwe
+,we
-∈Rと、基礎となる部分グラフ集合F⊆2Eとを入力する入力部と、
前記無向グラフGと、前記連結性制約P*と、前記部分グラフ集合F⊆2Eとに基づいて、前記無向グラフGの特定の頂点v∈Vの集合の間の連結性に関する情報を持つノードで構成されるゼロサプレス型二分決定グラフZを構築する構築部と、
前記構築部によって構築されたゼロサプレス型二分決定グラフZと、前記各辺e∈Eの重みwe
+,we
-∈Rとに基づいて、前記特定の頂点v∈Vの集合の間の連結性に関する情報を利用した動的計画法により、各頂点v∈Vに対して、前記部分グラフ集合Fに含まれる部分グラフE'であって、かつ、前記連結性制約P*に含まれるワイルドカード*を頂点vに置き換えた連結性制約P*[v]を満たす部分グラフE'に含まれる辺e∈E'の重みwe
+と前記部分グラフE'に含まれない辺e∈E\E'の重みwe
-を用いた重み付きカウント値count(v)を計算する計算部と、
を有する部分グラフ数え上げ装置。
【請求項6】
連結な無向グラフG=(V,E)と、ワイルドカード*を含む連結性制約P*と、各辺e∈Eの重みwe
+,we
-∈Rと、基礎となる部分グラフ集合F⊆2Eとを入力する入力手順と、
前記無向グラフGと、前記連結性制約P*と、前記部分グラフ集合F⊆2Eとに基づいて、前記無向グラフGの特定の頂点v∈Vの集合の間の連結性に関する情報を持つノードで構成されるゼロサプレス型二分決定グラフZを構築する構築手順と、
前記構築手順で構築されたゼロサプレス型二分決定グラフZと、前記各辺e∈Eの重みwe
+,we
-∈Rとに基づいて、前記特定の頂点v∈Vの集合の間の連結性に関する情報を利用した動的計画法により、各頂点v∈Vに対して、前記部分グラフ集合Fに含まれる部分グラフE'であって、かつ、前記連結性制約P*に含まれるワイルドカード*を頂点vに置き換えた連結性制約P*[v]を満たす部分グラフE'に含まれる辺e∈E'の重みwe
+と前記部分グラフE'に含まれない辺e∈E\E'の重みwe
-を用いた重み付きカウント値count(v)を計算する計算手順と、
をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、部分グラフ数え上げ方法、部分グラフ数え上げ装置及びプログラムに関する。
【背景技術】
【0002】
グラフ理論に属する問題の1つとして、部分グラフ数え上げ問題と呼ばれる問題が知られている。部分グラフ数え上げ問題とは、グラフが与えられたときに、或る所定の制約を満たす部分グラフの個数又は重み付きのカウント値を計算するという問題である。
【0003】
部分グラフ数え上げ問題は、例えば、ネットワーク信頼性評価等に応用できる基本的な問題である。ネットワーク信頼性評価は或る2つの頂点間の連結性制約の下で部分グラフ数え上げ問題を解くことと同等であり、例えば、二分決定グラフ(BDD:Binary Decision Diagram)を利用した高速な解法が知られている(非特許文献1)。
【先行技術文献】
【非特許文献】
【0004】
【非特許文献1】Gary Hardy, Corinne Lucet, and Nikolaos Limnios. K-terminal network reliability measures with binary decision diagrams. IEEE Transactions on Reliability, Vol. 56, pp. 506-515, 2007.
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、各頂点に対する部分グラフ数え上げ問題を解く場合、計算時間的に解くことが困難なことがあった。例えば、各頂点に対するネットワーク信頼性を評価する場合、頂点の個数だけ部分グラフ数え上げ問題を繰り返し解く必要があり、グラフの規模によっては非特許文献1に記載されている解法を利用しても現実的な計算時間で解くことが困難なことがある。
【0006】
本開示は、上記の点に鑑みてなされたもので、各頂点に対する部分グラフ数え上げ問題を高速に解くことができる技術を提供する。
【課題を解決するための手段】
【0007】
本開示の一態様による部分グラフ数え上げ方法は、連結な無向グラフG=(V,E)と、ワイルドカード*を含む連結性制約P*と、各辺e∈Eの重みwe
+,we
-∈Rと、基礎となる部分グラフ集合F⊆2Eとを入力する入力手順と、前記無向グラフGと、前記連結性制約P*と、前記部分グラフ集合F⊆2Eとに基づいて、前記無向グラフGの特定の頂点v∈Vの集合の間の連結性に関する情報を持つノードで構成されるゼロサプレス型二分決定グラフZを構築する構築手順と、前記構築手順で構築されたゼロサプレス型二分決定グラフZと、前記各辺e∈Eの重みwe
+,we
-∈Rとに基づいて、前記特定の頂点v∈Vの集合の間の連結性に関する情報を利用した動的計画法により、各頂点v∈Vに対して、前記部分グラフ集合Fに含まれる部分グラフE'であって、かつ、前記連結性制約P*に含まれるワイルドカード*を頂点vに置き換えた連結性制約P*[v]を満たす部分グラフE'に含まれる辺e∈E'の重みwe
+と前記部分グラフE'に含まれない辺e∈E\E'の重みwe
-を用いた重み付きカウント値count(v)を計算する計算手順と、をコンピュータが実行する。
【発明の効果】
【0008】
各頂点に対する部分グラフ数え上げ問題を高速に解くことができる技術が提供される。
【図面の簡単な説明】
【0009】
【
図4】フロンティア法のアルゴリズムの一例を示す図である。
【
図5】フロンティア法の結果として得られたZDDの一例を示す図である。
【
図6】本実施形態に係る部分グラフ数え上げ装置のハードウェア構成の一例を示す図である。
【
図7】本実施形態に係る部分グラフ数え上げ装置の機能構成の一例を示す図である。
【
図8】本実施形態に係る部分グラフ数え上げ処理の流れの一例を示すフローチャートである。
【
図9】本実施形態に係る構築部が実行する処理のアルゴリズムの一例を示す図である。
【
図10】本実施形態に係る計算部が実行する処理のアルゴリズムの一例を示す図である。
【発明を実施するための形態】
【0010】
以下、本発明の一実施形態について説明する。
【0011】
<部分グラフ数え上げ問題>
グラフ理論におけるグラフをG=(V,E)とする。ここで、Vは頂点の集合、Eは辺の集合である。
【0012】
グラフGが与えられたとき、部分グラフ数え上げ問題とは、或る所定の制約を満たす部分グラフの個数又は重み付きのカウント値を計算するという問題である。制約としては、例えば、各頂点の次数に関する制約、閉路の有無に関する制約等が挙げられる。
【0013】
より正確には、各辺e∈Eに対して2種類の重みwe
+,we
-∈R(ただし、Rは実数全体の集合)が与えられたとき、以下の式(1)に示す値を計算する問題のことである。
【0014】
【数1】
ここで、以下は辺の部分集合、すなわち部分グラフの中で与えられた制約を満たすものの族(集合)である。
【0015】
【数2】
なお、本明細書のテキスト中では、上記の辺の部分集合をF⊆2
Eと表す。
【0016】
部分グラフ数え上げ問題は旧来よりコンピュータ科学の基本的な問題として扱われており、また応用面でも特にネットワーク信頼性評価で盛んに用いられている。ネットワーク信頼性評価の基本問題として、グラフ構造としてモデル化されたネットワークの各辺がそれぞれ独立に所与の確率で故障する状況下で、注目する頂点間の接続性が保たれる確率を求めるという問題がある。この問題は、連結性制約の下で部分グラフ数え上げ問題を解くことと同等である。ここで、連結性制約とは、いくつかの頂点のペアに対してそれぞれ連結であること、また別のいくつかの頂点のペアに対してそれぞれ非連結であることを要求するトポロジー的制約のことである。
【0017】
連結性制約は、パスやシュタイナー木(注目する頂点間を接続する木)、全域木、根付き全域森等の様々な部分グラフのグラフ構造(以下、グラフ部分構造ともいう。)を規定するのにも必須の制約である。これらのグラフ部分構造を数え上げることは、特にネットワークインフラにおいて頂点の重要度を評価する際に重要である。
【0018】
例えば、通信ネットワーク上のパスは2点間の通信経路に対応し、同様に通信ネットワーク上のシュタイナー木は多点間の通信経路に対応する。このため、或る頂点vを通過するパスやシュタイナー木の数はその頂点vが故障した際に失われる通信経路の数に相当し、この数は頂点vの通信ネットワークにおける重要度とみなせる。また、或る頂点sと別の頂点vとを通過する閉路は頂点sと頂点vとを結ぶ2つのパスの組とみなせるため、このような閉路の個数を数えることは頂点sから頂点vへのノンブロッキングな通信経路の組の数を数えることに相当する。更に、根がr1,・・・,rkにある根付き全域森は、変電所がr1,・・・,rkにある配電網とみなせる。このため、新しい変電所を頂点vに配置しようと考える場合、根がr1,・・・,rk,vにある根付き全域森を数えることにより、その際の配電網の柔軟性の指標とすることができる。
【0019】
以上の例のような重要度(配電網の柔軟性も含む)を各頂点に対して求めるには、一般に、部分グラフ数え上げ問題をそれぞれの頂点vに対して解く必要がある。しかしながら、上記のネットワーク信頼性評価の基本問題やパスを数え上げる問題は#P完全という計算量的に困難な問題に属することが知られており、実用上高速なアルゴリズムでも数百辺程度のグラフに対して1つの部分グラフ数え上げ問題を解くのに数分やそれ以上の時間が掛かることがある。このため、各頂点vに対して部分グラフ数え上げ問題を解くことは計算量的に更に困難な問題になる。
【0020】
<各頂点に対する部分グラフ数え上げ問題>
各頂点に対する部分グラフ数え上げ問題を定義する。
【0021】
まず、連結性制約は、無向グラフG=(V,E)の頂点集合Vの部分分割によって表現するものとする。部分分割とは、互いに共通部分のない頂点部分集合の集合のことである。ここで、頂点部分集合とは、頂点集合Vの部分集合のことである。
【0022】
部分分割Pは、(i)Pの同一の頂点部分集合に含まれる任意の2頂点v,v'は連結であること、(ii)Pの異なる頂点部分集合にそれぞれ含まれる任意の2頂点v,v'は非連結であること、という制約を与える。例えば、P={{v1,v2},{v3}}は、頂点v1と頂点v2は連結であり、頂点v1と頂点v3、頂点v2と頂点v3はそれぞれ非連結である、という制約を表現している。
【0023】
本実施形態では部分分割に対してワイルドカード*を導入し、このワイルドカード*を具体的な頂点に置き換えることで多様な連結性制約を表現する。以下、V∪{*}の部分分割であって、かつ、1つのワイルドカード*を必ず含む部分分割をP*とする。また、頂点v∈Vに対して、P*に含まれるワイルドカード*を頂点vに置き換えることによって得られる部分分割(連結性制約)をP*[v]とする。更に、P*中のワイルドカード*を削除することで得られる連結性制約をP*[]とする。なお、もし頂点v∈VがP*中に既に存在する場合に、(i)頂点vがP*中のワイルドカード*を含む集合と同じ集合に含まれる場合はP*[v]をP*[]と表し、(ii)そうでない場合は矛盾した制約、すなわちそれを満たすような部分グラフは存在しないとする。例えば、P*={{v1,v2,*},{v3}}に対して、P*[v4]={{v1,v2,v4},{v3}}、P*[v2]=P*[]={{v1,v2},{v3}}であり、P*[v3]は矛盾した制約である。
【0024】
ワイルドカード*を導入した部分分割を用いると、各頂点に対する部分グラフ数え上げ問題は以下のように定義できる。
【0025】
連結な無向グラフG=(V,E)と、1つのワイルドカード*を含む連結性制約P*と、部分グラフ(すなわち、辺の部分集合)の集合F⊆2Eと、各辺e∈Eに対する重みwe
+,we
-∈Rとが与えられる。このとき、各頂点に対する部分グラフ数え上げ問題は、各頂点v∈Vに対して、以下の式(2)に示す値を計算する問題である。
【0026】
【数3】
ここで、連結性制約P'に対して、この連結性制約P'を満たすGの部分グラフの集合をC(P')と表すことにする。
【0027】
上記で例示した重度度を各頂点に対して求める問題(以下、頂点重要度計算問題ともいう。)は、いずれも上記の式(2)に示す値を計算する問題の枠組みで定式化できる。
【0028】
・パス:s,v∈Vが与えられたとき、P*={{s,t,*}}として、F⊆2Eを(i)sとtの次数は1で他の頂点の次数は0又は1、かつ、(ii)閉路が無いような部分グラフの集合とする。すると、count(v)は頂点vを通過するs,t-単純パスの数になる。
【0029】
・サイクル(閉路):s∈Vが与えられたとき、P*={{s,*}}として、F⊆2Eを(i)各頂点の次数は0又は2、かつ、(ii)連結成分がちょうど1つ存在するような部分グラフの集合とする。すると、count(v)は頂点sを起終点として頂点vを通過する閉路の数になる。
【0030】
・シュタイナー木:T⊆Vが与えられたとき、P*={T∪{*}}として、F⊆2Eを閉路が無くちょうど1つの連結成分が存在するような部分グラフの集合とする。すると、count(v)は頂点vを通過するT-シュタイナー木、すなわちTに含まれる頂点を全て接続する木の数になる。
【0031】
・根付き全域森:T={r1,・・・,rk}⊆Vが与えられたとき、P*={{r1},・・・,{rk},{*}}として、F⊆2Eを(i)各頂点の次数が1以上で、(ii)閉路がなく、かつ、(iii)ちょうど(k+1)個の連結成分が存在するような部分グラフの集合とする。すると、count(v)はr1,・・・,rk,vを根とする根付き全域森の個数になる。
【0032】
<本実施形態に関連する従来技術>
ネットワーク信頼性評価については、二分決定グラフ(BDD)を用いた手法が現在実用上は最も高速な手法であり(非特許文献1)、この手法で200辺前後の実ネットワークトポロジのネットワーク信頼性評価に成功している。ここで、BDDは注目する頂点が接続するような部分グラフをコンパクトに表現する手段として用いられており、BDDを一度構築することで部分グラフ数え上げ問題はBDD上の動的計画法(DP:(Dynamic Programming)に帰着される。
【0033】
連結性制約以外に他の制約も加えて、上述したようなパス等のグラフ部分構造を数え上げる技術は多く存在する。最も単純なものは、パスや全域木等のグラフ部分構造を1つずつ全て列挙することである。特に、参考文献1に記載されている全域木の列挙により、いくつかの部分グラフ数え上げ問題に用いることができるトゥッテ多項式と呼ばれる多項式を計算することができる。一方で、一般に制約を満たす部分グラフはグラフの規模に対して指数的に多く存在するため、このような列挙はグラフの規模が大きくなるとすぐに計算時間的に不可能になる。実用上高速な数え上げ手法としては、非特許文献1に記載されている手法と同様に制約を満たす部分グラフをBDDのようなデータ構造として索引化する手法があり、その集大成がフロンティア法である(参考文献2)。フロンティア法により、種々の部分グラフ構造を、参考文献3に記載されているゼロサプレス型二分決定グラフ(ZDD:Zero-suppressed Binary Decision Diagram)と呼ばれるBDDの亜種の構造として表現できる。ZDDも一度構築することで数え上げが単純なDPで実行できるため、フロンティア法は実用上高速な部分グラフ数え上げ問題の解法となる。
【0034】
以上はいずれも1つの部分グラフ数え上げ問題を解くための手法であり、各頂点に対する部分グラフ数え上げ問題を解くためには、1つの部分グラフ数え上げ問題を解くための手法を各頂点の各々に対して独立に適用する必要がある。
【0035】
なお、参考文献4には、クライアントサーバモデルのネットワーク上で各クライアントがサーバに接続する確率を全てのクライアントで同時並行に高速に求める手法が記載されている。この手法は、各頂点に対する部分グラフ数え上げ問題を連結性制約のみの下で同時に解いているものとみなせる。ただし、この連結性制約は「注目する全ての頂点が連結である」というタイプの制約であり、例えば、「或る頂点ペアが非連結である」というタイプの制約は含まれない。
【0036】
<各頂点に対する部分グラフ数え上げ問題の課題とその解決方法>
上述したように、実用上高速なBDD/ZDDベースの数え上げ手法も1つの部分グラフ数え上げ問題を解くのに数分からそれ以上の時間が掛かることがある。このため、各頂点に対する部分グラフ数え上げ問題を解くためには、1つの頂点に対する部分グラフ数え上げ問題を頂点の個数だけ繰り返し実行する必要があり、計算時間的に現実的ではない。
【0037】
一方で、参考文献4に記載されている手法は、連結性制約のみの下では各頂点に対する部分グラフ数え上げ問題を同時に解くことができるが、他の制約(例えば、各頂点の次数に関する制約等)も存在する状況下では用いることができない。このため、参考文献4に記載されている手法では、上述したパス、サイクル、シュタイナー木、根付き全域森等の部分グラフを同時に数え上げることはできない。
【0038】
そこで、本実施形態では、一般的な「各頂点に対する部分グラフ数え上げ問題」を同時に解くために、フロンティア法でZDDを1つだけ構築した上で、ZDD上の動的計画法によって全てのcount(v)の値を計算する方法を提案する。
【0039】
参考文献4に記載されている手法は、連結性制約の中でも特に「注目する全ての頂点が連結である」というタイプの制約しか扱えなかった。一方で、本提案手法によれば、「或る頂点ペアが非連結である」というタイプの連結性制約、各頂点の次数に関する制約、閉路の有無に関する制約等も扱えるため、パス、サイクル、シュタイナー木、根付き全域森等の部分グラフを同時に数え上げることが可能となる。
【0040】
なお、参考文献4に記載されている手法もデータ構造を構築し、そのデータ構造上の動的計画法により全ての数え上げを同時に行うことは提案手法と同様であるが、技術的には以下のような点で異なり、これらの点によって提案手法では連結性制約以外の様々な制約を扱うことが可能となっている。まず、参考文献4に記載されている手法では、BDDと似ているがBDDではないデータ構造を構築してその上で動的計画法を行っている。一方で、提案手法では、フロンティア法の活用により正当なZDDを構築する。フロンティア法は非連結性の制約も考慮できるため、これにより「或る頂点ペアが非連結である」というタイプの連結性制約も扱えるようになる。また、提案手法では正当なZDDを構築するため、ZDDに関するアルゴリズムや演算等を併用することによって連結性制約以外の他の制約も扱えるようになる。
【0041】
以下、ZDDとフロンティア法について準備した後、上記の提案手法によって各頂点に対する部分グラフ数え上げ問題を同時に解くことができる部分グラフ数え上げ装置10について説明する。
【0042】
<準備>
≪ZDD≫
参考文献3に記載されているZDDの構造について説明する。ZDD Z=(N,A)は根付き有向非巡回グラフ(DAG:Directed Acyclic Graph)の形をしたデータ構造であり、グラフG=(V,E)の辺集合Eの部分集合の集合、すなわち部分グラフの集合を表現できる。なお、本来、ZDDは任意の集合の部分集合の集合を表現できるが、本実施形態では説明を簡単にするため部分グラフの集合を表現するデータ構造として説明する。また、グラフGの頂点及び辺と区別するため、ZDDについては「ノード」及び「エッジ」という用語を用いる。
【0043】
ZDD Zの根ノードを以下で書くことにする。
【0044】
【数4】
なお、以下、本明細書のテキスト中ではハット「^」を記号の真上ではなく、その直前に記載するものとする。例えば、本明細書のテキスト中では、上記の根ノードを「^r」と記載する。
【0045】
ノード集合Nは終端と呼ばれる2つの特別なノードとその他の中間ノードから構成される。上記の2つの特別なノードを「終端ノード」と呼び、それぞれ以下で書くことにする。
【0046】
【数5】
なお、以下、本明細書のテキスト中では、上記の終端ノードを表す記号をそれぞれ大文字のタウΤ及び垂直記号⊥で代用して記載するものとする。
【0047】
各中間ノード^nからは0-枝及び1-枝と呼ばれる2つの枝が出ていて、またラベルと呼ばれる1以上m以下の整数lb(^n)を有する。ここで、mは元のグラフGの辺の数である。
【0048】
中間ノード^nから出る0-枝及び1-枝の先のノードをそれぞれ0-子ノード^n-及び1-子ノード^n+と呼ぶ。ここで、ラベルは根から小さい順に並んでいる必要がある。すなわち、lb(^n)<lb(^n-)及びlb(^n)<lb(^n+)が各中間ノード^nに対して成り立つ必要がある。なお、終端ノードに対してはそのラベルの値をm+1であると定めることにする。
【0049】
ZDDが正規化されているとは、任意の中間ノード^nに対して、0-子ノード^n-はラベルがlb(^n)+1であるノード若しくは終端ノード⊥であり、かつ、1-子ノード^n+はラベルがlb(^n)+1であるノード若しくは終端ノード⊥である、ということを指す。また、ZDD Zの大きさ|Z|は、Z中のノードの数として定義する。
【0050】
ZDDのノードの組^n,^n'∈Nに対して、ノード^nからノード^n'までの経路の集合をR
Z(^n,^n')と表す。このとき、予め決められた辺の順序e
1,・・・,e
mに対して、ZDD Zが表す部分グラフ集合S(Z)⊆2
Eは次のように定義される。Z中の経路Rに対して、E(R)⊆Eを、ラベルがiであるノードから出る1-枝を経路Rが通るとき、かつ、そのときに限りe
i∈E(R)となるような辺集合Eの部分集合とする。すると、S(Z)={E(R)|R∈R
Z(^r,Τ)}、すなわち根ノード^rから終端ノードΤまでの各経路に対するE(R)を集めた集合となる。例えば、
図1に示すZDDにおいて、根ノードから順に1-枝、0-枝、0-枝、1-枝、1-枝を辿って終端ノードΤまで辿り着く経路は、{e
1,e
4,e
5}という部分グラフがS(Z)に含まれるということに対応する。なお、
図1に示すZDDでは破線が0-枝、実線が1-枝を表しており、ノードの中の整数はラベルを表している。
【0051】
正規化されたZDD Zを用いて、Zが表現する部分グラフ集合S(Z)に対する数え上げの値W(S(Z))を簡単に計算することができる。^n,^n'∈NをZのノードの組、R∈RZ(^n,^n')をノード^nからノード^n'までの間の任意の経路とする。このとき、経路Rのパス積Wp(R)を以下の式(3)で定義する。
【0052】
【数6】
パス積W
p(R)は、E(R)に存在する辺eに対する重みw
e
+と、E(R)に存在しない辺eに対する重みw
e
-とを全て掛けた積である。また、ZDDのノード^nに対して、R
Z(^r,^n)中の全ての経路に関するパス積の和を^n.pと表すものとする。すると、S(Z)はR
Z(^r,Τ)に対応するため、Τ.pの値がW(S(Z))の値と一致する。更に、^n.p自体は指数的な個数のパス積の和として定義されるものの、動的計画法(DP)を用いることでこの値は簡単に計算できる。具体的には、以下の式(4)に示す関係が成立するため、^r.pから開始して、式(4)に従ってラベルの小さいノードから順に^n.pを計算することで、Τ.pの値をZの大きさに比例する時間で計算することができる。
【0053】
【数7】
≪フロンティア法≫
参考文献2に記載されているフロンティア法について説明する。フロンティア法の基本的な考え方は、予め決められた辺の順序e
1,・・・,e
mに基づいて、e
1から順番にその辺が部分グラフに含まれるか否かを決めていくことである。これを繰り返すと、i=1,・・・,mに対して順番にe
iが部分グラフに含まれるか否かで分岐する二分決定木が構築される。この二分決定木では、全ての辺に対してその辺が部分グラフに含まれるか否かが決定された後の全ての部分グラフが一番下に並ぶことになる。この一番下に並んだ各部分グラフの1つ1つに対して制約を満たすか否かを確認することにより、制約を満たす場合はΤ、制約を満たさない場合は⊥に至る決定木を構築できる。例えば、
図2に示すグラフ及び連結性制約P={{1,4}}が与えられた場合、
図3に示す二分決定木が構築される。なお、
図2に示すグラフの頂点集合はV={1,2,3,4}、辺集合はE={e
1,e
2,e
3,e
4,e
5}である。
【0054】
ZDDは、上記の二分決定木の等価な部分木、すなわち一番下に並ぶΤと⊥のパターンが同じ木を併合することで構築できる。例えば、
図3に示す二分決定木において、ダガー記号†が付与されたノードはいずれも⊥,Τ,Τ,Τという同じパターンを持つため、これらのノードは併合することができる。
【0055】
しかしながら、部分グラフはグラフの規模に対して指数的に多く存在するため、一度二分決定木を構築するのは計算時間的に効率が悪い。そこで、フロンティア法では、
図3に示す二分決定木のように各ノードで部分グラフそのものを保持するのではなく、各ノードでグラフの頂点間の連結性に関する情報を保持することで、二分決定木を一番下まで構築することなく上述した等価な部分木を見つけ出し、ノードの併合を行って計算量を削減している。
【0056】
いま、E<i={e1,・・・,ei-1}、E≧i={ei,・・・,em}と定義し、E<iとE≧iの両方に出現する頂点の集合をフロンティア集合Fiと定義する。また、連結性制約Pに対して、P中に出現する頂点の集合(つまり、この連結性制約を表現する部分分割中に出現する頂点の集合)をVPとする。すると、ei-1まで含まれるか否かを決定した複数の部分グラフに対して、以下の条件が満たされるとき、二分決定木の部分木が等価になることが示せる。
【0057】
条件:Fi∪VPに含まれる頂点間での連結性が等しい、すなわち、任意の2頂点v,v'∈Fi∪VPについて、頂点vと頂点v'がその部分グラフの下で接続しているか否かが一致している。
【0058】
したがって、二分決定木の各ノードで部分グラフそのものを保持する代わりに、Fi∪VPに含まれる頂点間での連結性を表す情報を保持することによって、ノードの併合を行うことができる。
【0059】
・フロンティア法のアルゴリズム
以下、フロンティア法のアルゴリズムの一例について、
図4を参照しながら説明する。
【0060】
Fi∪VPに含まれる頂点間の連結性は、compとvsetという2つの頂点の部分分割によって表現される。なお、頂点の部分分割は、実装上は参考文献4と同様に整数の配列として管理するといった方法が考えられる。
【0061】
compは、フロンティア集合Fiの分割であって、v,v'∈Fiが連結であるとき、かつ、そのときに限り同じ集合に属するようなものである。すなわち、Fiの各集合は連結成分である。vsetは、Fiの各集合、すなわち連結成分とVpの頂点との連結性を保持している。より具体的には、vsetは、同じ集合に属する頂点ペア同士は接続し、異なる集合に属する頂点ペア同士は接続しない、という連結性制約を表現している。ここで、compの中で頂点v∈Vを含む集合をcomp[v]と表すものとする。同様に、vsetの中で頂点v∈Vを含む集合をvset[v]と表すものとする。また、根ノード^r及びノード^nが持つcompをそれぞれ^r.comp及び^n.compと表すものとする。同様に、根ノード^r及びノード^nが持つvsetをそれぞれ^r.vset及び^n.vsetと表すものとする。更に、ラベルiを持つノードの集合(i層目のノード集合)をLiと表すものとする。
【0062】
このとき、フロンティア法のアルゴリズムでは、まず^r.comp={}、^r.vset=P、L1={^r}、Li=φ(i=2,・・・,m+1)とした後(1行目)、辺を含まないか(f=-)又は辺を含むか(f=+)に従ってcomp及びvsetを更新することを繰り返す(2~4行目)。8~13、18行目がcompとvsetの更新の手続きである。8~9行目では、新たにフロンティア集合Fiに加わる頂点uについて、uのみからなる集合(連結成分)をcompに加える。次に、eiを含み、かつ、eiの両端点v,v'がcompで属する集合(連結成分)が異なる場合(10行目)、その2つの集合を併合する(11行目)。このとき、片方の頂点が^n.vsetに存在し、もう片方の頂点が^n.vsetに存在しない場合、存在しない方の頂点が含まれるcompの集合の頂点を、存在する方の頂点が含まれるvsetの頂点に加える(12~13行目)。18行目では、次のフロンティア集合Fi+1に含まれなくなる頂点uについて、comp及びvsetから削除する。最後に、24行目で、0-子ノード(f=-)又は1-子ノード(f=+)を、更新したcomp及びvsetを持つノードに設定する。ここで、もし同じcompとvsetを持つノードが既に生成されている場合、子ノードはその既に生成されたノードとする(21~22行目)。一方で、そのようなノードが未だ生成されていない場合、新たにそのノードを生成する(23行目)。また、もし次の(I)又は(II)のいずれかが起こった場合、子ノードを⊥に設定する。これは枝刈りと呼ばれる。(I)vsetの中の異なる集合に存在する2頂点を辺eiによって接続した場合(6~7行目)。これはvsetの制約に反しているためである。(II)comp[v]の頂点が全て次のフロンティア集合Fi+1に含まれなくなったが、vset[v]がvとは違う頂点v'を持っている場合(16~17行目)。この場合、vとv'はもう接続することは無いため、vsetの制約に反するためである。最後に、最後のレベル(層)まで到達し、なおかつ枝刈りされなかった場合には、子ノードをΤに設定する(20行目)。これはPによって表現される制約が全て満たされたことを意味する。
【0063】
図2に示すグラフ及び連結性制約P={{1,4}}が与えられたとき、フロンティア法の結果として得られたZDDを
図5に示す。
図5ではcompに含まれる集合とvsetに含まれる集合とが「compに含まれる集合/vsetに含まれる集合」という形式で各ノード中に記載されている。例えば、根ノードには「/{1,4}」が記載されており、これは^r.comp={}、^r.vset={{1,4}}であることを意味している。
【0064】
例えば、
図5に示すZDDにおいて、i=2の層の「{1}{2}/{1,4}」が記載されたノードに注目する。comp={{1}{2}}より、頂点1を含む連結成分と、頂点2を含む連結成分とがそれぞれ存在することがわかる。また、vset={{1,4}}は、頂点1と頂点3が連結であるという制約を表現する。ここで、辺e
2={1,3}を含めない場合、次のフロンティア集合F
3={2,3}は頂点1を含まないため、頂点1を含む連結成分はフロンティア集合F
3から無くなる。これは頂点1と頂点4が連結であるというvsetの制約に反するため、0-子ノードは⊥となる(つまり、枝刈りされる)。一方で、辺e
2={1,3}を含めた場合、頂点1を含む連結成分は次の層では頂点3を含む連結成分と言い換えられる。更に、頂点1と頂点4が連結であるという制約は頂点3と頂点4が連結であるという制約に言い換えられる。したがって、1-子ノードはcomp={{2}{3}}、vset={3,4}である中間ノードとなる。フロンティア法は、このような過程を繰り返してZDDを構築する。なお、
図3に示す二分決定木でダガー記号†が付与された4つのノードは、
図5に示すZDDでダガー記号†が付与された1つのノードとして扱われている。
【0065】
<部分グラフ数え上げ装置10のハードウェア構成例>
本実施形態に係る部分グラフ数え上げ装置10のハードウェア構成例を
図6に示す。
図6に示すように、本実施形態に係る部分グラフ数え上げ装置10は、入力装置101と、表示装置102と、外部I/F103と、通信I/F104と、RAM(Random Access Memory)105と、ROM(Read Only Memory)106と、補助記憶装置107と、プロセッサ108とを有する。これらの各ハードウェアは、それぞれがバス109を介して通信可能に接続される。
【0066】
入力装置101は、例えば、キーボード、マウス、タッチパネル、物理ボタン等である。表示装置102は、例えば、ディスプレイ、表示パネル等である。なお、部分グラフ数え上げ装置10は、入力装置101及び表示装置102のうちの少なくとも一方を有していなくてもよい。
【0067】
外部I/F103は、記録媒体103a等の外部装置とのインタフェースである。記録媒体103aとしては、例えば、CD(Compact Disc)、DVD(Digital Versatile Disk)、SDメモリカード(Secure Digital memory card)、USB(Universal Serial Bus)メモリカード等が挙げられる。
【0068】
通信I/F104は、部分グラフ数え上げ装置10を通信ネットワークに接続するためのインタフェースである。RAM105は、プログラムやデータを一時保持する揮発性の半導体メモリ(記憶装置)である。ROM106は、電源を切ってもプログラムやデータを保持することができる不揮発性の半導体メモリ(記憶装置)である。補助記憶装置107は、例えば、HDD(Hard Disk Drive)、SSD(Solid State Drive)、フラッシュメモリ等の不揮発性の記憶装置である。プロセッサ108は、例えば、CPU(Central Processing Unit)等の各種演算装置である。
【0069】
なお、
図6に示す部分グラフ数え上げ装置10のハードウェア構成は一例であって、部分グラフ数え上げ装置10のハードウェア構成はこれに限られるものではない。例えば、部分グラフ数え上げ装置10は、複数の補助記憶装置107や複数のプロセッサ108を有していてもよいし、図示したハードウェアの一部を有していなくてもよいし、図示したハードウェア以外の種々のハードウェアを有していてもよい。
【0070】
<部分グラフ数え上げ装置10の機能構成例>
本実施形態に係る部分グラフ数え上げ装置10の機能構成例を
図7に示す。
図7に示すように、本実施形態に係る部分グラフ数え上げ装置10は、入力部201と、構築部202と、計算部203と、出力部204とを有する。これら各部は、例えば、部分グラフ数え上げ装置10にインストールされた1以上のプログラムが、プロセッサ108等に実行させる処理により実現される。
【0071】
入力部201は、与えられた情報(連結な無向グラフG=(V,E)、ワイルドカード*込みの連結性制約P*、各辺e∈Eの重みwe
+,we
-∈R、基礎となる部分グラフ集合F⊆2E)を入力する。ここで、部分グラフ集合F⊆2Eは、例えば、部分グラフが1つ1つ与えられてもよいし、部分グラフ集合F⊆2Eに含まれる部分グラフが満たす制約の形(例えば、「各頂点の次数が0又は2である部分グラフ」等)で与えられてもよい。又は、例えば、部分グラフ集合F⊆2Eの代わりに、この部分グラフ集合F⊆2Eを表現するZDD ZFが与えられてもよい。
【0072】
構築部202は、入力部201によって入力された連結な無向グラフG=(V,E)と連結性制約P*と部分グラフ集合F⊆2Eとに基づいて、フロンティア法を一部変更した手法により、特定の頂点群の間の連結性に関する情報を持つノードで構成されるZDD Zを構築する。
【0073】
計算部203は、入力部201によって入力された各辺e∈Eの重みwe
+,we
-∈Rと、構築部202によって構築されたZDD Zとに基づいて、特定の頂点群の間の連結性に関する情報を利用した動的計画法により各頂点v∈Vに対するカウント値count(v)を計算する。なお、各頂点v∈Vに対するカウント値count(v)が、各頂点に対する部分グラフ数え上げ問題の解である。
【0074】
出力部204は、計算部203によって計算された各頂点v∈Vに対するカウント値count(v)を予め決められた所定の出力先に出力する。なお、所定の出力先としては、例えば、補助記憶装置107、表示装置102、通信ネットワークを介して接続される端末や機器等が挙げられる。
【0075】
<部分グラフ数え上げ処理の流れ>
本実施形態に係る部分グラフ数え上げ処理の流れについて、
図8を参照しながら説明する。
【0076】
まず、入力部201は、与えられた情報(連結な無向グラフG=(V,E)、ワイルドカード*込みの連結性制約P*、各辺e∈Eの重みwe
+,we
-∈R、基礎となる部分グラフ集合F⊆2E)を入力する(ステップS101)。
【0077】
次に、構築部202は、上記のステップS101で入力された連結な無向グラフG=(V,E)と連結性制約P*と部分グラフ集合F⊆2Eとに基づいて、フロンティア法を一部変更した手法により、特定の頂点群の間の連結性に関する情報を持つノードで構成されるZDD Zを構築する(ステップS102)。なお、ZDD Zを構築する方法の詳細については後述する。
【0078】
次に、計算部203は、上記のステップS101で入力された各辺e∈Eの重みwe
+,we
-∈Rと、上記のステップS102で構築されたZDD Zとに基づいて、特定の頂点群の間の連結性に関する情報を利用した動的計画法により各頂点v∈Vに対するカウント値count(v)を計算する(ステップS103)。なお、各頂点v∈Vに対するカウント値count(v)を計算する方法の詳細については後述する。
【0079】
そして、出力部204は、上記のステップS103で計算された各頂点v∈Vに対するカウント値count(v)を予め決められた所定の出力先に出力する(ステップS104)。
【0080】
<ZDD Zを構築する方法の詳細>
以下、
図8のステップS102におけるZDD Zを構築する方法の詳細について説明する。
【0081】
計算部203によって全ての頂点v∈Vに対するカウント値count(v)を計算するために、構築部202によって構築するZDD Zは以下の3つの条件を満たす必要がある。
【0082】
条件1:Zは部分グラフ集合F∩C(P*[])を表現する。
【0083】
条件2:Zの各ノードはFi∪VP*の連結性に関する情報をcomp及びvsetとして持つ。ここで、VP*はP*に含まれる(*を除いた)頂点の集合である。
【0084】
条件3:Zの各ノードのvsetは、どの集合がP*で*が含まれる集合と対応しているかを保持している。
【0085】
まず、F=2
E、すなわち連結性制約のみが存在する場合、ワイルドカード*も特別な頂点の1つとして扱うようにフロンティア法のアルゴリズムを一部変更する。具体的には、
図4に示したフロンティア法のアルゴリズムの1行目で^r.vsetにP
*を代入する。また、16行目のifに対して「{u,*}が^u.vsetに含まれないこと」という条件をand条件として追加する。すると、上述した枝刈りが行われる条件のうち(II)は、vsetの中の集合にワイルドカード*が含まれていても単純に無視するようになる。したがって、Zは最終的にワイルドカード*を無視した制約の下での部分グラフ集合、すなわちC(P
*[])を表現するZDDとなる。ここで、フロンティア法はvsetにワイルドカード*を含みながら進行するため条件3も満たされる。
【0086】
次に、F≠2E、すなわち連結性制約以外の制約も存在する場合も考える。まず、Fから既存の手法によってFを表現するZDD ZFを構築する。これには、例えば、参考文献2に記載されているフロンティア法や参考文献3に記載されているApply演算等を用いればよい。次に、ZDD同士の共通部分を取ることができる既存の枠組みを上記の一部変更したフロンティア法と組み合わせて、条件1~条件3を全て満たすZDD Zを構築する。ZDD同士の共通部分を取ることができる既存の枠組みとしては、例えば、参考文献3に記載されているApply演算や参考文献5に記載されているsubsetting等を用いることができる。以下、一例として、ZDD同士の共通部分を取ることができる既存の枠組みとしてsubsettingを用いた場合について説明する。
【0087】
・構築部202が実行する処理のアルゴリズム
以下、構築部202が実行する処理のアルゴリズムの一例について、
図9を参照しながら説明する。なお、
図4に示したフロンティア法のアルゴリズムとの相違点は、
図9の1行目、6行目~11行目、22行目、27行目である。
図9の2行目~5行目は
図4の2~5行目と同様であり、
図9の12行目~21行目は
図4の6行目~15行目と同様であり、
図9の23行目~26行目は
図4の17行目~20行目と同様であり、
図9の28行目~31行目は
図4の22行目~24行目と同様である。以下、主に、
図9のフロンティア法のアルゴリズムとの相違点について説明する。なお、1行目の下線部分と22行目は、上記で説明したように、ワイルドカード*を特別な頂点とみなすための変更であり、それ以外の相違点はsubsetting由来の変更である。subsettingでは、フロンティア法で辺e
iが含まれるか否かに応じてZ
Fの構造を辿り、もしZ
F側で⊥に辿り着いたらそこで枝刈りを行う、すなわち子ノードを⊥とする、という方法であり、comp及びvsetに加えてbaseというエントリを作ってbaseにはそれに対応するZ
Fのノードを格納する。
【0088】
まず、構築部202は、^r.comp={}、^r.vset=P*、^r.base=^rF、L1={^r}、Li=φ(i=2,・・・,m+1)とする(1行目)。ここで、^rFはZFの根ノードである。6~7行目では、構築部202は、辺eiが含まれる場合(f=+)で、かつ、iが^n.baseのラベルより小さい場合、枝刈りを行う。一方で、構築部202は、iと^n.baseのラベルとが一致する場合(8行目)、^n.baseはそれに対応する子ノードとする(9行目)。また、その子ノードが⊥である場合、構築部202は、枝刈りを行う(10~11行目)。27行目では、構築部202は、comp及びvsetに加えてbaseも一致するノードが既に生成されている場合、子ノードはその既に生成されたノードとする。
【0089】
<各頂点v∈Vに対するカウント値count(v)を計算する方法の詳細>
以下、
図8のステップS103における各頂点v∈Vに対するカウント値count(v)を計算する方法の詳細について説明する。
【0090】
計算部203は、構築部202によって構築されたZDD Z(つまり、少なくともcomp及びvsetの情報を持つノードで構成されるZDD Z)上での動的計画法により、各ノードに対して3種類の値p,q,rをそれぞれ計算する。そして、計算部203は、これら3種類の値p,q,rを用いて、各頂点v∈Vに対するcount(v)を計算する。以下では、3種類の値p,q,rの定義と、これら3種類の値p,q,rを用いたcount(v)の計算方法とを説明した後、p,q,rの値を求める式について説明し、最後に計算部203が実行する処理のアルゴリズムについて説明する。なお、ノード^nに対するp,q,rはそれぞれ^n.p,^n.q,^n.rと表される。
【0091】
構築部202によって構築されたZDD Zの各ノードに対して、^n.pは、上述した通り、RZ(^r,^n)中の全ての経路に関するパス積の和とする。また、^n.rは、RZ(^n,Τ)中の全ての経路に関するパス積の和とする。一方で、^n.qは、^n.compに含まれる各集合、すなわち各連結成分について定まる値である。全ての根ノードからΤまでの経路の集合RZ(^r,Τ)の中でノード^nを通過するものについて考える。そして、^n.comp中の1つの集合(連結成分)Bについて、Bに含まれる頂点vを1つ取る。すると、上述したノード^nを通過する経路のうち、当該経路に対応する部分グラフが制約P*[v]を満たす経路R(つまり、E(R)∈C(P*[v])であるような経路R)の集合は、ノード^nと連結成分Bから定まる経路の集合R^n,B⊆RZ(^n,Τ)及び直積を用いて、以下の形式で表現できることが数学的に示せる。
【0092】
【数8】
ここで、2つの経路集合R',R''に対して、それらの直積は以下で定義される。
【0093】
【数9】
すなわち、2つの経路集合R',R''の直積は、R'に含まれる経路とR''に含まれる経路とをそれぞれ1つずつ取り、それを繋げた経路全体の集合である。また、^n.q[B]は、R
^n,B中の全ての経路に関するパス積の和と定義する。
【0094】
以上の値を用いることにより、count(v)の値を以下の式で計算できることが示せる。まず、頂点vのグラフGにおける次数が2以上である場合、必ずv∈Fiとなるようなiが存在するため、count(v)の値は、以下の式(5)により計算できる。
【0095】
【数10】
次に、頂点vのグラフGにおける次数が1である場合、vを含む辺が1つしか存在しない。そこで、vを含む辺をe
i、また辺e
iのもう片方の頂点をv'とする。このとき、v'∈F
iである場合、count(v)の値は、以下の式(6)により計算できる。
【0096】
【数11】
ここで、V
P*'は、P
*中のワイルドカード*を含む集合に含まれる頂点の集合である。また、上記の式(6)中に現れる^n.q
+については後述する。
【0097】
一方で、v'がFiに含まれない場合、count(v)の値は、以下の式(6)により計算できる。
【0098】
【数12】
次に、p,q,rの値を求める式について説明する。^n.pについては既に説明した通りであり、^r.p=1から開始して式(4)を用いてラベルが小さいノードから順に値を計算することができる。また、^n.rについては逆にΤ.r=1、⊥.r=0から開始して以下の式(8)を用いてラベルが大きいノードから順に計算することができる。
【0099】
【数13】
^n.qの値を計算するために、R
^n,B中の経路を、^nから^nの0-枝を辿るか1-枝を辿るかによって分類し、それぞれR
^n,B
-,R
^n,B
+とする。^n.q
-[B]をR
^n,B
-中の経路のパス積の和、^n.q
+[B]をR
^n,B
+中の経路のパス積の和とする。これにより、^n.q[B]は以下の式(9)のように分解できる。
【0100】
【数14】
式(9)のそれぞれの項の計算は、以下の「隣り合うノード同士の連結成分の関係性」を用いる。
【0101】
隣り合うノード同士の連結成分の関係性:ラベルiを持つZDDのノードを^n∈Liとし、fを+又は-とする。^nf≠⊥であるとき、連結成分B∈^n.compに対して、Bfを以下のように定義する。(i)もしBがFi+1にも存在する頂点vを含む場合、Bf:=^nf.comp[v]と定義する。(ii)そうでない場合、B-=φ、すなわちそれに対応する連結成分は存在しないとする。また、f=+に対しては、辺eiの両端点をv,v'としたとき、もしv'∈Fiかつv∈BならばB+:=^n+.comp[v']、もしv∈Fiかつv'∈BならばB+:=^n+.comp[v]と定義し、どちらも成り立たないならば^n+=φとする。
【0102】
上記の定義により、Bfは、^n.comp中に存在するBと同じ連結成分を表している。
【0103】
以下、^n.q-[B]の計算について説明する。まず、^n=⊥である場合、^n.q-[B]=0である。次に、^n≠⊥かつB-≠φである場合、以下であることが示せる。
【0104】
【数15】
最後に、^n≠⊥かつB
-=φである場合、Bに含まれる頂点と^n.vsetに含まれる頂点との比較により場合分けされる。V
^n.vset'を、^n.vsetのワイルドカード*を含む集合に含まれている頂点の集合とする。また、V
^n.vset''を、^n.vsetのワイルドカード*を含まない集合に含まれている頂点の集合とする。すると、case(i)Bの頂点が^n.vsetには一切存在しない場合、case(ii)Bの頂点のうち1つ以上がV
^n.vset'に含まれる場合、case(iii)Bの頂点のうち1つ以上がV
^n.vset''に含まれる場合、の3つのパターンがあり得る。これらのうち、case(ii)、又は、case(i)かつV
P*'=φである場合のみ以下であり、それ以外の場合は^n.q
-[B]=0であることが示せる。
【0105】
【数16】
以上をまとめると、以下の式(10)となる。
【0106】
【数17】
^n.q
+[B]の計算もほぼ同様であり、式(10)の-を+に変えた式がほぼそのまま成立する。ただし、以下のような例外処理をする必要がある。辺e
iの両端点をv,v'としたとき、vとv'はF
i+1に含まれず、(^n.comp[v])
+=φで、かつ、^n.comp[v]がcase(i)に該当したとする。V
P*'≠φのとき、v'∈V
^n.vset'であるか、又は(^n.comp[v])
+=φかつ^n.comp[v']がcase(ii)に該当するならば以下である。
【0107】
【数18】
一方で、V
P*'=φのとき、v'∈V
^n.vset''であるか、又は(^n.comp[v])
+=φかつ^n.comp[v']がcase(iii)に該当するならば^n.q
+[^n.comp[v]]=0である。
【0108】
以上がp,q,rの値を求める式となる。
【0109】
・計算部203が実行する処理のアルゴリズム
以下、計算部203が実行する処理のアルゴリズムの一例について、
図10を参照しながら説明する。
【0110】
まず、1行目で、計算部203は、^r.pを1、それ以外のpを0に初期化すると共に、Τ.rを1、⊥.rを0、すべてのqを0に初期化する。2~5行目がpの計算であり、計算部203は、ラベルiが小さい順に式(4)によりpの値を計算する。より具体的には、計算部203は、各ノード^n∈Liに対して、^n-≠⊥である場合は^n-.pに以下を足し上げる(4行目)。
【0111】
【数19】
一方で、計算部203は、各ノード^n∈L
iに対して、^n
+≠⊥である場合は^n
+.pに以下を足し上げる(5行目)。
【0112】
【数20】
これにより、式(4)に相当する計算が行える。
【0113】
6~14行目がr,qの計算であり、計算部203は、ラベルiが大きい順にr,qの値を計算する。8行目では^n.pが式(8)により計算される。^n.qは^n.q-と^n.q+に分けて計算される。11行目が式(10)の1つ目の場合分け、12~13行目が式(10)の2つ目の場合分けに相当する。14行目では上述した^n.q+に関する例外処理を行う。
【0114】
15行目以降がcount(v)の計算であり、res[v]にcount(v)の値が格納される。まず、頂点vがVP*'に含まれる場合、定義よりC(P*[v])=C(P*[])であるため、計算部203は、res[v]にΤ.pを代入する(16行目)。一方で、VP*''をP*でワイルドカード*を含まない集合に含まれている頂点の集合として、頂点vがVP*''に含まれる場合、P*[v]は矛盾した制約となるため、計算部203は、res[v]に0を代入する(17行目)。そうではなく、v∈Fiなるiが存在する場合、計算部203は、式(5)によりres[v]の値を計算する(18~19行目)。いずれも成立しない場合、頂点vは次数1の頂点であるため、計算部203は、式(6)及び(7)によりres[v]の値を計算する(21~23行目)。21行目が式(6)の第1項、22行目が式(7)の第1項、23行目が式(6)及び(7)に共通の第2項の計算に相当する。
【0115】
<まとめ>
以上のように、本実施形態に係る部分グラフ数え上げ装置10は、少なくとも連結性制約を含む制約の下での各頂点に対する部分グラフ数え上げ問題を同時に解くことができる。これにより、例えば、パス、サイクル、シュタイナー木、根付き全域森等の頂点重要度計算問題を高速に解くことができる。本実施形態に係る部分グラフ数え上げ装置10が実行する提案手法は計算量解析もできており、各制約に対してそれぞれフロンティア法を実行するジュライ手法と比較して頂点数nのオーダー倍だけ高速になることが示せる。計算機実験においても、100頂点程度のグラフにおいて上記の頂点重要度計算問題をいずれも10~20倍程度高速に解くことができている。
【0116】
本発明は、具体的に開示された上記の実施形態に限定されるものではなく、特許請求の範囲の記載から逸脱することなく、種々の変形や変更、既知の技術との組み合わせ等が可能である。
【0117】
[参考文献1]
参考文献1:Akiyoshi Shioura, Akihisa Tamura, and Takeaki Uno. An optimal algorithm for scanning all spanning trees of undirected graphs. SIAM Journal on Computing, Vol. 26, No. 3, pp. 678-692, 1997.
参考文献2:Jun Kawahara, Takeru Inoue, Hiroaki Iwashita, and Shin-ichi Minato. Frontier-based search for enumerating all constrained subgraphs with compressed representation. IEICE Transactions on Fundamentals of Electronics, Communications and Computer Sciences, Vol. E100.A, No.9, pp. 1773-1784, 2017.
参考文献3:Shin-ichi Minato. Zero-suppressed BDDs for set manipulation in combinatorial problems. In Proceedings of the 30th ACM/IEEE Design Automation Conference (DAC), pp. 272-277, 1993.
参考文献4:Kengo Nakamura, Takeru Inoue, Masaaki Nishino, and Norihito Yasuda. Efficient network reliability evaluation for client-server model. In Proceedings of 2021 IEEE Global Communications Conference (GLOBECOM 2021), pp. 1-6, 2021.
参考文献5:Hiroaki Iwashita and Shin-ichi Minato. Efficient top-down ZDD construction techniques using recursive specifications. Technical Report TCS-TR-A-13-69, Division of Computer Science, Hokkaido University, 2013.
【符号の説明】
【0118】
10 部分グラフ数え上げ装置
101 入力装置
102 表示装置
103 外部I/F
103a 記録媒体
104 通信I/F
105 RAM
106 ROM
107 補助記憶装置
108 プロセッサ
109 バス
201 入力部
202 構築部
203 計算部
204 出力部