直結する2つのノードの場合、最短距離は当然一意に決定します。postGISのpgr_dijkstra()は、この直結する2つのノードを指定すると、値を返さないようですが、これは正しい仕様でしょうか

ロングランで、pgr_dijkstra()の挙動の振舞が変であることを発見したので、ChatGPTに相談してみました
User
You
直結する2つのノードの場合、最短距離は当然一意に決定します。postGISのpgr_dijkstra()は、この直結する2つのノードを指定すると、値を返さないようですが、これは正しい仕様でしょうか
ChatGPT
ChatGPT

直結する2つのノードの場合、最短経路は確かに一意に決定します。そのため、pgRoutingのpgr_dijkstra()関数が直結する2つのノード間で値を返さない場合、これは通常は仕様としては誤っています。

pgRoutingのpgr_dijkstra()関数は、通常、始点と終点が異なるノード間の最短経路を見つけるために使用されます。この場合、始点と終点が同じノードである直結する2つのノード間の最短経路を求める必要はないため、関数が値を返さない可能性があります。

しかしながら、直結する2つのノード間の最短経路を求める必要がある場合、通常はpgr_dijkstra()ではなく、pgr_dijkstraCost()やpgr_dijkstraVia()などの関数が使用されます。これらの関数は、エッジ間のコスト(重み)を考慮して最短経路を見つけるため、直結する2つのノード間の最短経路を正しく返すことが期待されます。

したがって、直結する2つのノード間の最短経路を求める場合、適切な関数を使用し、正しい結果が得られるようにすることが重要です。

 

pgr_dijkstra()で、ダイクストラの順番を壊さずにルートの座標を得る方法(getDijkstraPath())

を改造する必要が出てきました。


User

You
postGISのpgr_dijkstraVia()は何をしてくれるAPIですか
ChatGPT
ChatGPT

PostGISのpgr_dijkstraVia()は、指定された複数の経由地を通過する最短経路を見つけるためのAPIです。これはpgRoutingの一部であり、Dijkstraアルゴリズムを使用して経路を計算します。

このAPIを使用すると、始点と終点の間に複数の経由地が与えられ、それらの経由地を通過する最短経路を見つけることができます。つまり、指定された始点から終点までの最短経路を見つける際に、特定の地点(経由地)を経由しなければならない場合に役立ちます。

pgr_dijkstraVia()関数の基本的な使い方は次のとおりです:

sql

SELECT * FROM pgr_dijkstraVia(
'edge_table', -- エッジテーブル
ARRAY[start_node, end_node], -- 始点と終点のノードIDの配列
ARRAY[via_node1, via_node2, ...], -- 経由地のノードIDの配列
directed := true/false, -- エッジが有向か無向かを指定
has_reverse_cost := true/false -- エッジに逆コストがあるかどうかを指定
);

この関数は、指定されたエッジテーブル内のエッジを使用して最短経路を見つけます。始点と終点のノードIDの配列と、経由地のノードIDの配列が指定されます。また、エッジが有向か無向か、およびエッジに逆コストがあるかどうかを指定することもできます。

このようにして、pgr_dijkstraVia()は指定された経由地を通過する最短経路を見つけることができます。

You
pgr_dijkstraCost()は、どういうAPIですか
ChatGPT
ChatGPT

pgr_dijkstraCost()は、PostGISのpgRoutingエクステンションで提供されるAPIの一つで、指定された始点と終点間の最短経路を見つけるために使用されます。しかし、pgr_dijkstra()とは異なり、この関数は経路を探す際にエッジのコスト(距離、時間、または任意の重み付け)を考慮します

この関数は、始点と終点のノードIDを指定し、エッジのコストを計算するための重みのカラムを指定します。その後、指定された始点から終点までの最短経路を見つけます。

基本的な使い方は次のとおりです:

sql

SELECT * FROM pgr_dijkstraCost(
'edge_table', -- エッジテーブル
ARRAY[start_node], -- 始点のノードIDの配列
ARRAY[end_node], -- 終点のノードIDの配列
cost_column := 'cost', -- エッジのコストを示すカラム名
directed := true/false -- エッジが有向か無向かを指定
);

この関数は、指定されたエッジテーブル内のエッジを使用して、始点から終点までの最短経路を見つけます。エッジのコストは、指定されたカラムに基づいて計算されます。また、エッジが有向か無向かを指定することもできます。

これにより、指定された始点から終点までの最短経路とその経路の合計コストが返されます。

2024,江端さんの技術メモ

Posted by ebata