JP2020135207A - 経路探索方法、経路探索プログラム、経路探索装置および経路探索のデータ構造 - Google Patents

経路探索方法、経路探索プログラム、経路探索装置および経路探索のデータ構造 Download PDF

Info

Publication number
JP2020135207A
JP2020135207A JP2019025655A JP2019025655A JP2020135207A JP 2020135207 A JP2020135207 A JP 2020135207A JP 2019025655 A JP2019025655 A JP 2019025655A JP 2019025655 A JP2019025655 A JP 2019025655A JP 2020135207 A JP2020135207 A JP 2020135207A
Authority
JP
Japan
Prior art keywords
vertex
path
route
routes
point
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2019025655A
Other languages
English (en)
Inventor
康男 山根
Yasuo Yamane
康男 山根
塩田 哲義
Tetsuyoshi Shioda
哲義 塩田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2019025655A priority Critical patent/JP2020135207A/ja
Priority to US16/789,500 priority patent/US20200265044A1/en
Publication of JP2020135207A publication Critical patent/JP2020135207A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9024Graphs; Linked lists
    • GPHYSICS
    • G01MEASURING; TESTING
    • G01CMEASURING DISTANCES, LEVELS OR BEARINGS; SURVEYING; NAVIGATION; GYROSCOPIC INSTRUMENTS; PHOTOGRAMMETRY OR VIDEOGRAMMETRY
    • G01C21/00Navigation; Navigational instruments not provided for in groups G01C1/00 - G01C19/00
    • G01C21/26Navigation; Navigational instruments not provided for in groups G01C1/00 - G01C19/00 specially adapted for navigation in a road network
    • G01C21/34Route searching; Route guidance
    • G01C21/3446Details of route searching algorithms, e.g. Dijkstra, A*, arc-flags, using precalculated routes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2237Vectors, bitmaps or matrices
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06QINFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
    • G06Q10/00Administration; Management
    • G06Q10/04Forecasting or optimisation specially adapted for administrative or management purposes, e.g. linear programming or "cutting stock problem"
    • G06Q10/047Optimisation of routes or paths, e.g. travelling salesman problem

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Business, Economics & Management (AREA)
  • Data Mining & Analysis (AREA)
  • General Engineering & Computer Science (AREA)
  • Radar, Positioning & Navigation (AREA)
  • Remote Sensing (AREA)
  • Human Resources & Organizations (AREA)
  • Software Systems (AREA)
  • Strategic Management (AREA)
  • Economics (AREA)
  • Computational Linguistics (AREA)
  • Marketing (AREA)
  • Game Theory and Decision Science (AREA)
  • Entrepreneurship & Innovation (AREA)
  • Automation & Control Theory (AREA)
  • Operations Research (AREA)
  • Quality & Reliability (AREA)
  • Tourism & Hospitality (AREA)
  • General Business, Economics & Management (AREA)
  • Development Economics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Navigation (AREA)

Abstract

【課題】最短経路の探索時間を短縮することを課題とする。【解決手段】探索装置は、グラフデータが有する複数のノードの中から始点および終点を特定する。探索装置は、始点と終点とを繋ぐ経路のうち距離の短い上位所定数の最短経路を探索する場合に、所定数より小さい値が設定される制限値を用いて、始点および終点の双方向から、始点からの経路と終点からの経路とが結合する結合点を特定する。探索装置は、結合点を含む複数のノードそれぞれに対応付けて保持する経路の数を制限値以下に制限して、各ノードに到達する経路のうち距離が短い経路を保持し、各ノードに対応付けた保持される経路を用いて、結合点に至る経路から上位所定数の最短経路を探索し、探索された上位所定数の経路を出力する。【選択図】図4

Description

