Answers:
这就是shortest_path(Dijkstra的算法)在pgRouting中的行为。如果有两个边具有相同的源和目标,则使用随机边(确切地说:第一个边,它来自数据库)。我不知道有什么解决办法,但是有一些解决方法。
如果可能,应将这些边缘之一分成两个。我没有测试过,但是它应该可以解决该问题。
案例的其他解决方案,当您无法修改数据集时。将字段“ shorter_alternative”添加到表中。示例查询,根据您的需要进行修改。我希望它能解释这个主意:
UPDATE roads t1
SET shorter_alternative = t2.id
FROM roads t2
WHERE
((t2.source = t1.source AND t2.target = t1.target) OR
(t2.source = t1.target AND t2.target = t1.source)) AND
(t2.length < t1.length)
现在,边缘'0.098'将包含边缘'0.011'的ID。所有其他边在short_alternative字段中为null。进行shortest_path查询后,请检查返回的数据集-如果有任何行设置了short_alternative字段,请对其进行更改。
该问题已经在前面的答案中进行了描述。这是“基于顶点”的最短路径算法的问题,它只关心源和目标。
问题跟踪器中有票证,还有一个可能的解决方案来更改算法实现:https : //github.com/pgRouting/pgrouting/issues/34 (如果有人可以尝试并发送拉取请求,那就太好了;- )
如前所述,另一种可能性是拆分“平行道路链接”。或者,您可以使用“流星”算法,该算法从一条边到另一条边进行路由,因此它“知道”两条道路链接。
或者,您可以尝试按成本订购道路网,然后仅选择来源和目标的不同组合:
SELECT * FROM shortest_path(
'SELECT DISTINCT ON (source, target)
gid as id,
source::integer,
target::integer,
cost::double precision
FROM ways ORDER BY source, target, cost',
true,false
);
假定您搜索最便宜的路线。否则,您需要ORDER BY ... DESC
。
如果这会影响性能,则需要尝试一下。
我实际上已经为pgRouting创建了一个补丁,解决了这个问题:https : //github.com/pgRouting/pgrouting/issues/78