(57)【要約】【課題】複数始点から複数終点までの最短経路問題を高速に解くための方法およびシステムを提供することである。【解決手段】上記課題を解決するために第１の態様として、記憶手段を有するコンピュータの処理により、多点対間最短経路問題を解く方法であって、（Ａ）前記コンピュータの記憶領域から、複数の探索開始頂点のグラフ・データＳを読み込むステップと、（Ｂ）前記コンピュータの記憶領域から、複数の探索終点頂点のグラフ・データＴを読み込むステップと、（Ｃ）前記グラフ・データＳから k 個の頂点 s1, s2, ...skを選択するステップと、（Ｄ）前記グラフ・データＳから前記 k 個の頂点を除去するステップと、（Ｅ）前記選択した k 個の頂点の各々について、前記グラフ・データＴまでの最短経路長を探索し、前記記憶領域に記憶するステップと、（Ｆ）前記グラフ・データＳが空になるまで、前記（Ｃ）から（Ｅ）までのステップを繰り返すステップを有する方法を提供する。【選択図】図５
2011007713.tif 000002
【特許請求の範囲】
【請求項１】
記憶手段を有するコンピュータの処理により、多点対間最短経路問題を解く方法であって、
（Ａ）前記コンピュータの記憶領域から、複数の探索開始頂点のグラフ・データＳを読み込むステップと、
（Ｂ）前記コンピュータの記憶領域から、複数の探索終点頂点のグラフ・データＴを読み込むステップと、
（Ｃ）前記グラフ・データＳからk 個の頂点 s1, s2, ... skを選択するステップと、
（Ｄ）前記グラフ・データＳから前記 k 個の頂点を除去するステップと、
（Ｅ）前記選択した k 個の頂点の各々について、前記グラフ・データＴまでの最短経路長を探索し、前記記憶領域に記憶するステップと、
（Ｆ）前記グラフ・データＳが空になるまで、前記（Ｃ）から（Ｅ）までのステップを繰り返すステップ
を有する方法。
【請求項２】
（Ｃ）のステップがダイクストラ法を用いて前記 k 個の頂点を選択するステップである、請求項１記載の方法。
【請求項３】
前記（Ｅ）のステップが、
探索対象頂点を優先度付き待ち行列Ｑとして、前記優先度付き待ち行列Ｑに前記グラフ・データの全頂点を代入するステップと、
前記 k 個の頂点からグラフ・データの全頂点までの最短経路長を格納する配列 distance に既定の最大値を記憶するステップと、
前記優先度付き待ち行列Ｑの優先度を表す配列keyに既定の最大値を記憶するステップと、
前記 k 個の頂点から自身までの最短経路長を格納する前記配列 distance及びkey の該当する要素に０を記憶するステップと、
（Ｇ）前記配列 key の中で最小の頂点vをQから削除するステップと、
（Ｈ）前記頂点vにおける配列 key に既定の最大値を設定するステップと、
（Ｉ）k個の頂点の各々について、前記最小の頂点vに隣接する各頂点までの経路長を算出し、前記算出した値が現在の配列 distance の値より小さい場合に、その値を配列 distanceに代入し配列 key に探索のための優先度を表す値を代入するステップと、
前記探索対象頂点Ｑが空になるまで前記（Ｇ）から（Ｉ）のステップを繰り返すステップ
である、請求項１記載の方法。
【請求項４】
前記（Ｉ）のステップが、
前記最小の頂点vに隣接する頂点の各々について
変数 newKey に既定の最大値を代入するステップと、
k個の頂点の各々について、前記隣接する頂点までの経路長を算出しその値を変数 temp に代入するステップと、
前記変数 tempの値が前記隣接する頂点における配列 distance の値より小さい場合、その値を前記配列 distanceに代入し、前記変数 temp の値が前記変数 newKey の値より小さいか判断し、小さい場合には前記変数 newKeyに前記変数 tempの値を代入するステップと、
前記変数 newKey が前記隣接する頂点における配列 key の値より小さい場合に、前記配列keyに前記変数 newKeyの値を代入するステップ
である、請求項３記載の方法。
【請求項５】
記憶手段を有するコンピュータの処理により、多点対間最短経路問題を解くシステムであって、
（Ａ）前記コンピュータの記憶領域から、複数の探索開始頂点のグラフ・データＳを読み込む手段と、
（Ｂ）前記コンピュータの記憶領域から、複数の探索終点頂点のグラフ・データＴを読み込む手段と、
（Ｃ）前記グラフ・データＳからk 個の頂点 s1, s2, ... skを選択する手段と、
（Ｄ）前記グラフ・データＳから前記 k 個の頂点を除去する手段と、
（Ｅ）前記選択した k 個の頂点の各々について、前記グラフ・データＴまでの最短経路長を探索し、前記記憶領域に記憶する手段と、
（Ｆ）前記グラフ・データＳが空になるまで、前記（Ｃ）から（Ｅ）までの手段を繰り返す手段
を有するシステム。
【請求項６】
（Ｃ）の手段がダイクストラ法を用いて前記 k 個の頂点を選択する手段である、請求項５記載のシステム。
【請求項７】
前記（Ｅ）の手段が、
探索対象頂点を優先度付き待ち行列Ｑとして、前記優先度付き待ち行列Ｑに前記グラフ・データの全頂点を代入する手段と、
前記 k 個の頂点からグラフ・データの全頂点までの最短経路長を格納する配列 distance に既定の最大値を記憶する手段と、
前記優先度付き待ち行列Ｑの優先度を表す配列keyに既定の最大値を記憶する手段と、
前記 k 個の頂点から自身までの最短経路長を格納する前記配列 distance及びkey の該当する要素に０を記憶する手段と、
（Ｇ）前記配列 key の中で最小の頂点vをQから削除する手段と、
（Ｈ）前記頂点vにおける配列 key に既定の最大値を設定する手段と、
（Ｉ）k個の頂点の各々について、前記最小の頂点vに隣接する各頂点までの経路長を算出し、前記算出した値が現在の配列 distance の値より小さい場合に、その値を配列 distanceに代入し配列 key に探索のための優先度を表す値を代入する手段と、
前記探索対象頂点Ｑが空になるまで前記（Ｇ）から（Ｉ）の手段を繰り返す手段
である、請求項５記載のシステム。
【請求項８】
前記（Ｉ）の手段が、
前記最小の頂点vに隣接する頂点の各々について
変数 newKey に既定の最大値を代入する手段と、
k個の頂点の各々について、前記隣接する頂点までの経路長を算出しその値を変数 temp に代入する手段と、
前記変数 tempの値が前記隣接する頂点における配列 distance の値より小さい場合、その値を前記配列 distanceに代入し、前記変数 temp の値が前記変数 newKey の値より小さいか判断し、小さい場合には前記変数 newKeyに前記変数 tempの値を代入する手段と、
前記変数 newKey が前記隣接する頂点における配列 key の値より小さい場合に、前記配列keyに前記変数 newKeyの値を代入する手段
である、請求項７記載のシステム。
【請求項９】
多点対間最短経路問題を解くためのプログラムであって、該プログラムが、記憶手段を有するコンピュータに、
（Ａ）前記コンピュータの記憶領域から、複数の探索開始頂点のグラフ・データＳを読み込む機能と、
（Ｂ）前記コンピュータの記憶領域から、複数の探索終点頂点のグラフ・データＴを読み込む機能と、
（Ｃ）前記グラフ・データＳからk 個の頂点 s1, s2, ... skを選択する機能と、
（Ｄ）前記グラフ・データＳから前記 k 個の頂点を除去する機能と、
（Ｅ）前記選択した k 個の頂点の各々について、前記グラフ・データＴまでの最短経路長を探索し、前記記憶領域に記憶する機能と、
（Ｆ）前記グラフ・データＳが空になるまで、前記（Ｃ）から（Ｅ）までの機能を繰り返す機能
を実現させるプログラム。
【請求項１０】
（Ｃ）の機能がダイクストラ法を用いて前記 k 個の頂点を選択する機能である、請求項９記載のプログラム。
【請求項１１】
前記（Ｅ）の機能が、
探索対象頂点を優先度付き待ち行列Ｑとして、前記優先度付き待ち行列Ｑに前記グラフ・データの全頂点を代入する機能と、
前記 k 個の頂点からグラフ・データの全頂点までの最短経路長を格納する配列 distance に既定の最大値を記憶する機能と、
前記優先度付き待ち行列Ｑの優先度を表す配列keyに既定の最大値を記憶する機能と、
前記 k 個の頂点から自身までの最短経路長を格納する前記配列 distance及びkey の該当する要素に０を記憶する機能と、
（Ｇ）前記配列 key の中で最小の頂点vをQから削除する機能と、
（Ｈ）前記頂点vにおける配列 key に既定の最大値を設定する機能と、
（Ｉ）k個の頂点の各々について、前記最小の頂点vに隣接する各頂点までの経路長を算出し、前記算出した値が現在の配列 distance の値より小さい場合に、その値を配列 distanceに代入し配列 key に探索のための優先度を表す値を代入する機能と、
前記探索対象頂点Ｑが空になるまで前記（Ｇ）から（Ｉ）の機能を繰り返す機能
である、請求項９記載のプログラム。
【請求項１２】
前記（Ｉ）の機能が、
前記最小の頂点vに隣接する頂点の各々について
変数 newKey に既定の最大値を代入する機能と、
k個の頂点の各々について、前記隣接する頂点までの経路長を算出しその値を変数 temp に代入する機能と、
前記変数 tempの値が前記隣接する頂点における配列 distance の値より小さい場合、その値を前記配列 distanceに代入し、前記変数 temp の値が前記変数 newKey の値より小さいか判断し、小さい場合には前記変数 newKeyに前記変数 tempの値を代入する機能と、
前記変数 newKey が前記隣接する頂点における配列 key の値より小さい場合に、前記配列keyに前記変数 newKeyの値を代入する機能
である、請求項１１記載のプログラム。
【請求項１３】
請求項９〜１２記載のプログラムを記録した、コンピュータ可読記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、多点対間最短経路問題に関し、多点対間最短経路問題を高速に解く方法およびシステムに関する。
【背景技術】
【０００２】
従来、複数始点から複数終点までの最短経路問題（多点対間最短経路問題）の解法は、単一始点から複数終点を、複数始点に応用したものが知られている。例えば特許文献１は、地図上の交差点に対応した各ノードと、それに繋がるリンクコスト（距離）を分離独立させ、それぞれを隣接行列或いは隣接リストで管理しながらダイクストラ法を用いて経路探索を行う。特許文献１は、単一始点複数終点最短経路問題をダイクストラ（Dijkstra）法を利用して解く際の効率的なデータ構造を提案しているが、複数始点複数終点の最短経路問題そのものを高速化する技法ではない。
【０００３】
複数始点から複数終点への最短経路問題（many-to-many)を解くものとして非特許文献１がある。非特許文献１は道路情報ネットワークの探索方法であるが、最初に入力グラフを前処理するステップと、その後、前処理済みのグラフに対してダイクストラ法の変形版を適用するステップから構成されている。非特許文献１は全点対間最短経路問題を高速に解く方法を提供しない。逆に非特許文献１は前処理部で全点対間最短経路問題（all-to-all）をダイクストラ法を適用して解くため本発明の手法と組み合わせることにより全点対間最短経路問題を高速に解くことが可能になる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開2001-125882
【非特許文献】
【０００５】
【非特許文献１】Sebastian Knopp,Peter Sanders, Dominik Schultes,Frank Schulz, Dorothea Wagner: Computing Many-to-Many Shortest Paths UsingHighway Hierarchies. ALENEX 2007
【発明の概要】
【発明が解決しようとする課題】
【０００６】
複数始点から複数終点までの最短経路問題を高速に解くための新しい方法およびシステムを提供することである。さらに全点対間最短経路問題を高速に解く方法およびシステムを提供することである。
【課題を解決するための手段】
【０００７】
本発明の１つの実施態様では、記憶手段を有するコンピュータの処理により、多点対間最短経路問題を解く方法であって、（Ａ）前記コンピュータの記憶領域から、複数の探索開始頂点のグラフ・データＳを読み込むステップと、（Ｂ）前記コンピュータの記憶領域から、複数の探索終点頂点のグラフ・データＴを読み込むステップと、（Ｃ）前記グラフ・データＳから k 個の頂点 s1, s2, ...skを選択するステップと、（Ｄ）前記グラフ・データＳから前記 k 個の頂点を除去するステップと、（Ｅ）前記選択した k 個の頂点の各々について、前記グラフ・データＴまでの最短経路長を探索し、前記記憶領域に記憶するステップと、（Ｆ）前記グラフ・データＳが空になるまで、前記（Ｃ）から（Ｅ）までのステップを繰り返すステップ  を含む。
【０００８】
本発明の１つの実施態様では、（Ｃ）のステップがダイクストラ法を用いて前記 k 個の頂点を選択するステップである。
【０００９】
本発明の１つの実施態様では、前記（Ｅ）のステップが、探索対象頂点を優先度付き待ち行列Ｑとして、前記優先度付き待ち行列Ｑに前記グラフ・データの全頂点を代入するステップと、前記 k 個の頂点からグラフ・データの全頂点までの最短経路長を格納する配列 distance に既定の最大値を記憶するステップと、前記優先度付き待ち行列Ｑの優先度を表す配列keyに既定の最大値を記憶するステップと、前記 k 個の頂点から自身までの最短経路長を格納する前記配列 distance及びkey の該当する要素に０を記憶するステップと、
（Ｇ）前記配列 key の中で最小の頂点vをQから削除するステップと、（Ｈ）前記頂点vにおける配列 key に既定の最大値を設定するステップと、（Ｉ）k個の頂点の各々について、前記最小の頂点vに隣接する各頂点までの経路長を算出し、前記算出した値が現在の配列 distance の値より小さい場合に、その値を配列 distanceに代入し配列 key に探索のための優先度を表す値を代入するステップと、前記探索対象頂点Ｑが空になるまで前記（Ｇ）から（Ｉ）のステップを繰り返すステップである。
【００１０】
本発明の１つの実施態様では、前記（Ｉ）のステップが、前記最小の頂点vに隣接する頂点の各々について変数newKey に既定の最大値を代入するステップと、k個の頂点の各々について、前記隣接する頂点までの経路長を算出しその値を変数 temp に代入するステップと、前記変数tempの値が前記隣接する頂点における配列distance の値より小さい場合、その値を前記配列distanceに代入し、前記変数 temp の値が前記変数 newKey の値より小さいか判断し、小さい場合には前記変数 newKeyに前記変数 tempの値を代入するステップと、前記変数 newKey が前記隣接する頂点における配列 key の値より小さい場合に、前記配列keyに前記変数 newKeyの値を代入するステップである。
【００１１】
本発明の１つの実施態様では、記憶手段を有するコンピュータの処理により、多点対間最短経路問題を解くシステムであって、（Ａ）前記コンピュータの記憶領域から、複数の探索開始頂点のグラフ・データＳを読み込む手段と、（Ｂ）前記コンピュータの記憶領域から、複数の探索終点頂点のグラフ・データＴを読み込む手段と、（Ｃ）前記グラフ・データＳから k 個の頂点 s1, s2, ...skを選択する手段と、（Ｄ）前記グラフ・データＳから前記 k 個の頂点を除去する手段と、（Ｅ）前記選択した k 個の頂点の各々について、前記グラフ・データＴまでの最短経路長を探索し、前記記憶領域に記憶する手段と、（Ｆ）前記グラフ・データＳが空になるまで、前記（Ｃ）から（Ｅ）までの手段を繰り返す手段を有する。
【００１２】
本発明の１つの実施態様では、（Ｃ）の手段がダイクストラ法を用いて前記 k 個の頂点を選択する手段である。
【００１３】
本発明の１つの実施態様では、前記（Ｅ）の手段が、探索対象頂点を優先度付き待ち行列Ｑとして、前記優先度付き待ち行列Ｑに前記グラフ・データの全頂点を代入する手段と、前記 k 個の頂点からグラフ・データの全頂点までの最短経路長を格納する配列 distance に既定の最大値を記憶する手段と、前記優先度付き待ち行列Ｑの優先度を表す配列keyに既定の最大値を記憶する手段と、前記 k 個の頂点から自身までの最短経路長を格納する前記配列 distance及びkey の該当する要素に０を記憶する手段と、
【００１４】
（Ｇ）前記配列 key の中で最小の頂点vをQから削除する手段と、（Ｈ）前記頂点vにおける配列 key に既定の最大値を設定する手段と、（Ｉ）k個の頂点の各々について、前記最小の頂点vに隣接する各頂点までの経路長を算出し、前記算出した値が現在の配列 distance の値より小さい場合に、その値を配列 distanceに代入し配列 key に探索のための優先度を表す値を代入する手段と、前記探索対象頂点Ｑが空になるまで前記（Ｇ）から（Ｉ）の手段を繰り返す手段である。
【００１５】
本発明の１つの実施態様では、前記（Ｉ）の手段が、前記最小の頂点vに隣接する頂点の各々について変数newKey に既定の最大値を代入する手段と、k個の頂点の各々について、前記隣接する頂点までの経路長を算出しその値を変数 temp に代入する手段と、前記変数tempの値が前記隣接する頂点における配列distance の値より小さい場合、その値を前記配列distanceに代入し、前記変数 temp の値が前記変数 newKey の値より小さいか判断し、小さい場合には前記変数 newKeyに前記変数 tempの値を代入する手段と、前記変数 newKey が前記隣接する頂点における配列 key の値より小さい場合に、前記配列keyに前記変数 newKeyの値を代入する手段である。
【００１６】
本発明の１つの実施態様では、多点対間最短経路問題を解くためのプログラムであって、該プログラムが、記憶手段を有するコンピュータに、（Ａ）前記コンピュータの記憶領域から、複数の探索開始頂点のグラフ・データＳを読み込む機能と、（Ｂ）前記コンピュータの記憶領域から、複数の探索終点頂点のグラフ・データＴを読み込む機能と、（Ｃ）前記グラフ・データＳから k 個の頂点 s1, s2, ...skを選択する機能と、（Ｄ）前記グラフ・データＳから前記 k 個の頂点を除去する機能と、（Ｅ）前記選択した k 個の頂点の各々について、前記グラフ・データＴまでの最短経路長を探索し、前記記憶領域に記憶する機能と、（Ｆ）前記グラフ・データＳが空になるまで、前記（Ｃ）から（Ｅ）までの機能を繰り返す機能を実現させる。
【００１７】
本発明の１つの実施態様では、（Ｃ）の機能がダイクストラ法を用いて前記 k 個の頂点を選択する機能である。
【００１８】
本発明の１つの実施態様では、前記（Ｅ）の機能が、探索対象頂点を優先度付き待ち行列Ｑとして、前記優先度付き待ち行列Ｑに前記グラフ・データの全頂点を代入する機能と、前記 k 個の頂点からグラフ・データの全頂点までの最短経路長を格納する配列 distance に既定の最大値を記憶する機能と、前記優先度付き待ち行列Ｑの優先度を表す配列keyに既定の最大値を記憶する機能と、前記 k 個の頂点から自身までの最短経路長を格納する前記配列 distance及びkey の該当する要素に０を記憶する機能と、
【００１９】
（Ｇ）前記配列 key の中で最小の頂点vをQから削除する機能と、（Ｈ）前記頂点vにおける配列 key に既定の最大値を設定する機能と、（Ｉ）k個の頂点の各々について、前記最小の頂点vに隣接する各頂点までの経路長を算出し、前記算出した値が現在の配列 distance の値より小さい場合に、その値を配列 distanceに代入し配列 key に探索のための優先度を表す値を代入する機能と、前記探索対象頂点Ｑが空になるまで前記（Ｇ）から（Ｉ）の機能を繰り返す機能である。
【００２０】
本発明の１つの実施態様では、前記（Ｉ）の機能が、前記最小の頂点vに隣接する頂点の各々について変数newKey に既定の最大値を代入する機能と、k個の頂点の各々について、前記隣接する頂点までの経路長を算出しその値を変数 temp に代入する機能と、前記変数tempの値が前記隣接する頂点における配列distance の値より小さい場合、その値を前記配列distanceに代入し、前記変数 temp の値が前記変数 newKey の値より小さいか判断し、小さい場合には前記変数 newKeyに前記変数 tempの値を代入する機能と、前記変数 newKey が前記隣接する頂点における配列 key の値より小さい場合に、前記配列keyに前記変数 newKeyの値を代入する機能である。
【００２１】
本発明の１つの実施態様では、上記プログラムを記録した、コンピュータ可読記録媒体である。
【発明の効果】
【００２２】
本発明の実施態様によれば、複数始点から複数終点までの最短経路問題を高速に解くための新しい方法およびシステムが提供され、さらに全点対間最短経路問題を高速に解く方法およびシステムが提供される。従来、ＧＩＳに用いられるデータは多点対間最短経路問題を予め相当の時間をかけ計算している。本発明はこの多点対間最短経路の計算をリアルタイムに行うための基盤となる技術になる可能性を秘めている。
【図面の簡単な説明】
【００２３】
【図１】多点対間最短経路問題の例である。
【図２】グラフの頂点の配置の例である。
【図３】頂点の配置例に基づくグラフのデータ構造を示す図である。
【図４】距離が近い２頂点を開始点とした例について説明する図である。
【図５】本発明の処理の流れの概要である。
【図６】本発明の全体のフローチャートである。
【図７】初期化処理の詳細なフローチャートである。
【図８】各枝の処理の詳細なフローチャートである。
【図９】更新処理の詳細なフローチャートである。
【図１０】コンピュータ・ハードウェアのブロック図である。
【図１１】ダイクストラ法を用いた最短経路探索例である。
【図１２】本発明の探索法を用いた最短経路探索例である。
【発明を実施するための形態】
【００２４】
頂点集合 V と枝集合 E から構成されるグラフ G(V,E) と、各枝 e∈E について距離 d(e) (≧0) が与えられたとき、頂点集合 S, T⊆V について、全ての (u, v) ∈ S×T ペアの頂点 u から頂点 v まで到達する距離の最小値を計算する問題が多点対間最短経路問題である。特にS と T が V に等しいとき、全点対間最短経路問題(all-to-all)という。本実施例では、全点対間最短経路問題は多点対間最短経路問題の特殊ケースと考え、両者を特に区別せずに多点対間最短経路問題(many-to-many)として記載する。
【００２５】
多点対間最短経路問題には、多くの応用があるが、その一つが GIS （地理情報システム）への適用である。道路ネットワークは、上記でいうグラフとみなすことができ、道路ネットワーク上の多数の拠点について、それらの拠点間の距離（もしくは移動時間）を求める問題は、多点対間最短経路問題としてモデル化できる。
【００２６】
図１に多点対間最短経路問題の例を示す。図１において、入力がグラフ G(V,E)の点集合 S, T ⊆ Vである。この場合の出力として、全ての (u, v) ∈ S×T ペア（図１の点Ａ，Ｂ，Ｃ，Ｄのペア）について、u→v の最短経路長を求めている。ここで一般には S=Tである。例えば図１の例ではグラフの各枝の長さが１のときＡからＤへの最短距離は５になる。なお以下の説明では入力グラフが無向グラフであることを前提に記載するが、有向グラフでも本発明の手法はそのまま適用可能である。
【００２７】
図２にグラフの頂点の配置の例を示す。グラフの各頂点には、１から連番で番号が付与される。図２ではｎ番目の頂点はｎを丸で囲って表示されている。図２では頂点１は隣接する頂点として、頂点２、５及び８を持ち、それぞれへの距離は、4.0, 5.0, 2.5である。頂点２は隣接する頂点として、頂点１、４及び５を持ち、それぞれへの距離は、4.0, 3.5, 3.0 である。
【００２８】
次に図３に、図２の頂点の配置例に基づくグラフのデータ構造を示す。このデータが本発明の入力となるグラフ・データでありメモリに記憶される。各頂点は、隣接する頂点の番号のリストへのリンクと、隣接する頂点への距離のリストへのリンクを含む。なおこのようなデータ構造は一例に過ぎず種々の変形が可能である。
【００２９】
次に図４にS 中の距離が近い２頂点 s1 と s2を始点とした場合について説明する。これにダイクストラ法を |S| 回適用して多点対間最短経路問題を解く。この両者では似たような最短経路木が生成されていると推測される。なぜなら、s1 と s2 の距離が近いので、s1 からある頂点 v への最短経路は、s1 から s2 を経由して v に到達する経路と一致する可能性が高いからである（もちろん必ず一致するわけではない）。このことから、s1 を始点とする最短経路木（ａ）とs2 を始点とする最短経路木（ｂ）を一気に（同時に）作成することができれば高速化につながる。
【００３０】
ダイクストラ法を |S| 回繰り返して多点対間最短経路問題を解くアルゴリズムを擬似コードで表すとすると以下のようになる。
for s∈S {
ダイクストラ法を適用し、s を始点とする単一始点最短経路問題を解く
}
【００３１】
そして本発明で提案するアルゴリズムは下記のような擬似コードで記述できる。２頂点の場合に限定せずに一般化して、k 頂点の場合について記述する。k 頂点を選択して複数始点最短経路問題を一気に解く点が本発明の特徴である。
While S が空でない {
S 中で互いに距離の近い頂点 s1,…,sk を選択する
Let S := S{s1,…,sk}
s1,…,sk を始点とする複数始点最短経路問題を一気に解く。
}
【００３２】
図５に本発明の処理の流れの概要を図示する。ステップ５０２でグラフ・データ格納部５０１からグラフ・データ３０１を読み込む。ステップ５０３でＳが空かを判定しそうであれば処理は終了する。空でなければ処理はステップ５０４へ進む。ステップ５０４ではＳからk 個の頂点s1,…,skを取り出す。すなわちＳからk 個の頂点を除去する。次にステップ５０５で頂点s1,…,skからの複数始点最短経路問題を解き、結果を出力格納部５０６に記録する。
【００３３】
頂点s1,…,sk からの複数始点最短経路問題をどのようにして一気に解くかを説明する前に、理解が容易になるように通常の ダイクストラ法による単一始点最短経路問題を解く擬似コードを示した後、本発明の擬似コードを説明する。
【００３４】
＜前提＞
vertex s : 開始点（頂点）
Q： 検索対象となる点（頂点）を格納したキュー(優先度付き待ち行列を用いたキューで priority queue と呼ぶ)
distance[v] : 始点 s から v に到達するそれまでに見つかった最短経路長を格納する配列
key[v] : 頂点v に対応する優先度を格納する配列（priority queueから頂点を削除する際に、どの頂点v を削除するかを決定する手掛かりとなる値となる。下記の ダイクストラ法の説明では distance[v] と同じ値となる。本発明の手法では何を入れても構わない。）
d(e) : 頂点から頂点へ伸びる枝 e の長さ
e.toNode : 枝 e の到達先頂点
【００３５】
＜ダイクストラ法による単一始点最短経路問題を解く擬似コード＞
Dijkstra(graph G(V,E), vertex s)
for each v∈V { distance[v] := ∞; key[v] := ∞; }
distance[s]:= 0
V 中の頂点を全て Q に入れる
While Q が空でない {
Q から key[v] の値が最小の v を削除
For each esuch that e is outgoing from v {
temp :=distance[v] + d(e) ;
if temp< distance[e.toNode] then {
distance[e.toNode] := temp
key[e.toNode] := temp
Q に e.toNode を入れる
}
}
}
配列 distance[] を出力
【００３６】
上記の ダイクストラ法を用いて始点ｓから各頂点までの最短経路を探索した例を図１１に示す。各点は上記のように固有の長さを持つ経路木で接続されており各点の横に始点ｓからの最短距離が記載されている。
【００３７】
本発明は上記擬似コードのdistance 配列を拡張し、distance[i][v] に始点 si から v に到達するそれまでに見つかった最短経路長を記憶するようする。
【００３８】
＜本発明による複数始点最短経路問題を解く擬似コード＞
Dijkstra(graph G(V,E), vertex{s1,...,sk})  // Selection
for i in 1...k { for each v∈V { distance[i][v] := ∞; key[v] := ∞; } }
for i in 1...k { distance[i][si] := 0; key[si] := 0; }
V 中の頂点を全て Q に入れる
While Q が空でない {
Q から key[v] の値が最小の v を削除
key[v] := ∞
For each esuch that e is outgoing from v {
newKey := ∞
For i in 1…k {
temp :=distance[i][v] + d(e)
if temp< distance[i][e.toNode]then {
distance[i][e.toNode] := temp
if temp< newKeythen newKey := temp
}
}
if newKey < key[e.toNode] then {key[e.toNode] := newKey; Q に e.toNode を追加} // <---update key 
}
}
for i in 1…k { 配列 distance[i] を出力 }
【００３９】
上記擬似コードにおける配列key[v]は重要な配列である。この配列 key[v] は priority queue (Q) から頂点を削除する際に、どの頂点 v を削除するかを決定する手掛かりとなる値をもつ。つまり key[v] に入る値は、優先度付き待ち行列 (priority queue) Q の「優先度」に相当する。ダイクストラ法では key[v] にいれる値は常に distance[v] と同じ値を入れることになる。本発明では key[v] には必ずしもdistance[v] の値を入れない点に注意されたい。なお key[v] にはどのような値を入るかによって実行時間が変化するが、どのような値を入れたとしても上記アルゴリズムは必ず最短経路長を出力する。
【００４０】
上記本発明の探索法を用いて２頂点s1 と s2について各頂点までの最短経路を探索した例を図１２に示す。各点には s1 と s2 からの最短距離が２つセットで記載されている。図１２ではk=2 として各頂点につき２つの最短距離が計算されることを例示している。
【００４１】
上記本発明の擬似コードのフローを図６〜９に示す。図６は全体の流れを示し、図７は初期化６０１の詳細なフローを示し、図８は枝eの処理６０６の詳細なフローを示し、図９は更新処理８０５の詳細なフローを示す。まず図６においてステップ６０１で初期化を行う。初期化の詳細は図７で説明する。ステップ６０２でＳが空か判断し、空なら処理を終了する。空でなければステップ６０３でQ から key[v] の値が最小の頂点 v を削除する。すなわち探索の基点をvにセットする。次にkey[v] に最大値を代入する。そして vから伸びる各枝についてステップ６０５から６０７までの処理をループする。このループでは枝eの処理（ステップ６０６）を行う。このステップ６０６の詳細は図８で説明する。
【００４２】
図７に初期化６０１の詳細なフローを示す。まずステップ７０１で開始点としてk 個の頂点を選択する。次にステップ７０２〜７０４で全ての頂点v∈Vについて配列 distance[i][v]及び key[v] に最大値を代入する。最大値として∞を代入しているが、実際に記憶されるメモリ中の値はグラフの経路長として取りえる値よりも十分大きい値を予めセットするものとする。ステップ７０２〜ステップ７０５はｖについてのループを構成する。ステップ７０１〜７０６は変数i=1,…,kについて配列 distance[i][si]およびkey[si] の値を最大値を代入する。最後にステップ７１２でＱにＶ中の頂点を全て追記して初期化処理を終了する。
【００４３】
上記初期化において、配列distance[i][v] が si から v までの最短経路長の上限値になっていれば、どのような初期化を行っても良い。例えば、別途i=1,…,k について配列distance[i][si]  に正しい最短経路長を計算しておき、その値を上記最大値として入れておいても良い。
【００４４】
図８に枝eの処理６０６の詳細なフローを示す。ステップ８０１で newKeyに最大値を代入する。次に i=1,…,k についてステップ８０２〜ステップ８０６のループを構成する。ステップ８０３では臨時変数temp にiまでの経路長 distance[i] に枝 e の長さ d(e) の和を代入する。ステップ８０４で臨時変数 temp の値が配列 distance[i][e.toNode] より小さいか判断する。もし小さければ処理はステップ８０５の更新処理に移る。そうでなければステップ８０６で次の i についての処理を行う。ステップ８０２〜ステップ８０６のループ終了後、処理はステップ８０７に移る。ステップ８０７では newKey が key[e.toNode] より小さいかを判断し、小さくない場合、処理は終了する。小さい場合には、処理はステップ８０８に移る。ステップ８０８では key[e.toNode] に newKey を代入し、ステップ８０９でＱに e.toNodeを代入する。
【００４５】
なおステップ８０８〜８０９における処理（update key）では key[e.toNode] にどのような値を入れても本発明の擬似コードは正しく動作する。つまり newKey の値を入れる必要は必ずしもない。ただしステップ８０８〜８０９においてどのような値を入れるかによって実行時間が変化する。上記の擬似コードは実装方法の一例であり種々の変更が可能である。
【００４６】
図９は更新処理８０５の詳細なフローを示す。ステップ９０１で配列 distande[i][e.toNode] に key を代入する。次にステップ９０２で 臨時変数 temp が newKey より小さいか判断し、小さい場合には処理はステップ９０３に移り newKey に臨時変数 temp を代入する。臨時変数 temp が newKey より小さくない場合は処理は終了する。
【００４７】
また擬似コードにおける s1,…,sk の選び方（Selection）の例としては、適当に s1∈S を選んだ後、s1 からの距離が近い頂点から順に k 個取り出す方法が挙げられる。例えば近い頂点を選ぶ方法として、A*アルゴリズムまたはダイクストラ法を使ってもよい。なお k の値は、グラフ・データの数にも左右されるが、実験的に８〜６４が良い結果が得られている。
【００４８】
例示として s1,…,sk の選ぶ際に ダイクストラ法を用いた擬似コードを以下に示す。前提として S には、それまでの繰り返しの処理（iteration）で未選択の頂点が入っているものとする。
【００４９】
SelectVertices(graph G(V,E), S)
S の中から一つの頂点 s1 を選び、U = {s1} とおく。
for each v∈V { distance[v] := ∞; key[v] := ∞; }
distance[s1] :=0
V 中の頂点を全て Q に入れる
While Q が空でない {
Q から key[v] の値が最小の v を削除
If v∈S then { U に v を追加。
If U の大きさ |U| が k と等しい then { U を出力して、処理を終了}
}
For each e suchthat e is outgoing from v {
temp :=distance[v] + d(e) ;
if temp <distance[e.toNode] then {
distance[e.toNode] := temp
key[e.toNode] := temp
Q に e.toNode を入れる
}
} 
【００５０】
＜コンピュータ・ハードウェアのブロック図＞
図１０に本発明の実施態様における、図５のシステムが有するコンピュータ・ハードウェアのブロック図を一例として示す。本発明の実施形態に係るコンピュータ・システム（１００１）は、ＣＰＵ（１００２）とメイン・メモリ（１００３）と含み、これらはバス（１００４）に接続されている。ＣＰＵ（１００２）は好ましくは、３２ビット又は６４ビットのアーキテクチャに基づくものであり、例えば、インテル社のＸｅｏｎ（商標）シリーズ、Ｃｏｒｅ（商標）シリーズ、Ａｔｏｍ（商標）シリーズ、Ｐｅｎｔｉｕｍ（商標）シリーズ、Ｃｅｌｅｒｏｎ（商標）シリーズ、ＡＭＤ社のＰｈｅｎｏｍ（商標）シリーズ、Ａｔｈｌｏｎ（商標）シリーズ、Ｔｕｒｉｏｎ（商標）シリーズ及びＳｅｍｐｒｏｎ（商標）などを使用することができる。
【００５１】
バス（１００４）には、ディスプレイ・コントローラ（１００５）を介して、ＬＣＤモニタなどのディスプレイ（１００６）が接続されている。ディスプレイ（１００６）は、コンピュータ・システムの管理のために、通信回線を介してネットワークに接続されたコンピュータ・システムについての情報と、そのコンピュータ・システム上で動作中のソフトウェアについての情報を、適当なグラフィック・インターフェースで表示するために使用される。バス（１００４）にはまた、ＩＤＥ又はＳＡＴＡコントローラ（１００７）を介して、ハードディスク又はシリコン・ディスク（１００８）と、ＣＤ−ＲＯＭ、ＤＶＤドライブ又はＢｌｕ−ｒａｙドライブ（１００９）が接続されている。
【００５２】
ハードディスク（１００８）には、オペレーティング・システム、本発明のコードを含むプログラム及びデータが、メイン・メモリ（１００３）にロード可能なように記憶されている。好ましくはハードディスク（１００８）は本発明のグラフ・データ格納部５０１として使用される。またグラフ・データ格納部５０１に記憶されたグラフ・データは入力データ読み込み部５０２により読み込まれメイン・メモリ（１００３）に格納される。
【００５３】
ＣＤ−ＲＯＭ、ＤＶＤ又はＢｌｕ−ｒａｙドライブ（１００９）は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ又はＢｌｕ−ｒａｙディスクからプログラムをハードディスクに追加導入するために使用される。バス（１００４）には更に、キーボード・マウスコントローラ（１０１０）を介して、キーボード（１０１１）及びマウス（１０１２）が接続されている。本発明のグラフ・データを上記外部記憶装置に記憶し、これを読み込むようにしても良い。
【００５４】
通信インタフェース（１０１４）は、例えばイーサネット（商標）・プロトコルに従う。通信インタフェース（１０１４）は、通信コントローラ（１０１３）を介してバス（１００４）に接続され、コンピュータ・システム及び通信回線（１０１５）を物理的に接続する役割を担い、コンピュータ・システムのオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インターフェース層を提供する。なお、通信回線は、有線ＬＡＮ環境、或いは例えばＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどの無線ＬＡＮ接続規格に基づく無線ＬＡＮ環境であってもよい。本発明のグラフ・データを通信インタフェース（１０１４）を介して外部のデータベースから取り込むようにしても良い。
【００５５】
＜実験結果＞
通常の ダイクストラ法を繰り返し適用する方法と本発明で提案するアルゴリズムの両者を実装し、実行時間（入出力にかかる時間は除く）を比較した。実験に使用した入力データは公開されているアメリカ合衆国の州別道路ネットワーク情報 (TIGER/Line) を使用した。入力データDCに対して全点対間最短経路問題を解くのにかかった時間を計測すると本発明の手法の方が３倍以上高速であること確かめられた。本発明の手法の方がダイクストラ法のボトルネックである priority queue に対する操作が少なくなっていることがその理由の一つである。
【図１】
2011007713.tif 000003
【図２】
2011007713.tif 000004
【図３】
2011007713.tif 000005
【図４】
2011007713.tif 000006
【図５】
2011007713.tif 000007
【図６】
2011007713.tif 000008
【図７】
2011007713.tif 000009
【図８】
2011007713.tif 000010
【図９】
2011007713.tif 000011
【図１０】
2011007713.tif 000012
【図１１】
2011007713.tif 000013
【図１２】
2011007713.tif 000014