本発明は、経路探索方法、経路探索プログラム、経路探索装置および経路探索のデータ構造に関する。
SNS(Social Networking Service)、顧客関係管理、ネットワーク管理、バイオエンジニアリング、輸送など様々な分野で、ネットワーク的なデータを活用するアプリケーションが増えている。ネットワーク的データとしては、インターネット、Web、交通網などのいわゆるネットワークや、人間関係や分子間の関係などがある。ネットワーク的データは、頂点と、頂点と頂点間を結ぶ辺とによって構成され、人間関係で言えば、人間が頂点、人間同士の関係がその間の辺としてモデル化される。
こうしたネットワーク的データは数学的にはグラフもしくはグラフデータと呼ばれ、グラフデータを分析して、ビジネス、経営、研究などに重要な情報を抽出することが行われている。グラフデータの分析としては、例えば幅優先探索法、Dijkstra法、双方向探索法などのように、2点間の最短経路を探索する手法が広く利用されている。
図35は、幅優先探索法を説明する図である。幅優先探索法は、重みなしグラフの最短経路を探索する手法である。図35に示すように、幅優先探索法は、始点につながる頂点を、始点を中心とした同心円状に探索し、その同心円上に終点が現れた時点で処理を終了する。
図36は、Dijkstra法を説明する図である。Dijkstra法は、重み付きグラフの最短経路を探索する手法である。図36に示すように、Dijkstra法は、始点から隣接する頂点を順に優先度キューに入れて、重みの小さな頂点を順次取り出し、すべての頂点を取り出した時点で終了する。
例えば、Dijkstra法は、頂点0を始点として、それに隣接する全ての頂点への経路を優先度キュー(もしくは優先度付きキュー)に入れる。続いて、Dijkstra法は、優先度キューの先頭にある経路を取り出す。ここで取り出された取り出した経路[0,1]は、頂点0から頂点1までの最短経路になっている。次に、頂点0で行った処理と同様に、Dijkstra法は、取り出された経路の最後の頂点である頂点1に隣接する全ての頂点への経路を優先度キューに入れる。ただし、既に辿った頂点0は除く。その後、Dijkstra法は、優先度キューの先頭にある経路[0,2]を取り出す。ここで取り出された取り出した経路[0,2]は、頂点0から頂点2までの最短経路になっている。Dijkstra法は、上記処理を終点が優先度キューから取り出されるまで実行することで、始点から終点までの最短経路を探索する。
図37は、双方向探索法を説明する図である。図37に示すように、双方向探索法は、幅優先探索を始点と終点の双方から同時に行い、双方が衝突した時点で、双方の経路を合成する。そして、双方向探索法は、双方の探索において用いられるキューの先頭にあるパスの長さの和が今までに探索された最短な経路より長くなった時点で終了する。
近年では、交通網やコンピュータネットワーク通信の迂回路探索などの探索として、2点間の経路のうち最短経路からk番目までのk本の経路(以降では、k−最短経路と記載する場合がある)を探索することも行われている。例えば、始点と終点との間の最短経路を求め、その最短経路を構成する辺がp個あれば、各辺を取り除いたp通りのグラフを考え、それぞれのグラフで求めたp通りの最短経路の中で最短なものを2番目の最短経路とし、3番目以降の最短経路もこれに類似した方法で求める。
特開2017−098593号公報 特開2010−286978号公報 特開2016−194908号公報
E.Filtz,et al、"On finding the k shortest paths in RDF data",IESD(Intelligent Exploration of Semantic Data),2016
ところで、頂点が多い複雑なグラフデータでは、ある頂点(ノード)を始点とする経路の数が膨大になる。このため、複雑なグラフデータのk−最短経路を探索する場合、各頂点を通過する膨大な経路の数それぞれについて最短経路を探索することになり、計算量が多く、探索時間も長くなる。
また、最短経路を求めるDijkstra法を拡張した方式(以降では、拡張Dijkstra法と記載する場合がある)も考えられる。例えば、拡張Dijkstra法では、始点から出発して、幅優先探索のようにおおよそ同心円状に終点に辿りつく経路を探索していくが、その探索の途中で通る頂点において最短経路だけでなく、探索された2番目以降の最短経路も保持する。このようにして、拡張Dijkstra法は、k−最短経路の探索を実行する。ところが、この拡張Dijkstra法では、頂点の数が多いほど各頂点で探索する経路が膨大となるので、計算量が多くなり、探索処理の時間その分要する。
一つの側面では、最短経路の探索時間を短縮することができる経路探索方法、経路探索プログラム、経路探索装置および経路探索のデータ構造を提供することを目的とする。
第1の案では、経路探索方法は、コンピュータが、グラフデータが有する複数のノードの中から始点および終点を特定する処理を実行する。経路探索方法は、コンピュータが、前記始点と前記終点とを繋ぐ経路のうち距離の短い上位所定数の最短経路を探索する場合に、前記所定数より小さい値が設定される制限値を用いて、前記始点および前記終点の双方向から、前記始点からの経路と前記終点からの経路とが結合する結合点を特定する処理を実行する。経路探索方法は、コンピュータが、前記結合点を含む前記複数のノードそれぞれに対応付けて保持する経路の数を前記制限値以下に制限して、各ノードに到達する経路のうち距離が短い経路を保持する処理を実行する。経路探索方法は、コンピュータが、前記各ノードに対応付けた保持される前記経路を用いて、前記結合点に至る経路から前記上位所定数の最短経路を探索し、探索された前記上位所定数の経路を出力する処理を実行する。
一実施形態によれば、最短経路の探索時間を短縮することができる。
図1は、実施例1にかかる探索装置を説明する図である。 図2は、実施例1にかかる探索装置の機能構成を示す機能ブロック図である。 図3は、グラフデータDBに記憶されるグラフデータの例を示す図である。 図4は、入力されるグラフデータから出力結果までの一例を示す図である。 図5は、実施例1にかかる処理の流れを示すフローチャートである。 図6は、頂点vと始点、頂点vと終点の関係を説明する図である。 図7は、実施例2にかかるグラフのデータ構造例を示す図である。 図8は、実施例2にかかるk−最短経路探索処理の流れを示すフローチャートである。 図9は、実施例2にかかるvの延長処理の流れを示すフローチャートである。 図10は、実施例2にかかるvの隣接頂点処理の流れを示すフローチャートである。 図11は、実施例2にかかる延長判定処理を行う関数であるis_extended(x,i,path_length,is_v)の流れを示すフローチャートである。 図12は、実施例2にかかる具体例のキュー状況および初期化状態を説明する図である。 図13は、始点および終点における隣接頂点処理を説明する図である。 図14は、始点および終点における隣接頂点処理後のデータ構造を説明する図である。 図15は、頂点1および頂点5における隣接頂点処理を説明する図である。 図16は、頂点1および頂点5における隣接頂点処理後のデータ構造を説明する図である。 図17は、頂点3および頂点7における隣接頂点処理を説明する図である。 図18は、頂点3および頂点7における隣接頂点処理後のデータ構造を説明する図である。 図19は、頂点2における隣接頂点処理を説明する図である。 図20は、頂点2における隣接頂点処理後のデータ構造を説明する図である。 図21は、頂点4における隣接頂点処理を説明する図である。 図22は、頂点4における隣接頂点処理後のデータ構造を説明する図である。 図23は、頂点5および頂点6における隣接頂点処理を説明する図である。 図24は、頂点5および頂点6における隣接頂点処理後のデータ構造を説明する図である。 図25は、頂点6および頂点1における隣接頂点処理を説明する図である。 図26は、頂点6および頂点1における隣接頂点処理後のデータ構造を説明する図である。 図27は、対角線上の結合点における部分的最短経路を説明する図である。 図28は、実施例3にかかるパラメータαの最適化処理の流れを示すフローチャートである。 図29は、パラメータαの最適化の測定結果を示す図である。 図30は、pmax(横軸)と、最大時間比または精度(縦軸)の関係を示す図である。 図31は、近似の有無による比較結果を説明する図である。 図32は、maxによる削減効果を説明する図である。 図33は、拡張Dijkstraとの比較を説明する図である。 図34は、ハードウェア構成例を説明する図である。 図35は、幅優先探索法を説明する図である。 図36は、Dijkstra法を説明する図である。 図37は、双方向探索法を説明する図である。
以下に、本願の開示する経路探索方法、経路探索プログラム、経路探索装置および経路探索のデータ構造の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。また、各実施例は、矛盾のない範囲内で適宜組み合わせることができる。
[探索装置の説明]
図1は、実施例1にかかる探索装置10を説明する図である。図1に示す探索装置10は、始点から終点までのk−最短経路を探索するコンピュータ装置の一例である。例えば、探索装置10は、入力データとして、各辺に重みが設定された重み付きグラフであり、辺に向きがない無向グラフである、グラフデータを受け付ける。そして、探索装置10は、グラフデータにおける各頂点のうち始点と終点を設定する。
続いて、探索装置10は、始点および終点を繋ぐ経路のうちユーザが所望する探索数を取得し、取得した探索数より小さい値と、取得したグラフデータに対して設定される中間点の数に関する値とを用いて、グラフデータのノードのうち始点および終点の双方向から合流点に至るまでの経路の数を特定する。その後、探索装置10は、特定された経路の数を基にして、特定した始点および終点を繋ぐ経路を検索し、検索された経路を出力する。
例えば、探索装置10は、Dijkstra法を最短経路探索に拡張した拡張Dikstra法を、さらに双方向探索するようにした方式を用いて、結合点を含む中間点において保持する最短経路の数をk以下に制限することで、高速化を図る。図1の例では、探索装置10は、始点から終点までの経路のうち、最短である1番目の経路、2番目の経路、3番目の経路の3経路を探索する。
[探索装置10の機能構成]
図2は、実施例1にかかる探索装置10の機能構成を示す機能ブロック図である。図2に示すように、探索装置10は、通信部11、記憶部12、制御部20を有する。
通信部11は、他の装置の間の通信を制御する処理部であり、例えば通信インタフェースなどである。例えば、通信部11は、管理者の端末から、グラフデータを受信したり、k−最短経路の探索指示を受信したりする。また、通信部11は、探索結果を指定端末に送信したり、探索結果を表示する画面を指定端末に送信したりする。
記憶部12は、プログラムやデータを記憶する記憶装置の一例であり、例えばメモリやハードディスクなどである。この記憶部12は、グラフデータDB13を記憶する。
グラフデータDB13は、探索対象であるグラフデータを記憶するデータベースである。図3は、グラフデータDB13に記憶されるグラフデータの例を示す図である。図3に示すように、探索対象のグラフデータは、0から8までの9個の頂点と、各辺に重みが設定された重み付きの無向グラフである。重みは、言い換えると辺の長さである。
具体的には、頂点0と頂点1との間の辺、頂点1と頂点2との間の辺、頂点2と頂点5との間の辺、頂点3と頂点4との間の辺、頂点4と頂点5との間の辺、頂点5と頂点8との間の辺、頂点6と頂点7との間の辺、頂点7と頂点8との間の辺に対しては、重み「1.0」が設定されている。また、頂点0と頂点3との間の辺、頂点3と頂点6との間の辺、頂点1と頂点4との間の辺、頂点4と頂点7との間の辺に対しては、重み「2.0」が設定されている。なお、以降では、グラフデータについて、重みが「1.0」の辺を点線で図示し、重みが「2.0」の辺を実線で図示する。
制御部20は、探索装置10全体を司る処理部であり、例えばプロセッサなどである。制御部20は、初期設定部21、探索部22、出力制御部23を有する。なお、初期設定部21、探索部22、出力制御部23は、プロセッサが有する電子回路の一例やプロセッサが実行するプロセスの一例などである。
初期設定部21は、管理者などのユーザから各種設定を受け付けて各種設定を行う処理部である。例えば、初期設定部21は、k−最短経路の始点と終点、探索数(kの値)などを設定する。
探索部22は、頂点処理部22a、結合点処理部22b、経路生成部22cを有する。この探索部22は、優先度キューなどのデータ構造に探索処理の途中結果を格納して保持しつつ、グラフデータDB13に記憶されるグラフデータに対して、初期設定部21により設定された値を用いてk−最短経路の探索を実行する処理部である。
頂点処理部22aは、始点からと終点からの両方向で、各頂点に至るまでの最短経路の候補を特定する処理部である。具体的には、頂点処理部22aは、双方向探索を実行しつつ、各頂点に至る複数の経路のうち、長さが短い順に指定数(k本)以下だけ保持する。例えば、kとして2が設定された場合、保持する経路数を1などと設定する。なお、以降では、長さがLである頂点Aから頂点Bへの経路を、L[頂点B,頂点A]と記載する。頂点Aから頂点Bへの間に他の頂点がある場合は、それを順に並べるものとする。たとえば、頂点Aから、頂点Bまでの間に、順に頂点C,頂点Dがある場合、L[頂点B,頂点D、頂点C、頂点A]と書くことにする。
ここで、図3を例に、k−最短経路として2(=k)を設定し、保持する経路数の閾値を1として具体的に説明する。頂点処理部22aは、始点の頂点0に隣接する頂点1について、頂点0から頂点1への経路として1.0[1,0]を特定する。ここで、頂点処理部22aは、頂点1への経路の保持数が0であり閾値(1)以下であることから、頂点1の経路として1.0[1,0]を保持する。同様に、頂点処理部22aは、始点の頂点0に隣接する頂点3についても、頂点0から頂点3への経路として2.0[3,0]を保持する。
また、頂点処理部22aは、終点の頂点8に隣接する頂点5について、頂点8から頂点5への経路として1.0[5,8]を特定し、頂点5への経路の保持数が0であり閾値(1)以下であることから、頂点5の経路として1.0[5,8]を保持する。同様に、頂点処理部22aは、終点の頂点8に隣接する頂点7についても、頂点8から頂点7への経路として1.0[7,8]を保持する。
続いて、頂点処理部22aは、探索済みの頂点1に隣接する頂点2について、頂点0から頂点2への経路として2.0[2,1,0]を特定し、頂点2への経路の保持数が閾値(1)以下であることから、頂点2までの経路として2.0[2,1,0]を保持する。同様に、頂点処理部22aは、探索済みの頂点1に隣接する頂点4について、頂点0から頂点4への経路として3.0[4,1,0]を特定し、頂点4への経路の保持数が閾値(1)以下であることから、頂点4までの経路として3.0[4,1,0]を保持する。
また、頂点処理部22aは、探索済みの頂点3に隣接する頂点4について、頂点0から頂点4への経路として3.0[4,3,0]を特定する。しかし、頂点処理部22aは、この経路を保持すると、頂点3への経路の保持数が閾値(1)を超えることとなり、さらに、すでに保持されている頂点4への経路「3.0[4,1,0]」の長さが現在の保持対象「3.0[4,3,0]」と同じであることから、現在の保持対象「3.0[4,3,0]」を破棄する。同様に、頂点処理部22aは、探索済みの頂点3と隣接する頂点6について、頂点0から頂点6への経路として4.0[6,3,0]を特定し、頂点6への経路の保持数が閾値(1)以下であることから、頂点6までの経路として4.0[6,3,0]を保持する。
このように、頂点処理部22aは、優先度キューなどのデータ構造を用いて、各頂点までの経路探索において頂点毎の経路保持数を制限することで、処理量の削減を図る。また、頂点処理部22aは、始点と終点の双方向から上記処理を実行し、全頂点または所望の最短経路が探索されるまで実行する。
結合点処理部22bは、頂点処理部22aによって探索された各頂点までの経路を用いて、始点側からの探索と終点側からの探索とが結合する結合点を特定する処理部である。具体的には、結合点処理部22bは、終点側から経路が探索されたある頂点について、その頂点への経路が始点側からの探索済みである場合に、その頂点を結合点と特定する。そして、結合点処理部22bは、結合点に関する情報を経路生成部22cに通知する。
例えば、結合点処理部22bは、頂点処理部22aによって終点から頂点2までの経路「2.0[2,5,8]」が探索され保持されたときに、始点から探索された頂点2までの経路「2.0[2,1,0]」が探索済みであれば、頂点2を結合点と特定する。一方、結合点処理部22bは、頂点処理部22aによって終点から頂点2までの経路「2.0[2,5,8]」が探索された保持されたときに、始点から探索された頂点2までの経路が未探索であれば、頂点2を結合点と特定しない。
経路生成部22cは、頂点処理部22aの探索結果と結合点処理部22bの特定結果とを用いて、k−最短経路を生成する処理部である。経路生成部22cは、結合点が特定されると、始点から結合点までの経路と終点から結合点までの経路とを組み合わせて経路を生成する。そして、経路生成部22cは、生成した経路を最大k本保持する。このため、経路生成部22cは、生成した経路を保持する際に、重みが大きい(経路長が長い)経路を削除することで、最大k本の制限を遵守する。
上記例で説明すると、経路生成部22cは、頂点2が結合点として特定された場合、始点から結合点(頂点2)の経路「2.0[2,1,0]」と、終点から結合点(頂点2)の経路「2.0[2,5,8]」とを組み合わせて、始点から終点までの経路「4.0[0,1,2,5,8]」を生成する。そして、経路生成部22cは、現時点での保持数が2本(k=2)未満であれば、この経路「4.0[0,1,2,5,8]」をそのまま保持する。
また、経路生成部22cは、現時点での保持数が2本(k=2)であり、経路長が4.0より大きい他経路がある場合には、他経路の中で最長のものを削除してこの経路「4.0[0,1,2,5,8]」を保持する。また、経路生成部22cは、現時点での保持数が2本(k=2)であり、経路長が4.0以上の他経路が保持されていない場合には、この経路「4.0[0,1,2,5,8]」を破棄する。このように、経路生成部22cは、結合点が特定されるたびに、k本以下の制限を遵守しつつ、k−最短経路の保持を行う。
出力制御部23は、探索部22によって生成されたk−最短経路の出力を実行する処理部である。具体的には、出力制御部23は、探索部22によって各頂点に対する上記処理の実行が完了した時点で、経路生成部22cにより生成されて保持されるk本の経路を、記憶部12等に格納する。そして、出力制御部23は、k本の経路を、k−最短経路の探索結果として、管理者の端末に送信したり、ディスプレイ等の表示部に出力したりする。
ここで、k−最短経路の探索の具体例を説明する。図4は、入力されるグラフデータから出力結果までの一例を示す図である。図4のグラフデータは、会社や会社の経営者を頂点とする重みなしのグラフであり、黒い頂点は経営者を表し、黒い点を白い円で囲った頂点は会社を表すものとする。そして、関係の深い会社や人間の間を辺で結んだものである。たとえば、会社間の関係であれば、関係会社あるいは大量株所有といった関係である。人間と会社の関係ではその会社の経営者や大株主といった関係である。
この時、もしある二人の人物が不正に関わった可能性があるとされた際、二人の人物の間の最短経路を調べることによって、二人がどういう経路で知り合ったか、あるいはその不正に関わった他の人物や会社を調べることが容易になる。ただし、最短経路以外の経路で関わった可能性も高い。こういう場合、k−最短経路探索で複数の経路を調べて、探索結果のk−最短経路の結果を画面に表示したりすることにより、より確度の高い捜索が可能となる。
図4の例では、a氏とb氏とが不正に関わった場合に、a氏を起点、b氏を終点として、3つの最短経路探索(k=3)を実行した例である。ここでは、探索部22は、最短の経路である経路No.1と、2番目の経路である経路No.2と、3番目の経路である経路No.3とを探索したとする。この場合、出力制御部23は、最短経路「起点(a氏)、中間点(A社、c氏、B社)、終点(b氏)」、2番目の経路「起点(a氏)、中間点(A社、D社、B社)、終点(b氏)」、3番目の経路「起点(a氏)、中間点(A社、c氏、C社、B社)、終点(b氏)」を含む一覧表を生成して表示することができる。
[処理の流れ]
次に、上述した処理を、優先度キューなどを用いて具体的に実行する例を説明する。図5は、実施例1にかかる処理の流れを示すフローチャートである。図15に示す処理は、始点側Q[0]からと終点側Q[1]からの交互に実行され、いずれかのQが空になると、他方のQについて処理が実行され、両方のQが空になると、探索された経路が出力される。
図5に示すように、初期設定部21は、処理開始が指示されると、初期化処理を実行する(S101)。具体的には、初期設定部21は、グラフデータを取得し、始点、終点の設定、探索数(k)と最大経路数pmaxを設定する。また、初期設定部21は、求めるべき最短経路を入れる優先度キューtotalQと始点側および終点側の優先度付キューQ[0]、Q[1]を初期化する。なお、totalQは、小さい方からk番目までの経路を入れ、それをk+1番目以上のものは廃棄する。また、初期設定部21は、頂点ごとに始点側、および終点側の経路を保持するためのP[0]とP[1]を初期化する。j番目の頂点に関する経路リストはリストP[i][j]に保持する。
続いて、探索部22は、Q[0]またはQ[1]が空ではない場合(S102:Yes)、iに0を代入して初期化し(S103)、現在のiが1以下であるか否かを判定する(S104)。
そして、探索部22は、iが1以下であり(S104:Yes)、Q[i]が空ではない場合(S105:Yes)、Q[1]から、始点から頂点vまでの経路path_vを取り出す(S106)。例えば、探索部22は、経路path_vをP[i][v.id()]に保持する。なお、v.id()は頂点vの番号である。
続いて、探索部22は、保持している経路数がp_maxより小さいか否かを判定する(S107)。そして、探索部22は、保持している経路数がp_maxより小さい場合(S107:Yes)、経路path_vの結合処理を実行する(S109)。例えば、探索部22は、点vが結合点である場合、path_vとP[opp(i)][v.id()]の経路とを結合し、totalQに入れる。opp(i)は、iの逆側の番号、すなわち、i=0であれば1、i=1であれば0を返す関数である。
その後、探索部22は、頂点vの結合処理を実行し(S110)、iをインクリメントし(S111)、S104を実行する。例えば、探索部22は、頂点vに隣接する頂点wに対し、経路path_w=[w,path_v]を作り、Q[i]に入れる。
なお、S107において、探索部22は、保持している経路数がp_max以上である場合(S107:No)、S111以降を実行する。また、S105において、探索部22は、Q[i]が空である場合(S105:No)、S111以降を実行する。
また、S104において、探索部22は、iが1より大きい場合(S104:No)、S102以降を実行する。また、S102において、探索部22は、Q[0]およびQ[1]が空である場合(S102:No)、探索された経路群を結果として出力する(S112)。
[効果]
上述したように、探索装置10は、ユーザが所望する本数の最短経路を、拡張Dikstra法を用いた双方向探索で探索する際に、探索途中で保持する経路の情報を制限する。このことにより、探索装置10は、頂点の数が膨大であったとしても、ユーザの所望する経路を精度良く探索しつつ、計算量を削減することができる。
次に、上述した実施例1に係る探索装置10が実行する探索処理の詳細なアルゴリズムについて説明する。まず、実施例で用いる用語を説明し、その後にアルゴリズムについて説明する。
[用語の説明]
グラフではその点のことを「頂点」(vertex)、線のことを「辺」(edge)と記載する。グラフの頂点の集合をV、辺の集合をEと表す。このグラフにGと名前を付けた場合、G=(V,E)と表す。すなわち、グラフGは頂点の集合Vと辺の集合Eからなるグラフであるという意味である。
また、辺に向きがないグラフを「無向グラフ」と記載し、向きがあるグラフを「有向グラフ」と記載する。例えば、道路が全て両方向であれば、道路網を無向グラフで表現できる。しかし、一方通行を含む場合は、有向グラフでないと表現できない。
また、各辺に重みがついているグラフを「重み付きグラフ」と記載し、重みがついていないグラフを「重みなしグラフ」と記載する。例えば、鉄道網は頂点を駅、駅間の距離あるいは所要時間を対応する頂点間の辺に付与することで、重み付きグラフとして表現できる。一方、人間関係を友人関係のみに着目し、関係の親密さは問わない場合、友人関係は重みなしグラフで表現できる。
2つの頂点が1つの辺で結ばれている場合、2つの頂点は隣接している(adjacent)という。また、ある頂点vに隣接する頂点からなるリストを頂点vの隣接頂点リストと記載する。重みありグラフの場合は、隣接頂点とその頂点への辺の長さのペアをリストとして持つ。
また、「経路(パス)」について、頂点の列「v,v,・・・,v」において任意のi(1≦i≦n)に対して、vi−1,vが隣接している場合、この頂点の列を経路(パス)と呼ぶ。有向グラフでは、vi−1からvへの辺がEに含まれていることが必要である。なお、vを経路の「始点」、vを「終点」と呼ぶ。本実施例では、頂点は経路上に重複して現れないものとする。
また、「経路の長さ」について、重みなしグラフの場合は、各辺に重み1がついているものと考え、経路上の辺の重みの合計をその「経路の長さ」、あるいは「経路長」と記載する。通常は、2頂点間の経路のうち長さが最も短い経路を「最短経路」と記載する。一般に複数存在する可能性がある。本実施例では、通常の意味での最短経路だけではなく、何番目までかの準最短経路と呼んでもよい経路も単に最短経路と呼ぶことにする。
また、1≦kとして、ある頂点vからある頂点vまでの最も短いものからk番目までのk本の最短経路を「k−最短経路」、それを求める処理を「k−最短経路探索」と記載する。vやvはそれぞれ始点、終点と記載する。また、後述のように双方向探索では、始点、終点の双方から探索を行う。この意味で両者をそれぞれ「出発点」とも呼ぶ。また、始点と終点が一致した経路を閉路と記載する。また、k−最短経路探索における始点と終点の間での探索中に辿られる点を「中間点」と記載する。中間点の一種であるが、始点からの経路と終点からの経路がぶつかる点を「結合点」と記載する。
[アルゴリズムの説明]
最短経路を求めるために、頂点から辺を「辿る」という処理が行われる。この処理をいかに早く打ち切るかが高速化にとって重要である。本実施例では、探索処理の高速化を、「近似的手法による削減」と「maxによる削減(解の候補として求まったk番目の最短経路の長さを利用して無駄な辿りを減らす)」とによって実現する。
例えば、k−最短経路を求める際、その解が必ずしも厳密な解ではなく、近似で十分な場合も多い。交通路、通信路の迂回路や、人間関係のデータ分析などの場合は最適解に十分近ければ、多少厳密性を犠牲にしてもより高速なものが望まれることが考えられる。交通路で言えば、厳密解を求めるのに1分かかる方式よりも、多少精度は落ちても3秒で求まる方式の方が好まれる。また、今日のビッグデータの時代では、データを分析することが要求され、その際に最短経路やk番目までの最短経路を多くの二頂点間で計算することが求められている。その際、大規模データでは膨大な時間がかかることが予想され、その場合は正確さよりも速度が優先される場合が多いと考えられる。
また、「近似的手法による削減」ではパラメータの調節が発生するので、このパラメータの最適化を自動化する。また、グラフには、無向/有向グラフ、重み付き/重みなしグラフがあり、それらの組み合わせで4種類(=2×2)のグラフが考えられるが、本実施例ではその全種類に適用可能である。なお、本実施例では、重み付き無向グラフを前提として説明する。
[近似的手法による削減]
本実施例と一般手法との違いの1つは、結合点を含めた中間点において求める始点あるいは終点からの経路の個数をk本以下に制限することである。なお、ユーザが許容できるとして設定した精度をPminとする。これは、ユーザにより任意に設定変更することができる。
本実施例は、出発点から中間点までの部分的最短経路の求める数をk本以下にすることにより、探索処理を減らすことで高速化を実現する。この制限された部分的な最短経路の数を「最大経路数」と呼び、以降pmaxで表す。pmaxを無作為に減らすと高速化は果たせるが、精度が損なわれる可能性がある。そこで、精度と速度の観点から、αをパラメータとして、式(1)で示される程度に制限する。このように制限することで、結合点では、始点からのk(≦pmax)本の部分的な最短経路と、終点からのk(≦pmax)本の部分的な最短経路が求められる。そして、始点およぶ終点からの最短経路同士を組み合わせることで、k×k本の始点から終点までの最短経路の候補が得られる。このように各結合点で得られた最短経路の候補から、小さい順にk番目までの最短経路を求めることで最終結果を得る。
Figure 2020135207
式(1)が妥当である理由を述べる。式(1)が成立したと仮定し、各結合点で式(1)の右辺で示される本数の部分的な最短経路が始点側および終点側で求まったと仮定すると、結合点では組み合わせることになり、式(2)で示される本数の最短経路の候補が求まる。
Figure 2020135207
一般に、結合点は多く存在するが、その数をcとすると合計で「c×式(2)」の最短経路が求まる。この値は少なくともkを越えている必要があるが、求めたものの中に重複もありうるし、また、数が少なければユーザの精度Pmin以上の要求に応えられないので、kの何倍かは求める必要がある。その数をβとすると、cαk=βk、すなわち式(3)となる。
Figure 2020135207
逆にαの値をこのような値に設定すれば、おおよそユーザの精度の要求に応えられると考えられる。ただし、ここでは、βやcを定数のように扱ったが、実際には、これらの値はkや始点、終点の位置に影響を受ける可能性があり、それに伴い、αも変動する可能性がある。kをユーザが使う範囲で変え、また始点や終点を変えて、その中のαの最大値あるいは平均値を取るというような統計的処理を行うことが考えられる。精度に対する要請が厳しい場合は、最大値を取ることが考えられ、それほど厳しくないのであれば平均値を取ることも考えられる。また、kの値をいくつかの範囲に分け、その範囲ごとにαを決めることも考えられる。パラメータαの最適化については後述する。
[maxによる削減]
maxによる削減では、k番目の最短経路の候補(真にk番目かはわからないが、今までに求まっている中でk番目に短いもの)が求まっていることが前提である。その長さをmaxとする。この手法は、出発点から頂点vまで辿ってきた経路とその長さを優先度キューで管理し、入れて取り出す。図6は、頂点vと始点、頂点vと終点の関係を説明する図である。
図6に示すように、一方の出発点をs、もう一方の出発点をo、キューから取り出された頂点をv、出発点からvまでの経路の長さをlsvとする。なお、本実施例では、双方向の探索を行い、2つのキュー、すなわち一方の出発点s側のキューQともう一方の出発点o側のキューQを利用する。以降、このように文脈から経路が明確な場合、頂点x、y間の経路の長さをlxyで表すことにする。
図6の点線は、始点あるいは終点からの経路を表している。このとき、2つの事象が問題となる。具体的には、(1)vからさらに先を探索するべきか、(2)vからさらに先を探索すべきことになった場合、vに隣接する頂点をwとして、wより先を探索すべきか、すなわち出発点からwまでの経路と長さをQに入れるべきかである。
(1)について考える場合、相手側からも頂点vに到達している図6の(a)と、相手側からは頂点vに未到達である(b)に示す場合が考えられる。具体的には、図6の(a)は、頂点vまで頂点oから既に到達しており、その最短経路の長さをminとする。また、図6の(b)は、頂点vまで頂点oから未だ到達しておらず、キューQに入れられた最短経路の最小値をminとする。図6の(b)では、キューQの先頭、すなわち長さがminの最短経路の先端が頂点xであることを示している。
いずれの場合も「max≦lsv+min」(この不等式を簡単に「maxによる判定式」と呼ぶことにする)が成り立っているのであれば、これ以上、頂点vから延長してもmaxより短い最短経路を求めることはできない。すなわち、このことは、頂点vから延長する必要がなく、探索を打ち切ってよいことを示し、これは次のことから言える。
例えば、頂点vよりもさらに先を辿って到達した頂点yで相手側からの最短経路と合成することでmaxより短い最短経路ができたと仮定する。その時、図6の(c)に示すように、lvo=lvy+lyoであり、min≦lvoでなければならない。このことを2つに分けて考える。(a)の場合であれば、既に到達した経路は頂点oからvまでの最短経路であり、最短経路の定義そのものから、今求めたyを経由した経路の長さもmin以上でなければならないからである。
また、(b)の場合、頂点vに頂点s側から到達した時点では、まだ頂点oからは未到達だったので、min≦lvoでなければならない。なぜなら、lvo<minであれば、キューが優先度キューであることから、求めたyを経由した経路は既にキューから取り出されているはずであり、未到達という仮定に反するためである。
以上のことは、今後、キューQから取り出された頂点がvであった場合に常に成り立つ。これ以降に取り出される頂点vまでの経路の長さは、キューが優先度キューであることから、今取り出された頂点vまでの経路の長さ以上であるはずだからである。このことから、今後は、キューQから取り出された経路の先端が頂点vである場合は、その経路の長さによらず、延長する必要がないと言える。なお、ここで注意すべきは、延長の必要がないのは、頂点vにおける頂点s側からの延長に関してであり、頂点vにおける頂点o側からの延長が必要ないとは言えないことである。
(2)について考える、すなわち頂点vから先に延長できることになった場合である。この場合、頂点vに隣接する頂点wを調べる。そして、頂点wから先を探索すべきかどうか、すなわち頂点wまでの経路をキューQに入れるかどうかが問題になる。この場合も、頂点vの場合と全く同様の理由から、max≦lsw+minが成り立てば、頂点wより先を延長する必要がなく、したがってキューQに入れる必要がないと言える。なお、lswは、lsw=lsv+lvwによって計算でき、lvwは、頂点v、w間の辺の長さである。
ただし、頂点vの場合と違って、今後キューQから取り出された経路の先端が頂点wであった場合に、頂点wまでの経路の長さに依らず、頂点wから延長する必要がないとは言えない。これは、頂点wはキューQから取り出された経路の先端ではなく、lswよりも短い経路が今後キューQから取り出される可能性があるためである。すなわち、言えることは、lswとsからvまでの経路にwを加えたwまでの経路を入れる必要はないということである。
以上より、(1)の場合は頂点vでの出発点側からの延長を停止することが可能となり、(2)の場合は、頂点vを経由した頂点wまでの経路をキューQに入れることが不要となり、その分高速化につながる。実際、後述の実施例4ではおおよそ10倍の高速化をもたらした。ここで説明したmaxによる判定式を中心とした無駄な辿りの削減を簡単に「maxによる削減」と記載することとする。
[近似によるk−最短経路探索処理]
次に、近似によるk−最短経路探索処理に具体的に説明するが、ここでは、グラフの構造やキューの構造などを説明してから、処理の具体的な流れについて説明する。
(1.グラフのデータ構造)
図7は、実施例2にかかるグラフのデータ構造例を示す図である。図7に示すように、グラフは頂点と辺をデータ構造で表現することで表される。図7の(a)は、頂点と辺を表すデータ構造を示す。頂点のデータ構造は、頂点識別子(id)と隣接する頂点への辺のリスト(adj_edge_list)へのポインタ)を含み、リストは配列と同義である。辺のデータ構造は、その辺がつなぐ隣接する頂点(adj_vertex)へのポインタとその辺の長さ(length)を含む。
図7の(b)は、図36に示したグラフを例としたグラフのデータ構造を示す。頂点(id)ごとに、隣接する頂点への辺のリスト「adj_edge_list」を示している。図7の(b)の例では、頂点idが0である頂点0には、重みが1.0である頂点1への辺、重みが2.0である頂点2への辺、重みが3.0である頂点3への辺、重みが4.0である頂点4への辺が接続されていることを示している。
(2.最大経路数)
上述したように、最大経路数pmaxは、「ceil(式(1))」とする。ここで、「ceil(x)」は、浮動小数点数xを整数に切り上げる関数である。
(3.優先度キュー)
最短経路探索で用いられる優先度キューには次の三種類がある。優先度キューには、最短経路の長さを「path_length」、経路を「path」とした際、それらのペア[path_length,path]、あるいは「path_length」のみが入れられる。
(3.1全体キュー)
全体キューを「totalQ」で表す。「totalQ」には、始点から終点までの最も短いものからk番目までの最短経路について各最短経路の長さを「path_length」、経路と「path」とした場合、そのペアである[path_length,path]を入れる。「totalQ」には、最大k個までデータを格納することができ、超過する場合は「path_length」が大きい経路から削除される。「totalQ」の最大値とは、入れられた経路の中で最大の長さをいい、「total.max()」で参照できるものとする。例えば、すでにk個の経路が格納されている「totalQ」に新たに経路を格納する場合、この最大値以上のときは格納されない。「totalQ」の初期状態は空であり、「totalQ」に格納される最短経路の個数は「totalQ.len()」で参照できるものとする。len()は、totalQだけでなく、一般のリストの要素を返す関数で、以下の他のリストでも使われる。なお、本実施例では、上記のようにtotalQ.len()というような書き方もしているが、これはtotalQがlen()という関数の第一引数であることを意味していて、len(totalQ)と同じ意味である。一般に、x.f()はf(x)と同じ意味である。
(3.2始点キュー・終点キュー)
始点側の優先度キューを「Q[0]」、終点側の優先度キューを「Q[1]」と表す。本実施例は、双方向探索であることから、2つのキューを用意する。なお、本実施例では、始点側を0、終点側を1で表すこととする。
例えば、ある頂点までの部分的な最短経路の経路長を「path_length」、経路を「path」とした場合、優先度キューにはこれらのペアである[path_length,path]が格納される。Dijkstra法では経路は一般には格納されないが、最短経路探索では複数の経路を覚えておく必要があるためである。「Q[0]」の初期状態は、始点をvとすると[0.0,[vs]]が格納され、「Q[1]」の初期状態は、終点をvとすると[0.0,[vt]]が格納される。なお、Q[i](i=0,1)に格納されている経路の中で最短の経路、すなわち先頭に格納されている経路の「path_length」は、「Q[i].min()」で参照できるものとする。
(3.3各頂点キュー)
各頂点には、2つの優先度キュー「q0」と「q1」を用意し、始点および終点から頂点vまでの部分的な最短経路の長さをそれぞれ「q0」と「q1」に格納する。「q0」、「q1」には、最大pmax個までの最短経路長「path_length」だけが格納される。すでにpmax個が格納されている場合、「path_length」がそれらの最大値以上であれば格納されない。
「q0」、「q1」は、実際に格納された場合、すなわち格納されている個数がpmax未満か最大値未満の場合は「真」を返し、逆に格納されなかった場合は「偽」を返す。そして、リストqのq[v.id()]に[q0,q1]を格納し、q0はq[v.id()][0]、q1はq[v.id()][1]によって参照されるものとする。ここで、「v.id()」は、vの識別子(頂点の数をnとした時、各頂点に付けられた0からn−1までの番号)を返す関数である。
なお、「q0」あるいは「q1」に長さだけ格納するのは、長さがpmax番目以内であれば、経路はQ[0]あるいはQ[1]に格納され、pmax番目より大きければ、本実施例の方針からその経路は破棄することにしており、どちらの場合も、「q0」あるいは「q1」経路を記憶する必要がないためである。[q]の初期状態は、始点、終点の頂点識別子をそれぞれs、tとして、q[s][0]、q[t][1]の値だけ[0.0]であり、それ以外の要素はすべて空のリスト[]である。
(3.4部分的な最短経路リスト)
頂点vごとに始点側および終点側から到達した部分的な最短経路を管理するリストをPとし、P[v.id()][i]がi(i=0、1)側で、頂点vに到達した一般に複数の最短経路のリストを表すものとする。すなわち、i=0の場合は始点から頂点vに到達した経路のリストを表し、i=1の場合は終点からの経路のリストを表す。k番目の最短経路は、P[v.id()][i][k-1]で表されることになる。また、各最短経路は、全体キューや始点キュー・終点キューと同様、[path_length,path]で表されるものとする。k番目の最短経路の「path_length」や「path」はそれぞれ「P[v.id()][i][k-1].path_length」、「P[v.id()][i][k-1].path」で参照できるものとする。なお、Pの初期状態は、すべての要素が空のリスト[]である。
(3.5結合点を管理するリスト)
リスト「is_joint」の「is_joint[v.id()]によって頂点vが結合点であるかどうかを表す。すなわち、その値が真であれば頂点vが結合点であることを示す。なお、リスト「is_joint」の初期状態は、すべての要素がFalseである。
(3.6延長可能性を示すリスト)
リスト「is_extended_list」の「is_extended_list[v.id()][i]」によって頂点vから延長されるかどうかを表す。例えば、i=0の場合は始点から頂点vに到達した場合について表し、i=1の場合は終点から頂点vに到達した場合について表す。すなわち、その値が真であれば頂点vから先を延長する(探索する)必要があることを示す。なお、「is_extended_list」の初期状態は、すべての要素がTrueである。
(4.k−最短距離探索処理のフローチャート)
図8は、実施例2にかかるk−最短経路探索処理の流れを示すフローチャートである。図8に示すように、探索装置10の探索部22は、「0<Q[0].len()、または、0<Q[1].len()」を満たす場合(S11:Yes)、iに0を代入して(S13)、「i≦1」を満たすか否かを判定する(S14)。
そして、探索部22は、「i≦1」を満たす場合(S14:Yes)、「Q[i].len()=0」を満たすかどうかを判定し(S15)、これを満たす場合(S15:Yes)、iをインクリメントして(S16)、S14以降を繰り返す。
一方、探索部22は、「Q[i].len()=0」を満たさない場合(S15:No)、Q[i]の先頭を取り出し、その長さをpath_length_vに、経路をpath_vに設定し、vにpath_vの0番目の要素を設定する(S17)。Q[i].deque()は、キューの先頭を取り出す関数であり、Q[i].deque()の値は経路長l、経路pのペアからなるリスト[l,p]である。キューには、経路の長さと、経路の組が、経路長が短い順に並んでいるので、その最短のものを取り出すことになる。なお、一般に[a,b]=[c,d]は、aにcを、bにdを設定することを意味する。その後、探索部22は、リスト「is_extended(v,i,path_length,True)」が「True」か否かを判定し(S18)、「True」である場合は(S18:Yes)、頂点vの延長処理を実行する(S19)。なお、延長処理後は、S16以降が繰り返される。
また、探索部22は、リスト「is_extended(v,i,path_length)」が「True」ではない場合(S18:No)、S16以降を繰り返す。また、S14において、探索部22は、「i≦1」を満たさない場合(S14:No)、S11に戻って以降の処理を繰り返す。また、S11において、探索部22は、「0<Q[0].len()、または、0<Q[1].len()」を満たさない場合(S11:No)、「totalQ.sorted_list()」が返す値を変数lp_listに代入し(S12)、処理を終了する。
上述した処理を具体的に説明すると、全体の処理は、条件「0<Q[0].len()、または、0<Q[1].len()」が示すように、優先度キューQ[0]あるいはQ[1]のどちらかが空である限り続けられる。そして、その空でないQ[0]やQ[1]から取り出された[path_length_v,path_v]に対して、「v=path_v[0]」によって、出発点からの部分的な最短経路における最後の頂点vが取り出される。
なお、「len()」は、優先度キューに格納された要素数など、リストに格納された要素の数を返す関数(メソッド)である。また、「sorted_list()」は、「totalQ」に格納された経路長lと経路pの組[l,p]をlの小さい順にソートしたリスト、すなわち、このアルゴリズムが求めるべきk個の最短経路の長さと経路のペアのリストを返す関数である。
(5.延長処理のフローチャート)
図9は、実施例2にかかるvの延長処理の流れを示すフローチャートである。図9に示すように、探索装置10の探索部22は、「is_joint[v.id()]=False and 0<P[v.id()][opp(i)].len()」を満たす場合(S21:Yes)、「is_joint[v.id()]」に「True」を代入する(S22)。
続いて、探索部22は、「P[v.id()].append([path_length,path_v])」により、P[vid][i]に[path_length,path_v]を追加する(S23)。そして、探索部22は、「is_joint[v.id()]」が「True」であるか否かを判定する(S24)。
そして、探索部22は、「is_joint[v.id()]」が「True」である場合(S24:Yes)、S25を実行する。具体的には、探索部22は、「path_v」と「P[v.id()][opp(i)]」の経路群を合成する。そして、探索部22は、合成した経路のうち、ループを含まず、totalQに含まれず、かつ、totalQの最大値より小さい長さの経路をtotalQに格納する。
その後、探索部22は、頂点vの隣接頂点処理を実行する(S26)。なお、S24において、探索部22は、「is_joint[v.id()]」が「True」ではない場合(S24:No)、S25を実行することなくS26を実行する。また、S21において、探索部22は、「is_joint[v.id()]=False and 0<P[v.id()][opp(i)].len()」を満たさない場合(S21:No)、S22を実行することなくS23を実行する。
上述した処理を具体的に説明すると、条件「is_joint[v.id()]=False」は、頂点vが結合点でないこと、条件「0<P[v.id()][opp(i)].len()」は、相手側の出発点から頂点vへの部分的な最短経路の個数が0より大きいこと、すなわち相手側の出発点から頂点vへ既に到達していて、頂点vがこの時点で結合点になったことを示している。そこで、「is_joint[v.id()]=True」とする。ここで、opp(i)は、iの相手を返す関数である。すなわち、i=0の場合は1を返し、i=1の場合は0を返す。また、「P[v.id()].append([path_length,path_v])」により、P[vid][i]に[path_length,path_v]が追加される。
そして、「is_joint_list[v.id()]=True」により結合点であるか否かが判定され、結合点である場合、「path_v」と「P[v.id()][opp(i)]」の経路群が合成される。すなわち、[path_length,path_v]とP[vid][opp(i)]とに格納されている部分的な最短経路を組み合わせることで、始点から終点までの最短経路が合成される。そして、合成された最短経路にループがなく、totalQに格納されている最短経路と異なり、totalQの最大値より小さいという3つの条件を満たした場合に、合成された最短経路がtotalQに格納される。
ここで、経路の合成についてより具体的に説明する。「P[v.id()][opp(i)]」には、[[l1,p1],[l2,p2],・・・[lk,pk]]が格納されているものとする。「li」は経路長の長さであり、「pi」は経路である。そして、[path_length_v,path_v]とこれらの経路群を合成する。すなわち、[path_len+li,path_v+pi](i=1,2・・・k)が作られる。最後に頂点vからの経路を延長するために、頂点vに隣接する頂点に関する処理が行われる。
(6.隣接頂点処理のフローチャート)
図10は、実施例2にかかるvの隣接頂点処理の流れを示すフローチャートである。図10に示すように、探索装置10の探索部22は、「v.adj_edge_list()」に未処理の[w,edge_length]が残っている場合(S31:Yes)、「w」が「path_v」に含まれていないかどうかを判定する(S32)。
そして、探索部22は、「w」が「path_v」に含まれていない場合(S32:Yes)、「path_length_w」に「(path_length_v)+(edge_length)」を代入する(S33)。
そして、「is_extended(w,i,path_length_w,False)」が「True」か否かを判定し(S34)、「True」である場合に、S35が実行される。
そして、探索部22は、「q[v.id][i].enque(path_length_w)」が「True」である場合(S35:Yes)、「path_w=[w,path_v]」によって「w」までの経路を生成し、Q[i]に「path_length_w,path_w」を格納する(S36)。その後は、S31以降が繰り返される。
なお、探索部22は、S35において「q[v.id][i].enque(path_length_w)」が「True」ではない場合(S35:No)、S32において「w」が「path_v」に含まれている場合(S32:No)、S34において「is_extended(w,i,path_length_w,False)」が「True」ではない場合(S34:No)、S31以降を繰り返す。
また、探索部22は、S31において、「v.adj_edge_list()」に未処理の[w,edge_length]が残っていない場合(S31:No)、処理を終了する。
上述した処理を具体的に説明すると、「v.adj_edge_list()」は、頂点vに隣接する頂点wと、頂点vと頂点wの間の辺の長さ「edge_length」のペア「w,edge_length」のリスト(これを隣接頂点リストと呼ぶ)を返す関数である。ここに、未処理の「w,edge_length」が残っている間、処理が継続して実行される。
次に、頂点wが頂点vまでの経路「path_v」に含まれていないことを確認する。頂点wが既にあればループがあることになるからである。
次に、「path_length_w=path_length_v+edge_length」により、出発点から頂点wまでの最短経路の長さを求める。そして、「is_extended(w,i,path_length_w,False)」が「True」か否かを判定し、「True」である場合に、q_list[w.id()][i].enque(path_length_w)の値で優先度キューにpath_length_wが格納されるかを判定する。ここで、格納できるのであれば、path_length_wが頂点wに今まで到達した経路の中でpmax番目以内に入っていることになる。すなわち、頂点w以降に延長できる可能性があることになる。ここで可能性があると言っているのは、これ以降、頂点wにこの経路より短い最短経路が到達して、この経路がpmax以内に入らない可能性もあるためである。
そこで、path_w=[w,path_v]によって頂点wまでの経路を生成し、Q[i].enque([path_length_w,path_w])により、Q[i]に「path_length_w,path_w」が格納される。なお、path_w=[w,path_v]と頂点vまでの経路path_vを利用して、path_wを効率的に定義することができる。
(7.延長判定処理のフローチャート)
図11は、実施例2にかかる延長判定処理を行う関数であるis_extended(x,i,path_length,is_v)の流れを示すフローチャートである。xは頂点である。iは始点側の場合0、終点側の場合1を取る整数である。path_lengthは、頂点xまでの始点からの距離である。is_vは、Trueであれば頂点xがvであること、すなわち図8のk−最短経路探索処理で呼ばれることを示し、Falseであればwであること、すなわち図10の隣接頂点処理で呼ばれることを示す。パラメータ以外の他のデータ構造は今までに説明したものであり、この関数の中から参照できるものとする。図11に示すように、探索装置10の探索部22は、rにTrueを代入し(S311)、「is_extended_list[x.id()][i]」がTrueか否かを判定する(S312)。
続いて、探索部22は、「is_extended_list[x.id()][i]」がTrueである場合(S312:Yes)、P[x.id()][i].len()がpmaxより小さいか否かを判定する(S313)。
そして、探索部22は、P[x.id()][i].len()がpmaxより小さい場合(S313:Yes)、k番目の最短経路が求まっていて、その経路長maxが求まっているか否かを判定する(S314)。
ここで、探索部22は、k番目の最短経路およびその経路長maxが求まっている場合(S314:Yes)、P[x.id()][opp(i)].len()が0より大きいか否かを判定する(S315)。そして、探索部22は、P[x.id()][opp(i)].len()が0に等しく(S315:No)、Q[opp(i)].len()が0に等しい場合(S316:No)、is_extended_list[x.id()][i]にFalseを代入する(S317)。
一方、探索部22は、P[x.id()][opp(i)].len()が0より大きい場合(S315:Yes)、P[x.id()][opp(i)][0].path.lengthを「min」に代入する(S318)。また、探索部22は、Q[opp(i)].len()が0より大きい場合(S316:Yes)、Q[opp(i)].min()を「min」に代入する(S319)。また、探索部22は、S317を実行後、「r=False」として(S322)、値rを返し、処理を終了する。
また、探索部22は、S318またはS319を実行後、「path_length+min」がmaxより小さいか否かを判定する(S320)。そして、探索部22は、「path_length+min」がmaxより小さい場合(S320:Yes)、「r=True」のままでとして、値rを返して、処理を終了する。
また、探索部22は、「path_length+min」がmax以上である場合(S320:No)、is_vが「True」であるかを判定し(S321)、そうであればS317を実行し、そうでなければS322を実行する。なお、S314において、探索部22は、k番目の最短経路の経路長がまだ求まっていない場合(S314:No)、値rを返して、処理を終了する。
上述した処理を具体的に説明する。図11は、頂点vや頂点wが延長されるか判定する関数is_extended()のフローチャートである。
S312で「is_extended_list[x.id()][i]」がFalseであれば、頂点xから先に延長する必要がないことを意味するので、S322で「r=False」として、値rを返して、処理を終了する。また、S313で、P[x.id()][i].len()がpmaxに達していれば、この頂点までの部分的最短経路をこれ以上求める必要がないので、S317で「is_extended_list[x.id()][i]」をFalseとしている。したがって、次の処理タイミングからは、S312で「r=False」と即時に判定されることになる。この条件により、探索処理の削減が実現される。
また、S314において、「k番目の最短経路が求まっている」とは、全体キュー「totalQ」にすでにk個の最短経路が格納されていて(このことは、totalQ.len()の値がkに等しいか判定することでわかる)、「その経路長がmax」とは、totaQ.max()の値をmaxとすることを意味している。この場合に、S315以降において、maxによる削減が可能かどうかの判定を行うことにより、高速化を実現できる。
また、S318やS319で求めているminは、S315の条件が成り立つ場合はS318により値が設定され、成り立たずにS316が成り立つ場合は、S319により値が設定される。そして、S320のmaxによる判定式が成り立つ場合は、maxより短い始点から終点までの最短経路が求まる可能性があるので、頂点xでの延長は停止しないと判定される。しかし、そうでない場合は、S321で頂点xが頂点vか頂点wかによって分かれ、頂点vの場合は、S317によって頂点xでの出発点側からの延長処理を停止するように設定される。すなわち、無駄な延長処理を妨げることができ、処理の高速化につながる。一方、頂点wの場合は、S322によって単に頂点wまでの経路の延長は行わない。すなわちその経路をキューには入れないと判定される。このことも、頂点vの場合のように、頂点wでの延長を行わないとは言えないまでも、キューに入れることを妨げることで高速化に寄与する。
[動作の具体例]
次に、図12から図27を用いて、上述した処理の具体例を説明する。図12は、実施例2にかかる具体例のキュー状況および初期化状態を説明する図である。図12の(a)に示すように、ここでは、二次元格子状のグラフを用いて説明する。このグラフは、9個の頂点と12本の辺からなり、各頂点には0から8までの識別子がつけられている。また、各辺には、1.0か2.0の重みが付けられている。距離的には同じであるが、たとえば頂点間に要する時間などが異なる。なお、この具体例では、重みを区別しやすいように、重みが2.0の辺を実線で示し、重みが1.0の辺を破線で示す。このことを利用して、以降の図では辺の重みの記載を省くことにする。そして、頂点0を始点、頂点8を終点とする。なお、最短経路を2番目まで求める、すなわち、k=2とする。また、最大経路数pmaxは1とする。
(初期状態)
図12の(b)は、各キューの初期状態を示す図である。キューQの0、1の列がそれぞれQ[0]、Q[1]を示している。また、i=0,1,・・・,8として、q[i]、P[i]、is_extended_list[i]の0、1の列が、それぞれq[i][0]、q[i][1]、P[i][0]、P[i][1]、is_extended_list[i][0]、is_extended_list[i][1]を表している。is_extended_listは図中では、図を簡略化するためis_extと略されている。また、初期値のTrueも略し、今後Falseとなる場合だけを図示する。
なお、図をさらに簡略化するため以下のようにする。リストを表す括弧([、])は省略し、頂点はvと表すべきところ、単に整数iで表す。また、経路も再帰的な構造を簡略化し、平坦なリストの形で記載する。たとえば、[3,[2,[1]]]と記載すべきところを[3,2,1]と記載する。また、is_joint_listは図中には表示せず、代わりにP[i]を太字で記載することで、is_joint_list[i]がTrueであることを示すことにする。
(始点・終点における処理)
図13は、始点および終点における隣接頂点処理を説明する図である。図14は、始点および終点における隣接頂点処理後のデータ構造を説明する図である。ここでは、頂点0や頂点8、それらに隣接する頂点1、3、5、7に関する処理である。図13に示すように、探索部22は、始点側については頂点0に隣接する頂点1と頂点3、および、終点側については頂点8に隣接する頂点5と頂点7に対して、経路の探索を実行し、その結果を図14に示す各データ構造に格納する。
まず、始点側について探索処理が実行される。図13に示すように、探索部22は、始点である頂点0と隣接する頂点1と頂点3のうち、頂点1について処理を実行する。なお、頂点3を先に処理しても構わないが、基本的にリスト「v.adj_edge_list()」に格納されている順番に処理する。そして、以下では頂点番号の順にリストに格納されているものとして説明する。具体的には、探索部22は、始点側の優先度キューを「Q[0]」から[0.0,[0]]を取り出して、P[0][0]に格納する。続いて、探索部22は、頂点0から頂点1への長さ「1.0」を特定し、頂点1のq[1][0]の格納数がpmax(=1)未満であることから、q[1][0]に「1.0」を格納する。そして、探索部22は、始点側の優先度キューQ[0]に、始点から頂点1への経路情報[長さ,経路=[頂点,頂点]]として[1.0,[1,0]]を格納する。
同様に、探索部22は、頂点0から頂点3への長さ「2.0」を特定し、頂点3のq[3][0]の格納数がpmax(=1)未満であることから、q[3][0]に「2.0」を格納する。そして、探索部22は、始点側の優先度キューQ[0]に、始点から頂点3への経路情報[長さ,経路=[頂点,頂点]]として[2.0,[3,0]]を格納する。
次に、終点側について探索処理が実行される。図13に示すように、探索部22は、終点である頂点8に対しても、頂点0と同様の処理を実行することで、終点側の優先度キューを「Q[1]」から[0.0,[8]]を取り出して、処理対象である頂点8に対応するリストP[8][1]に[0.0,[8]]を格納する。また、探索部22は、頂点8に隣接する頂点5のリストq[5][1]に[1.0]を格納し、頂点8に隣接する頂点7のリストq[7][1]に[1.0]を格納する。また、探索部22は、終点側の優先度キューQ[1]に、終点から頂点5への経路情報[1.0,[5,8]]と、終点から頂点7への経路情報[1.0,[7,8]]を格納する。
上記処理をより詳細に説明する。まず、探索部22は、Q[0]やQ[1]が空ではないことから、図8のS11の条件が成り立つので、S13の「i=0」を実行する。続いて、探索部22は、S14が成り立つことから、Q[0]が空でないのでS17を実行し、Q[0]から[path_length_v,path_v]=[0,0,[0]]を取り出す。すなわち、path_length_v=0,0,path_v=[0]が設定される。なお、ここでは、頂点識別子がiである頂点をviと書くことにすると、path_v=[v0]と書くべきところを簡略化している。そして、v=path_v[0]により、v=0が設定される。
続いて、探索部22は、S18でS19以下のvの延長処理を行うか否かを判定する関数is_extended()を呼び出す。そして、探索部22は、図11のS312やS313が少なくとも初期状態では成り立つので、S314を実行する。しかし、探索部22は、最短経路が1本も見つかっていないので、S3113において、S311で設定されたままのr=Trueで処理を戻す。すなわち、探索部22は、延長処理を行うと判定し、図8のS19を実行する。
その後、探索部22は、図9のS21の頂点vが結合点になるかどうかを判定する条件が未成立と判定してS23を実行し、P[0][0]に[0,0,[0]]を追加する。ここで、頂点vは結合点ではないので、S24の式が成り立たず、S26の頂点隣接処理が実行される。
そして、探索部22は、S31で未処理のものとして[1,1.0]と[3,2.0]が残っているので、まず[w,edge_length]として[1,1.0]が選ばれるものとして、S32を実行する。続いて、探索部22は、S32の条件が成り立つと判定し、w=1がpath_v=[0]に含まれないので、S34を実行し、path_length_v=0.0、edge_length=1.0であることから、頂点wまでの経路長path_length_wを「1.0」と計算する。その後、探索部22は、S35でリストq[0][0]にpath_length_wを格納するが、まだリストが空なので、S35の条件が成立してS36を実行し、path_w=[w,path_v]としてQ[0]に[path_length_w,path_w]、すなわち[1.0,[1,0]]を格納する。
また、探索部22は、未処理の[3,2.0]についても同様の計算を実行し、Q[0]に[2.0,[3,0]]を格納する。この処理が終わった段階で、図14に示すように、Q、q[1]、q[3]、P[0]の各0の列に値が設定されるが、is_extended_listについては延長停止になった頂点がないので初期状態からの変化はない。
これでvの隣接頂点処理が終了し、vの延長処理が終了して、図8のS16に戻り、i=1となるので、今度はS14以降の終点側の処理が同様に実行される。その結果、図14に示すように、Q、q[1]、q[3]、P[0]の各1の列に値が設定される。すなわち、Q[1]には[1.0,[5,8]]と[1.0,[7,8]]が格納され、q[5][1]とq[7][1]にはそれぞれ1.0が格納され、P[8][1]には[0.0,[8]]が格納される。
なお、図14はあくまで始点側と終点側でのすべての隣接頂点処理が終わった時点でのデータ構造の様子を示したものであり、上記の処理を行なっている時点のものではない。たとえば、始点側の処理が終わった時点では、図14のようには終点側の設定はされていない。以降の図も同様である。また、図14において薄い文字で示された部分は、削除されたことを示し、太文字で示された部分は新たに設定された部分を示す。キューは優先度キューなので、キューの中では長さの小さい順にソートされる。
(隣接頂点処理:その1)
図15は、頂点1および頂点5における隣接頂点処理を説明する図である。図16は、頂点1および頂点5における隣接頂点処理後のデータ構造を説明する図である。ここでは、Q[0]から先頭に格納される情報として、頂点1に関する経路情報[1.0,[1,0]]が取り出され、Q[1]から先頭に格納される情報として、頂点5に関する経路情報[1.0,[5,8]]が取り出されることから、始点側からは頂点1が処理対象となり、終点側からは頂点5が処理対象となる。
具体的には、図15に示すように、探索部22は、探索された始点側の頂点1に隣接する頂点2と頂点4、および、探索された終点側である頂点5に隣接する頂点2と頂点4とについて、経路の探索を実行し、その結果を図16に示す各データ構造に格納する。なお、探索部22は、頂点1から頂点0についても同様の処理を行うが、頂点0はすでに通過した頂点であることから、格納対象外と判断する。頂点8についても同様である。
まず、始点側について探索処理が実行される。図15に示すように、探索部22は、処理対象の頂点1と隣接する頂点2と頂点4のうち、頂点2について処理を実行する。具体的には、図16に示すように、探索部22は、始点側の優先度キューを「Q[0]」から[1.0,[1,0]]を取り出して、処理対象である頂点1に対応するP[1][0]に格納する。続いて、探索部22は、始点から頂点2への経路(長さ)として、頂点0から頂点1への長さ「1.0」と頂点1から頂点2への長さ「1.0」とを加算した長さ「2.0」を算出する。そして、探索部22は、頂点2のq[2][0]の格納数がpmax(=1)未満であることから、q[2][0]に「2.0」を格納する。そして、探索部22は、始点側の優先度キューQ[0]に、頂点2への経路情報[長さ,経路]として[2.0,[2,1,0]]を格納する。
同様に、図15に示すように、探索部22は、始点である頂点0から頂点4への長さ「3.0」を特定し、頂点4のq[4][0]の格納数がpmax(=1)未満であることから、図16に示すように、q[4][0]に「3.0」を格納する。そして、探索部22は、始点側の優先度キューQ[0]に、頂点4への経路情報[長さ,経路]として[3.0,[4,1,0]]を格納する。
次に、終点側について探索処理が実行される。図15に示すように、探索部22は、終点側である頂点5に対しても、頂点1と同様の処理を実行することで、終点側の優先度キューを「Q[1]」から[1.0,[5,8]]を取り出して、処理対象である頂点5に対応するP[5][1]に[1.0,[5,8]]を格納する。また、探索部22は、終点である頂点8から頂点2への長さ「1.0+1.0=2.0」を算出してq[2][1]に[2.0]を格納する。また、探索部22は、終点である頂点8から頂点4への長さ「1.0+1.0=2.0」を算出してq[4][1]に[2.0]を格納する。また、探索部22は、終点側の優先度キューQ[1]に、終点8から頂点2への経路情報[2.0,[2,5,8]]と、終点8から頂点4への経路情報[2.0,[4,5,8]]を格納する。
上記処理をより詳細に説明する。まず、探索部22は、Q[0]の先頭の[1.0,[1,0]]やQ[1]の[1.0,[5,8]]を取り出して、図13や図14と同様の処理を実行する。ここで、探索部22は、頂点0について、[w,edge_length]として[0,1.0]、すなわちw=0、edge_length=1.0も残っていることから処理を実行する。しかし、探索部22は、ただし、w=0は始点であり、既に通ってきている頂点であるため、path_v=[1,0]に含まれているので、処理対象外とする。頂点8は同様に処理対象外となる。このような頂点は、図15では省略しており、以降の図においても省略する。
また、始点と終点の双方から頂点2および頂点4に到達しているので、結合することによって、始点から終点までの最短経路が形成されそうに見えるが、そうではない。確かに、始点、終点から頂点2および頂点4までの経路は最短経路の候補としてキューQ[0]およびQ[1]には格納されたが、あくまで候補であり、キューから取り出された時点で初めて、未だ取り出されていない(キューにまだ入っていないものも含めた)すべての候補の中で、始点あるいは終点からその頂点までの部分的な最短な経路であることが確定するためである。すなわち、もしその頂点までの最短経路が取り出されていないのであれば、取り出された経路が始点あるいは終点からその頂点までの最短経路であることが保証される。また、すでにi本の経路が到着しているのであれば、i+1番目の最短経路であることが保証される。逆に、キューQ[0]およびQ[1]に格納された候補同士をつなぎ合わせても、何番目のもの同士を結び付けたかさえはっきりしない。
(隣接頂点処理:その2)
図17は、頂点3および頂点7における隣接頂点処理を説明する図である。図18は、頂点3および頂点7における隣接頂点処理後のデータ構造を説明する図である。ここでは、Q[0]から先頭に格納される情報として、頂点3に関する経路情報[2.0,[3,0]]が取り出され、Q[1]から先頭に格納される情報として、頂点7に関する経路情報[1.0,[7,8]]が取り出されることから、始点側から頂点3が処理対象となり、終点側からは頂点7が処理対象となる。
具体的には、図17に示すように、探索部22は、探索された始点側の頂点3に隣接する頂点4と頂点6、および、探索された終点側である頂点7に隣接する頂点4と頂点6について、経路の探索を実行し、その結果を図16に示す各データ構造に格納する。なお、探索部22は、頂点0や頂点8についてはすでに通過した頂点であるとから、処理対象外と判断する。
まず、始点側について探索処理が実行される。図17に示すように、探索部22は、処理対象の頂点3と隣接する頂点4と頂点6のうち、頂点4について処理を実行する。具体的には、図16に示すように、探索部22は、始点側の優先度キューを「Q[0]」から先頭に格納される[2.0,[3,0]]を取り出して、処理対象である頂点3に対応するP[3][0]に格納する。続いて、探索部22は、始点から頂点4への経路(長さ)として、頂点0から頂点3への長さ「2.0」と頂点3から頂点4への長さ「1.0」とを加算した長さの合計「3.0」を算出する。そして、探索部22は、この長さの合計「3.0」を頂点4のq[4][0]に格納を試みるが、すでにq[4][0]には「3.0」が格納されており、格納数がpmax未満の条件を満たさず、かつ、格納済みの長さが算出された長さ以下であることから、格納せずに破棄する。この結果、探索部22は、頂点4への経路情報[3.0,[4,3,0]]についても、始点側の優先度キューQ[0]に格納しない。
同様に、図17に示すように、探索部22は、始点である頂点0から頂点6への長さ「4.0」を特定し、頂点6のq[6][0]の格納数がpmax(=1)未満であることから、図17に示すように、q[6][0]に「4.0」を格納する。そして、探索部22は、始点側の優先度キューQ[0]に、経路情報[長さ,経路]として[4.0,[6,3,0]]を格納する。
次に、終点側について探索処理が実行される。図17に示すように、探索部22は、終点側である頂点7に対しても、頂点3と同様の処理を実行することで、終点側の優先度キューを「Q[1]」から先頭の[1.0,[7,8]]を取り出して、処理対象である頂点7に対応するP[7][1]に[1.0,[7,8]]を格納する。また、探索部22は、終点から頂点7に隣接する頂点6への経路(長さ)として、頂点8から頂点7への長さ「1.0」と頂点7から頂点6への長さ「1.0」とを加算した長さの合計「2.0」を算出する。そして、探索部22は、頂点6のq[6][1]の格納数がpmax(=1)未満であることから、q[6][1]に「2.0」を格納する。また、探索部22は、始点側の優先度キューQ[0]に、頂点6への経路情報[長さ、経路]として[2.0,[6,7,8]]を格納する。
さらに、探索部22は、頂点7に隣接する頂点4についても同様に、終点から頂点4への経路(長さ)として、頂点8から頂点7への長さ「1.0」と頂点7から頂点4への長さ「2.0」とを加算した長さの合計「3.0」を算出する。そして、探索部22は、この長さの合計「3.0」を頂点4のq[4][1]に格納を試みるが、すでにq[4][1]には「2.0」が格納されており、格納数がpmax未満の条件を満たさず、かつ、格納済みの長さが算出された長さ以下であることから、格納せずに破棄する。この結果、探索部22は、頂点4への経路情報[3.0,[4,7,8]]についても、始点側の優先度キューQ[1]に格納しない。
上記処理をより詳細に説明する。ここでは、頂点3および頂点7に対して隣接接点処理が行われることで、図18のデータ構造を得ることができる。この処理においては、頂点3から頂点4への隣接頂点処理において、[w,edge_length]=[4,1.0]が図10のS31で処理されるが、S34でpath_length=3.0と計算され、q[4][0]には既に3.0が格納済みであり、かつpmax=1であるため、S35でqに入れようとしても弾かれる。その場合、「q[v.id()][i].enque(path_length_w)」の値は「False」であるので、S36でキューQに格納されずに済むことになる。ここが、qによる不要な候補の削減効果である。図18において、q[4][0]の3.0が丸括弧で囲まれているのは、このように入れようとして弾かれたことを意味している。また、Q[0]やQ[1]に丸括弧で囲まれた「3.0,[4,3,0]」や「3.0,[4,7,8]」は、入れようとして弾かれたわけではないが、qによる削減効果がなければ、入れられていたことを意味している。以降、他のデータ構造でもこの記法を用いることにする。なお、終点側での頂点7から頂点4への隣接頂点処理についても同様である。
(隣接頂点処理:その3)
図19は、頂点2における隣接頂点処理を説明する図である。図20は、頂点2における隣接頂点処理後のデータ構造を説明する図である。ここでは、Q[0]から先頭に格納される情報として、頂点2に関する経路情報[2.0,[2,1,0]]が取り出され、Q[1]から先頭に格納される情報として、頂点2に関する経路情報[2.0,[2,5,8]]が取り出されることから、両側共通として頂点2が処理対象となる。具体的には、図19に示すように、探索部22は、探索された頂点2に隣接する始点側からの頂点1と終点側からの頂点5について、経路の探索を実行し、その結果を図20に示す各データ構造に格納する。なお、始点側からの頂点1と終点側からの頂点5は、すでに探索済みであることから、処理対象となる。
まず、図19に示すように、探索部22は、処理対象の頂点2と隣接する頂点5について処理を実行する。具体的には、図20に示すように、探索部22は、始点側の優先度キューを「Q[0]」から先頭に格納される[2.0,[2,1,0]]を取り出して、処理対象である頂点2に対応するP[2][0]に格納する。続いて、探索部22は、始点から頂点5への経路として、頂点0から頂点1への長さ「1.0」と頂点1から頂点2への長さ「1.0」と頂点2から頂点5への長さ「1.0」とを加算した長さの合計「3.0」を算出する。そして、探索部22は、頂点5のq[5][0]の格納数がpmax(=1)未満であることから、q[5][0]に「3.0」を格納する。そして、探索部22は、始点側の優先度キューQ[0]に、頂点5への経路情報として[3.0,[5,2,1,0]]を格納する。なお、優先度キューQ[0]には、長さが小さい順になるように挿入される。
また、探索部22は、処理対象の頂点2と隣接する頂点1についても同様の処理を実行することで、終点側の優先度キューを「Q[1]」から先頭に格納される[2.0,[2,5,8]]を取り出して、処理対象である頂点2に対応するP[2][1]に[2.0,[2,5,8]]を格納する。また、探索部22は、終点である頂点8から頂点1への長さ「1.0+1.0+1.0=3.0」を算出してq[1][1]に[3.0]を格納する。また、探索部22は、終点側の優先度キューQ[1]に、終点8から頂点1への経路情報[3.0,[1,2,5,8]]を格納する。
ここで、探索部22は、P[2][0]およびP[2][1]に値が格納されていることから、頂点2を結合点と判定する。そして、探索部22は、始点から頂点2までの経路[2,1,0]と、終点から頂点2までの経路[2,5,8]とを組み合わせ経路[0,1,2,5,8]を生成する。また、探索部22は、始点から頂点2までの経路の長さ「2.0」と終点から頂点2までの経路の長さ「2.0」とを組み合わせて、経路[0,1,2,5,8]の長さを「4.0」と算出する。そして、探索部22は、totalQにデータが格納されていないことから、経路情報「4.0,[0,1,2,5,8]を最短経路としてtotalQに格納する。
上記処理をより詳細に説明する。Q[0]から[2.0,[2,1,0]]が取り出され、Q[1]からは[2.0,[2,5,8]]が取り出されるので、ここで初めて、始点からの最短経路と終点からの最短経路が頂点2で結合することになる。すなわち、頂点2が結合点となる。図8でi=1、すなわち、終点側の処理を行っている際に、図9のS21でis_joint[2]で、P[2][0]には既に[2.0,[2,1,0]]が格納されていて、「0<P[v.id][opp(i)].len()」が成り立つので、頂点2が結合点であることを示すS22が実行される。したがって、S23が実行された後、S24も成り立つので、S25が実行され、始点から頂点2まで既にP[2][0]として求まっている部分的最短経路[2,1,0]とpath_v=[2,5,8]が合成され、[0,1,2,5,8]という始点から終点までの長さ4.0の経路が合成される。そして、この求めた経路にループが含まれず、totalQはこの時点では空で、totalQは当然同じものは含まれておらず、totalQは空で入れることができるので、[4.0,[0,1,2,5,8]]がtotalQに格納される。このように、始点から終点までの(一番の)最短経路がtotalQに格納されたことになる。上述したように、図20でP[2]を太文字にすることで、頂点2が結合点であることを示している。
(隣接頂点処理:その4)
図21は、頂点4における隣接頂点処理を説明する図である。図22は、頂点4における隣接頂点処理後のデータ構造を説明する図である。ここでは、Q[0]から先頭に格納される情報として、頂点4に関する経路情報[3.0,[4,1,0]]が取り出され、Q[1]から先頭に格納される情報として、頂点4に関する経路情報[2.0,[4,5,8]]が取り出されることから、両側共通として頂点4が処理対象となる。具体的には、図21に示すように、探索部22は、探索された頂点4に隣接する頂点5、頂点7、頂点1、頂点3のそれぞれについて、経路の探索を実行し、その結果を図21に示す各データ構造に格納する。
まず、始点側について探索処理が実行される。図21に示すように、探索部22は、処理対象の頂点4と隣接する頂点5と頂点7のうち、頂点5について処理を実行する。具体的には、図22に示すように、探索部22は、始点側の優先度キューを「Q[0]」から先頭の[3.0,[4,1,0]]を取り出して、処理対象である頂点4に対応するP[4][0]に格納する。続いて、探索部22は、始点から頂点5への経路として、頂点0、頂点1、頂点4、頂点5の経路の長さの合計「4.0」を算出する。そして、探索部22は、この長さ「4.0」を頂点5のq[5][0]に格納を試みるが、すでにq[5][0]には「3.0」が格納されており、格納数がpmax未満の条件を満たさず、かつ、格納済みの長さが算出された長さ以下であることから、格納せずに破棄する。この結果、探索部22は、頂点5への経路情報[4.0,[5,4,1,0]]についても、始点側の優先度キューQ[0]に格納しない。
同様に、図21に示すように、探索部22は、始点である頂点0から頂点7への長さ「5.0」を特定し、頂点7のq[7][0]の格納数がpmax(=1)未満であることから、図22に示すように、q[7][0]に「5.0」を格納する。そして、探索部22は、始点側の優先度キューQ[0]に、経路情報として[5.0,[7,4,1,0]]を格納する。
次に、終点側について探索処理が実行される。図21に示すように、探索部22は、終点側である頂点1に対しても、同様の処理を実行することで、終点側の優先度キューを「Q[1]」から[2.0,[4,5,8]]を取り出して、処理対象である頂点4に対応するP[4][1]に[2.0,[4,5,8]]を格納する。そして、探索部22は、終点である頂点8から頂点3への長さ「3.0」を特定し、頂点3のq[3][1]の格納数がpmax(=1)未満であることから、図22に示すように、q[3][1]に「3.0」を格納する。そして、探索部22は、始点側の優先度キューQ[1]に、経路情報として[3.0,[3,4,5,8]]を格納する。
また、探索部22は、終点側である頂点1に対しても同様の処理を実行し、終点から頂点1への経路(長さ)として、頂点8、頂点5、頂点4、頂点1を経由する経路の長さの合計「4.0」を算出する。そして、探索部22は、この長さ「4.0」を頂点1のq[1][1]に格納する際、すでにq[1][1]には「3.0」が格納されており、格納数がpmax未満の条件を満たさず、かつ、格納済みの長さが算出された長さ以下であることから、格納せずに破棄する。この結果、探索部22は、頂点1への経路情報[4.0,[1,4,5,8]]についても、始点側の優先度キューQ[1]に格納しない。
ここで、探索部22は、P[4][0]およびP[4][1]に値が格納されていることから、頂点4を結合点と判定する。そして、探索部22は、始点から頂点4までの経路[4,1,0]と、終点から頂点4までの経路[4,5,8]とを組み合わせ経路[0,1,4,5,8]を生成する。また、探索部22は、始点から頂点4までの経路の長さ「3.0」と終点から頂点4までの経路の長さ「2.0」とを組み合わせて、経路[0,1,4,5,8]の長さを「5.0」と算出する。そして、探索部22は、totalQに格納されるデータが2(=k)未満であることから、経路情報「5.0,[0,1,4,5,8]を最短経路としてtotalQに格納する。
上記処理を実行することで、頂点4において図21に示す隣接頂点処理が行われ、図22に示すデータ構造になる。ここで注目すべき点は、totalQが一杯になったことである。以降では、このことによる図11のS3144以降の処理による削減効果も期待できるようになる。また、ここでも、qによる削減効果が現れている。
(隣接頂点処理:その5)
図23は、頂点5および頂点6における隣接頂点処理を説明する図である。図24は、頂点5および頂点6における隣接頂点処理後のデータ構造を説明する図である。ここでは、Q[0]から先頭に格納される情報として、頂点5に関する経路情報[3.0,[5,2,1,0]]が取り出され、Q[1]から先頭に格納される情報として、頂点6に関する経路情報[2.0,[6,7,8]]が取り出されることから、頂点5および頂点6が処理対象となる。
具体的には、図23に示すように、探索部22は、探索された頂点5に隣接する頂点4および頂点8と、探索された頂点6と隣接する頂点3のそれぞれについて、経路の探索を実行し、その結果を図24に示す各データ構造に格納する。なお、頂点7については、終点である頂点8からの探索ですでに探索済みであることから、処理対象外となる。
まず、始点側について探索処理が実行される。図23に示すように、探索部22は、処理対象の頂点5と隣接する頂点4と頂点8のうち、頂点4について処理を実行する。具体的には、図24に示すように、探索部22は、始点側の優先度キューを「Q[0]」から先頭の[3.0,[5,2,1,0]]を取り出して、処理対象である頂点5に対応するP[5][0]に格納する。続いて、探索部22は、始点から頂点4への経路として、頂点0、頂点1、頂点2、頂点5、頂点4の経路の長さの合計「4.0」を算出する。そして、探索部22は、この長さ「4.0」を頂点4のq[4][0]に格納する際、すでにq[4][0]には「3.0」が格納されており、格納数がpmax未満の条件を満たさず、かつ、格納済みの長さが算出された長さ以下であることから、格納せずに破棄する。この結果、探索部22は、頂点4への経路情報[4.0,[4,5,2,1,0]]についても、始点側の優先度キューQ[0]に格納しない。
同様に、図23に示すように、探索部22は、頂点8についても同様に実行する。具体的には、探索部22は、始点である頂点0から頂点8への長さ「4.0」を特定し、頂点8のq[8][0]の格納数がpmax(=1)未満であることから、図24に示すように、q[8][0]に「4.0」を格納する。そして、探索部22は、始点側の優先度キューQ[0]に、経路情報として[4.0,[8,5,2,1,0]]を格納する。
次に、終点側について探索処理が実行される。図23に示すように、探索部22は、今までであれば、終点側である頂点6に隣接する頂点3に対しても、同様の処理を実行する。しかし、以下で詳述するように、図11の延長判定処理においてmaxによる削減の効果で、延長しないと判定されるため、処理は行わずに済む。
ここで、探索部22は、P[5][0]およびP[5][1]に値が格納されていることから、頂点5を結合点と判定する。そして、探索部22は、始点から頂点5までの経路[5,2,1,0]と、終点から頂点5までの経路[5,8]とを組み合わせ経路[0,1,2,5,8]を生成する。また、探索部22は、始点から頂点5までの経路の長さ「3.0」と終点から頂点5までの経路の長さ「1.0」とを組み合わせて、経路[0,1,2,5,8]の長さを「4.0」と算出する。そして、探索部22は、この経路情報[4.0,[0,1,2,5,8]]をtotalQに格納することを試みるが、すでに格納済みであることから破棄する。
上記処理をより詳細に説明する。頂点5、頂点6において今まで同様に隣接頂点処理を実行する際、頂点6では隣接頂点処理は行われず、図24に示すデータ構造になる。これは、上述した削減効果によるためである。具体的には、頂点6の延長処理を行なうか、図11のフローチャートで判定する際、S314の条件が成り立つために、S315が実行され、この条件が成り立たないために、S316が実行される。そして、この条件が成り立つために、S319でmin=4.0と設定される。この結果、S320でpath_length+min=2.0+4.0となり、一方でmax=5.0よりこの条件が成り立たない。このため、S321が実行され、is_vはTrueであるので、S317によりここで今までで初めてis_extended_list[x.id()][i]に、具体的には、is_extended_list[6][1]にFalseが設定される。そして、r=FalseとS322で設定され、r=Falseが戻り値となる。すなわち、vの延長処理は行われない。
(隣接頂点処理:その6)
図25は、頂点6および頂点1における隣接頂点処理を説明する図である。図26は、頂点6および頂点1における隣接頂点処理後のデータ構造を説明する図である。ここでは、Q[0]から先頭に格納される情報として、頂点6に関する経路情報[4.0,[6,3,0]]が取り出され、Q[1]から先頭に格納される情報として、頂点1に関する経路情報[3.0,[1,2,5,8]]が取り出されることから、始点側では頂点6が処理対象となり、終点側では頂点1が処理対象となる。
具体的には、図25に示すように、探索部22は、探索された頂点6に隣接する頂点7と、探索された頂点1と隣接する頂点0および頂点4のそれぞれについて、経路の探索を実行し、その結果を図26に示す各データ構造に格納する。なお、始点側からの頂点3と終点側からの頂点2については、すでに探索済みであることから、処理対象外となる。
まず、始点側について探索処理が実行される。図25に示すように、探索部22は、処理対象の頂点6と隣接する頂点7について処理を実行するところである。しかし、前回と同様、以下で詳述するように、図11の延長判定処理においてmaxによる削減の効果で、延長しないと判定されるため、処理は行わずに済む。
次に、終点側について探索処理が実行される。図25に示すように、探索部22は、終点側である頂点1に隣接する頂点0に対しても、同様の処理を実行する。具体的には、探索部22は、終点側の優先度キューを「Q[1]」から[3.0,[1,2,5,8]]を取り出して、処理対象である頂点1に対応するP[1][1]に[3.0,[1,2,5,8]]を格納する。また、探索部22は、終点から頂点0への経路(長さ)として、頂点8、頂点5、頂点2、頂点1、頂点0を経由する経路の長さの合計「4.0」を算出する。そして、探索部22は、この長さ「4.0」を頂点1のq[0][1]に格納する。また、探索部22は、頂点0への経路情報[4.0,[0,1,2,5,8]]についても、終点側の優先度キューQ[1]に格納する。
頂点1に隣接する頂点4に対しては、終点から頂点4へは既に長さ2の経路が到達していること(q[4][1]=[2.0])から、処理は打ち切られる。
上記処理を実行することで、ここでは、頂点6、頂点1において隣接頂点処理が行われ、頂点1では今までと変わらないが、頂点6では隣接頂点処理は行われず、図26に示すデータ構造になる。具体的には、頂点6の延長処理を行なうかを図11のフローチャートで判定する際、S314の条件が成り立つので、S315が実行される。しかし、この条件は成り立たないことから、S316が実行されて、S316が成り立つのでS319が実行されて、min=3.0と設定される。この結果、S320において、path_length+min=4.0+3.0=7.0となり、一方でmax=5.0より、条件が成り立たないので、S321が実行される。そして、is_vはTrueであるので、S317が実行されて、is_extended_list[6][0]にFalseが設定される。そして、r=FalseとS322で設定され、r=Falseが戻り値となる。頂点1が新たに結合点になっているが、結合されて生成される経路「4.0,[0,1,2,5,8]」が既にtotalQに入っているため、図9のS25の働きによりtotalQに入らない。
これ以降も処理が続くが、このように、Q[0]およびQ[1]に入れられることが妨げられるようになりQ[0]およびQ[1]は両方ともいずれ空になるので、その時点で図8のS11の条件から処理が終了する。そして、その時点でtotalQに残っているものが、求めるべきk−最短経路となる。
なお、以上の説明を踏まえ、結合点における部分的最短経路の合成によって最短経路を求めている全体像を、図27を用いて説明する。図27は、対角線上の結合点における部分的最短経路を説明する図である。図27は、始点・終点を結ぶ対角線とは別の対角線上の(結合点になりそうな)頂点で求まる最終的な部分的最短路を表したものである。各頂点で始点側(0)と終点側(1)の部分的最短路を合成することで、図12の(a)に示すすべての経路が求まることがわかる。たとえば、頂点4では始点側と終点側のそれぞれ2つずつの部分的最短路を組み合わせることで、頂点4を通るすべての最短経路が求まる。ただし、以上のことはこの例ではであり、一般には始点から終点までのすべての経路を求めるわけではない、求めていては非常に時間がかかってしまうので、図8S11の条件により途中で打ち切っている。
次に、パラメータαの最適化について説明する。パラメータαの最適化は、ユーザが許容できる精度Pmin以上の範囲内で最適なものをpmaxの値を1からkまでの範囲で変動させることで探すということを示す。kを含めることで、Pmin=1.0を指定されても精度が1.0のものは見つかることが保証される。ただし、pmaxの値を1からkまでの範囲で変動させると、特にpmaxの値がkに近い値の場合には多大な時間がかかる可能性がある。このことを次のように回避する。一般にpmaxの値が小さいほど、探索時間は短い。一方、後述する実験等によれば、pmaxの値が小さくても精度1.0という結果が得られている。以上を考慮して、pmaxを1から始めて、精度がPminを超えた時点で処理を打ち切る。このことで、最適化を高速に行うことが期待できる。
(フローチャート)
図28は、実施例3にかかるパラメータαの最適化処理の流れを示すフローチャートである。INFITEはどの数値よりも大きい数値を表す。厳密解と一致することを望む場合は、Pmin=1.0を指定する。
図28に示すように、S41では、find_acc(v_list,source_vid,target_vid,k)は、正確なk−最短距離探索を行う関数であり、それを実行する。この関数find_accは、頂点のリストv_list、始点の頂点識別子source_vid、終点の頂点識別子target_vid、および何番目までの最短経路を求めるかを示すkをパラメータとして、最短経路の長さと最短経路を構成する始点から終点までの頂点列のペアのリストであるspl_accを返す。なお、accは厳密であることを意味するaccurateの略である。spl_accは、最短経路の長さが短い順にソートされている。このリストを「最短経路リスト」と呼ぶことにする。以前に部分的な最短経路リストという言葉が出てきたが、こちらは全体的な最短経路リストである。
次に、p_maxに1を代入して(S42)、p_maxがk以下であれば(S43:Yes)、S44において関数find_appを実行する。具体的には、find_app(v_list,source_vid,target_vid,k,p_max)は、近似によるk−最短経路探索を行う関数であり、パラメータや関数の返り値はfind_accと類似するが、パラメータに最大経路数であるp_maxが追加されている点が異なる。spl_appは、spl_accと同様のリストであり、うまく行けば全く一致する可能性もあるが、近似的に求めたものであるため、spl_accに含まれているものが全て含まれているとは限らない。このリストは図8のS12で返されるものそのものであり、やはり「最短経路リスト」と呼ぶことにする。なお、appは近似であることを意味するapproximateの略である。diff(spl_acc,spl_app)は、2つの最短経路リストspl_acc、spl_appで異なる最短経路の個数を計算する関数である。全く一致する場合は0を返し、d個違えばdを返す。
その後、S44で得られるprecisionがPmin未満であれば(S45:No)、p_maxをインクリメントして(S47)、S43以降が実行される。一方、S44で得られるprecisionがPmin以上であれば(S45:Yes)、S46を実行して処理を終了する。このように、p_max=kまで調べれば、Pmin=1.0が指定されても厳密解が必ず求まる。したがって、p_max=kまで調べてもαが求まらない場合は、エラーすなわち異常終了としている。
(パラメータαの最適結果)
図29は、パラメータαの最適化の測定結果を示す図である。図30は、pmax(横軸)と、最大時間比または精度(縦軸)の関係を示す図である。縦横それぞれ64、すなわち頂点数n=4096(64×64)の二次元格子グラフで、kの値が16、32、64の場合に最適化した結果を図29に示す。ここでは、近似の測定ではPmin=1.0とし、最小の時間、すなわちpmaxの値を1、2、3・・・と順に増加させ、精度がPmin=1.0になった時点での処理時間を求めた。処理時間はCPU時間である。
図30は3つのうちのk=64の場合の処理時間と精度の関係を示すものである。両者のスケールを合わせるため、最大(すなわちpmax=4)の処理時間に対するそれぞれの処理時間の比を最大時間比として示している。たとえば、pmax=1の場合は、精度が1.0のpmax=4の場合よりも約半分の処理時間で済むものの、精度は0.3程度であることを示している。
この例では、pmaxがかなり小さいうちに精度が1.0になったので、処理が打ち切られている。求めるαの値は、処理が打ち切られた際のpmaxの値を用いて計算したものであり、kの値16、32、64に対して、それぞれ0.75、0.707、0.5とお互いに近い値を示している。これらの値の最大値であるα=0.75を最終的なαの値として採用すれば、kの値によらずに精度が1.0あるいはそれに近いことが期待できる。また、精度への要求がそれほど厳密でないのであれば、たとえばこれらの値の平均である0.65を用いることもできる。逆に精度への要請がより厳しい場合は、αの値をマージンをとって大きくしておくこともできる。なお、上の測定では説明を簡易にするためもあって、始点、終点は一組だけで、測定も一度しか行っていないが、実際にαを決定する際には、kをそれが使われる範囲でいろいろ変え、また始点、終点をいろいろに変え、αの最大値あるいは平均値を取るというような統計的処理を行うのが有効である。
次に、実施例1−3で説明した手法による効果を説明する。ここでは、近似の有無による効果と、maxによる削減効果、拡張Dijkstraとの比較とについて説明する。
(近似の有無の比較)
図31は、近似の有無による比較結果を説明する図である。ここでは、上記実施例で近似を用いた場合すなわちpmax<kの場合と、近似を用いない厳密解の場合すなわちpmax=kの場合の処理時間を比較する。近似では、図30で示す最適化でPmin=1.0とした結果を用いた。すなわち、近似ではあるが、精度は1.0であるようにした。そして、最小の時間、すなわち図31で示したように、pmaxの値を1、2、3、・・・と順に増加させ、精度がPmin=1.0になった時点での処理時間を求めた。このようにしたのは近似における測定値の意味づけをはっきりするためである。したがって、精度は1.0でないものの、より短い時間で処理することも可能である。
以上による測定結果をまとめたのを図31に示す。性能比は、近似の処理時間に対する近似を用いなかった場合の処理時間の比、すなわち近似を用いることで何倍速くなるかを示している。図31に示す結果から、近似を用いることで、2.8から14.8倍速くなり、また頂点数が増えるにつれて性能比が大きくなっていることがわかる。
(maxによる削減効果)
図32は、maxによる削減効果を説明する図である。ここでは、上記実施例においてmaxによる削減を用いた場合、すなわち図11のS314以下を用いた場合と、用いなかった場合の処理時間を比較する。測定にあたっては、図32の(a)に示す近似を用いた場合と、図32の(b)に示す近似を用いなかった場合のそれぞれについて測定した。
性能比は、maxによる削減を適用した場合の処理時間に対して適用しなかった場合の処理時間の比、すなわちmaxによる削減を適用すると何倍速くなるかを示す。近似を用いた場合は3.4から9.5倍速くなり、また頂点数が増えるにつれて性能比が大きくなることを示している。近似を用いなかった場合は8.0から12.2倍速くなり、減少している部分もあるものの、概ね頂点数が増えるにつれて性能比が大きくなる傾向にあることを示している。
(拡張Dijkstraとの比較)
図33は、拡張Dijkstraとの比較を説明する図である。ここでは、近似による上記実施例の方式と拡張Dijkstra法の処理時間の比較を行う。測定に用いた拡張Dijkstra法には、中間点で求める最短経路をk本までに限定するという改良を施している。測定結果をまとめたのを図33に示す。性能比は、実施例の方式が拡張Dijkstra法より何倍速いかを示す値である。図33に示す結果から、近似による実施例の方式は、拡張Dijkstra法より4.8から32.5倍速いこと、そして頂点数が増えるにつれて性能比が増えていることがわかる。
(実施例の方式による比較)
図29に示すように、パラメータαをユーザが要求した精度以上の範囲で、なるべく高速になるよう自動的に最適化でき、ユーザによるパラメータの調節を省略することができる。また、図31に示すように、近似を使うことにより精度1.0を保ちながら約3〜15倍と高速化を実現することができる。さらに、高速化は、頂点数が増えるにつれて、より効果的である。
図32に示すように、maxによる削減により、近似を用いた場合は約3〜10倍、近似を用いない場合は約8〜12倍と高速化を実現できる。また、その効果は概ね頂点数が増えるにつれてより効果的である。図33に示すように、実施例の方式は、拡張Dijkstra法よりおよそ5倍から33倍程度の高速化を実現でき、その効果は頂点数が増えるにつれてより効果的である。
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。
[適用グラフ]
例えば、重みなしグラフの最短経路は、よく知られているように幅優先探索を用いることで高速に求めることができる。それは、優先度付きキューの代わりに、「first−in,first−out」の通常のキューを用いることで容易に実現できる。実施例で説明した方式でも、優先度付きキューを通常のキューに置き換えることで、容易に重みなしグラフに対応することが可能である。なお、重みをすべて1.0として本実施例の方式を用いることで対応することも可能であるが、幅優先探索を用いた方がより高速である。
また、Dijkstra法は有向グラフに対して対応可能である。したがって、実施例の方式を、有向グラフに対応するよう改良することは容易である。具体的には、頂点v,wが隣接している場合、無向グラフでは、vとwのadj_edge_listの双方に辺を表すデータ構造を入れていたが、有向グラフでは、vからwへの向きの辺がある場合に限って、vのadj_edge_listに辺を加える。両方向にある場合は、wのadj_edge_listにも加えられる。この変更を加えるだけで、有向グラフには対応可能である。
[システム]
上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。また、実施例で説明した具体例、分布、数値などは、あくまで一例であり、任意に変更することができる。
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散や統合の具体的形態は図示のものに限られない。つまり、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
[ハードウェア]
図34は、ハードウェア構成例を説明する図である。図34に示すように、探索装置10は、通信装置10a、HDD(Hard Disk Drive)10b、メモリ10c、プロセッサ10dを有する。また、図10に示した各部は、バス等で相互に接続される。
通信装置10aは、ネットワークインタフェースカードなどであり、他のサーバとの通信を行う。HDD10bは、図2に示した機能を動作させるプログラムやDBを記憶する。
プロセッサ10dは、図2に示した各処理部と同様の処理を実行するプログラムをHDD10b等から読み出してメモリ10cに展開することで、図2等で説明した各機能を実行するプロセスを動作させる。すなわち、このプロセスは、探索装置10が有する各処理部と同様の機能を実行する。具体的には、プロセッサ10dは、初期設定部21、探索部22、出力制御部23等と同様の機能を有するプログラムをHDD10b等から読み出す。そして、プロセッサ10dは、初期設定部21、探索部22、出力制御部23等と同様の処理を実行するプロセスを実行する。
このように探索装置10は、プログラムを読み出して実行することで探索方法を実行する情報処理装置として動作する。また、探索装置10は、媒体読取装置によって記録媒体から上記プログラムを読み出し、読み出された上記プログラムを実行することで上記した実施例と同様の機能を実現することもできる。なお、この他の実施例でいうプログラムは、探索装置10によって実行されることに限定されるものではない。例えば、他のコンピュータまたはサーバがプログラムを実行する場合や、これらが協働してプログラムを実行するような場合にも、本発明を同様に適用することができる。
このプログラムは、インターネットなどのネットワークを介して配布することができる。また、このプログラムは、ハードディスク、フレキシブルディスク(FD)、CD−ROM、MO(Magneto−Optical disk)、DVD(Digital Versatile Disc)などのコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行することができる。
10 探索装置
11 通信部
12 記憶部
13 グラフデータDB
20 制御部
21 初期設定部
22 探索部
22a 頂点処理部
22b 結合点処理部
22c 経路生成部
23 出力制御部

