ja/AStar

A*アルゴリズムを用いた最短経路探索

shortest_path_astar関数には次の宣言文が必要です:

CREATE OR REPLACE FUNCTION shortest_path_astar(sql text, source_id integer, 
		target_id integer, directed boolean, has_reverse_cost boolean) 
	RETURNS SETOF path_result

引数:

sql: SQLのクエリーです。以下に続くカラムからなる行セットを返します:

SELECT id, source, target, cost, x1, y1, x2, y2 FROM edge_table
  • id: エッジの識別子[int4]
  • source: 始点ノードの識別子[int4]
  • target: 終点ノードの識別子[int4]
  • cost: エッジにかかる重み(負の重みはエッジがグラフに挿入されることを防ぎます)
  • x1: エッジの始点のx座標
  • y1: エッジの始点のy座標
  • x2: エッジの終点のx座標
  • y2: エッジの終点のy座標
  • reverse_cost (オプション): エッジの反対方向のコスト。この値はdirectedおよびhas_reverse_costパラメータがtrueの場合のみ使用されます。(負のコストについては前述の通りです)

source_id: 始点ノードのID[int4]

directed: 有向グラフの場合はtrueを指定

has_reverse_cost: trueの場合、SQLで生成される行セットのreverse_costカラムは、エッジの逆方向にかかる重みとして使用されます。

関数は行のセットを返します。それぞれの交差しているエッジあたり1行、また終点を含む追加行が1行あります。 各行のカラム構成は:

  • vertex_id: 各エッジの始点ノードIDです。経路探索の終点ノードIDを含む最後のエッジの後に、もう一行あります。(最後のエッジの終点ノードから続くエッジがないことを示すため)
  • edge_id: 交差したエッジのID
  • cost: 現在のエッジに関連付けられたコスト。最後のエッジの場合は0となります。したがって、経路の合計コストはcostカラムの合計となります。

例:

SELECT * FROM shortest_path_astar('SELECT gid AS id, source::int4, 
         target::int4, length::double precision AS cost, x1, y1, x2, y2 
    FROM dourol',3, 7, false, false);
 vertex_id | edge_id | cost 
-----------+---------+------------------------
         3 |       2 |    0.000763954363701041
         4 |      21 |    0.00150254971056274
         6 |       5 |    0.000417442425988342
         7 |      -1 |    0
(4 rows)
SELECT * FROM shortest_path_astar('SELECT gid AS id, source::int4, 
         target::int4, length::double precision AS cost,length::double precision 
    AS reverse_cost, x1, y1, x2, y2 FROM dourol', 3, 7, true, true);

この日本語訳の著作権は、日本ユニシス株式会社に帰属しています。また、この日本語訳は、GNU FDLのもとで提供されています。