Claims (9)

  1. コンピュータが、
    グラフデータが有する複数のノードの中から始点および終点を特定し、
    前記始点と前記終点とを繋ぐ経路のうち距離の短い上位所定数の最短経路を探索する場合に、前記所定数より小さい値が設定される制限値を用いて、前記始点および前記終点の双方向から、前記始点からの経路と前記終点からの経路とが結合する結合点を特定し、
    前記結合点を含む前記複数のノードそれぞれに対応付けて保持する経路の数を前記制限値以下に制限して、各ノードに到達する経路のうち距離が短い経路を保持し、
    前記各ノードに対応付けた保持される前記経路を用いて、前記結合点に至る経路から前記上位所定数の最短経路を探索し、
    探索された前記上位所定数の経路を出力する、
    処理を実行することを特徴とする経路探索方法。
  2. 前記保持する処理は、前記各ノードに到達する経路を、優先度キューを用いて保持し、
    前記探索する処理は、出発点から頂点までの長さと相手側の出発点から当該頂点までの最短経路長あるいは前記優先度キューの先頭の経路の長さの和が、既に求まっている前記上位所定数番目の最短経路の長さ以上の場合は、当該頂点から先へ探索範囲を延長しないことを特徴とする請求項1に記載の経路探索方法。
  3. 前記探索する処理は、前記始点から前記結合点までの各経路と、前記終点から前記結合点までの各経路とを組み合わせた複数の経路を生成し、前記複数の経路のうち距離が短い経路を順次特定して、前記上位所定数の最短経路を探索することを特徴とする請求項1に記載の経路探索方法。
  4. 前記保持する処理は、前記結合点を含む前記複数のノードそれぞれに対応付けて保持する経路の数を、前記制限値の平方根以下に制限することを特徴とする請求項1に記載の経路探索方法。
  5. 前記保持する処理は、前記結合点を含む前記複数のノードそれぞれに対応付けて保持する経路の数を、前記制限値の平方根に定数パラメータを乗算した乗算値以下に制限することを特徴とする請求項4に記載の経路探索方法。
  6. 前記パラメータは、経路探索の出発点から結合点までの部分的な最短経路の数である最大経路数を1から前記制限値まで増やして経路探索のシミュレーションを行った場合に、ユーザが指定する精度を満たす最大の値であることを特徴とする請求項5に記載の経路探索方法。
  7. コンピュータに、
    グラフデータが有する複数のノードの中から始点および終点を特定し、
    前記始点と前記終点とを繋ぐ経路のうち距離の短い上位所定数の最短経路を探索する場合に、前記所定数より小さい値が設定される制限値を用いて、前記始点および前記終点の双方向から、前記始点からの経路と前記終点からの経路とが結合する結合点を特定し、
    前記結合点を含む前記複数のノードそれぞれに対応付けて保持する経路の数を前記制限値以下に制限して、各ノードに到達する経路のうち距離が短い経路を保持し、
    前記各ノードに対応付けた保持される前記経路を用いて、前記結合点に至る経路から前記上位所定数の最短経路を探索し、
    探索された前記上位所定数の経路を出力する、
    処理を実行させることを特徴とする経路探索プログラム。
  8. グラフデータが有する複数のノードの中から始点および終点を特定する特定部と、
    前記始点と前記終点とを繋ぐ経路のうち距離の短い上位所定数の最短経路を探索する場合に、前記所定数より小さい値が設定される制限値を用いて、前記始点および前記終点の双方向から、前記始点からの経路と前記終点からの経路とが結合する結合点を特定する特定部と、
    前記結合点を含む前記複数のノードそれぞれに対応付けて保持する経路の数を前記制限値以下に制限して、各ノードに到達する経路のうち距離が短い経路を保持する保持部と、
    前記各ノードに対応付けた保持される前記経路を用いて、前記結合点に至る経路から前記上位所定数の最短経路を探索する探索部と、
    探索された前記上位所定数の経路を出力する出力部と
    を有することを特徴とする経路探索装置。
  9. 複数のノードを有するグラフデータを含む経路探索のデータ構造であって、コンピュータが、
    グラフデータが有する複数のノードの中から始点および終点を特定し、
    前記始点と前記終点とを繋ぐ経路のうち距離の短い上位所定数の最短経路を探索する場合に、前記所定数より小さい値が設定される制限値を用いて、前記始点および前記終点の双方向から、前記始点からの経路と前記終点からの経路とが結合する結合点を特定し、
    前記結合点を含む前記複数のノードそれぞれに対応付けて保持する経路の数を前記制限値以下に制限して、各ノードに到達する経路のうち距離が短い経路を保持し、
    前記各ノードに対応付けた保持される前記経路を用いて、前記結合点に至る経路から前記上位所定数の最短経路を探索し、
    検索された前記上位所定数の経路を出力する、
    経路探索のデータ構造。
JP2019025655A 2019-02-15 2019-02-15 経路探索方法、経路探索プログラム、経路探索装置および経路探索のデータ構造 Pending JP2020135207A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2019025655A JP2020135207A (ja) 2019-02-15 2019-02-15 経路探索方法、経路探索プログラム、経路探索装置および経路探索のデータ構造
US16/789,500 US20200265044A1 (en) 2019-02-15 2020-02-13 Path searching method, storage medium and path searching apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2019025655A JP2020135207A (ja) 2019-02-15 2019-02-15 経路探索方法、経路探索プログラム、経路探索装置および経路探索のデータ構造

Publications (1)

Publication Number Publication Date
JP2020135207A true JP2020135207A (ja) 2020-08-31

Family

ID=72040639

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2019025655A Pending JP2020135207A (ja) 2019-02-15 2019-02-15 経路探索方法、経路探索プログラム、経路探索装置および経路探索のデータ構造

Country Status (2)

Country Link
US (1) US20200265044A1 (ja)
JP (1) JP2020135207A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20210089580A1 (en) * 2019-09-24 2021-03-25 Beijing Baidu Netcom Science And Technology Co., Ltd. Method and apparatus for querying shortest path of graph, and storage medium
JP2021182430A (ja) * 2020-12-09 2021-11-25 ベイジン バイドゥ ネットコム サイエンス テクノロジー カンパニー リミテッド 意味解析モデルのトレーニング方法及び装置、電子機器並びに記憶媒体
CN114564449A (zh) * 2022-02-28 2022-05-31 北京百度网讯科技有限公司 数据查询方法、装置、设备以及存储介质
CN114579573A (zh) * 2022-03-03 2022-06-03 北京百度网讯科技有限公司 信息检索方法、装置、电子设备以及存储介质

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11157189B2 (en) * 2019-07-10 2021-10-26 Dell Products L.P. Hybrid data reduction
CN112347216B (zh) * 2020-11-06 2023-10-31 思创数码科技股份有限公司 一种基于动态路网的初始线路搜索方法
KR102444457B1 (ko) * 2022-06-03 2022-09-19 주식회사 액션파워 단어 그래프를 이용한 대화의 요약 생성 방법

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20210089580A1 (en) * 2019-09-24 2021-03-25 Beijing Baidu Netcom Science And Technology Co., Ltd. Method and apparatus for querying shortest path of graph, and storage medium
US11657091B2 (en) * 2019-09-24 2023-05-23 Beijing Baidu Netcom Science And Technology Co., Ltd. Method and apparatus for querying shortest path of graph, and storage medium
JP2021182430A (ja) * 2020-12-09 2021-11-25 ベイジン バイドゥ ネットコム サイエンス テクノロジー カンパニー リミテッド 意味解析モデルのトレーニング方法及び装置、電子機器並びに記憶媒体
JP7253593B2 (ja) 2020-12-09 2023-04-06 ベイジン バイドゥ ネットコム サイエンス テクノロジー カンパニー リミテッド 意味解析モデルのトレーニング方法及び装置、電子機器並びに記憶媒体
CN114564449A (zh) * 2022-02-28 2022-05-31 北京百度网讯科技有限公司 数据查询方法、装置、设备以及存储介质
CN114579573A (zh) * 2022-03-03 2022-06-03 北京百度网讯科技有限公司 信息检索方法、装置、电子设备以及存储介质

Also Published As

Publication number Publication date
US20200265044A1 (en) 2020-08-20

Similar Documents

Publication Publication Date Title
JP2020135207A (ja) 経路探索方法、経路探索プログラム、経路探索装置および経路探索のデータ構造
US8145588B2 (en) Determination of graph connectivity metrics using bit-vectors
WO2018077039A1 (zh) 社区发现方法、装置、服务器及计算机存储介质
JP4911536B2 (ja) 地域情報検索装置、地域情報検索装置の制御方法、地域情報検索システム、および地域情報検索システムの制御方法
RU2419857C2 (ru) Способ и система для определения подобия объектов на основании гетерогенных связей
TWI652586B (zh) 基於社交網路的群組查找方法和裝置
CN110019199A (zh) 数据存储、查询方法、装置、设备、计算机可读存储介质
US20130103678A1 (en) Processing Search Queries Using A Data Structure
US20200125900A1 (en) Selecting an algorithm for analyzing a data set based on the distribution of the data set
CN111126510A (zh) 一种异构网络中相似度的计算方法及其相关组件
CN111309970A (zh) 一种数据检索方法、装置、电子设备及存储介质
US9674083B2 (en) Path calculation order deciding method, program and calculating apparatus
Ashraf et al. WeFreS: weighted frequent subgraph mining in a single large graph
US9811563B2 (en) System and method for recursively iterating over a loosely associated data structure
CN117235285B (zh) 融合知识图谱数据的方法及装置
CN110362569A (zh) 数据表的校验方法及装置、电子设备、存储介质
CN109271453A (zh) 一种数据库容量的确定方法和装置
JP4059970B2 (ja) 情報源推薦装置
CN114279457B (zh) 路径规划方法、装置、设备及可读存储介质
WO2020006834A1 (zh) 金融机构推荐方法、设备、存储介质及装置
JP2020187419A (ja) エンティティリンキング方法、情報処理装置およびエンティティリンキングプログラム
CN110119442A (zh) 一种动态搜索方法、装置、设备及介质
JP4282549B2 (ja) サービス検索装置とその方法、プログラム
US7159019B2 (en) Information collection apparatus and method
WO2020233093A1 (zh) 关联图谱生成方法、装置、计算机设备和存储介质