pgRouting为什么不返回最佳路径?


Answers:


7

这就是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字段,请对其进行更改。


2

该问题已经在前面的答案中进行了描述。这是“基于顶点”的最短路径算法的问题,它只关心源和目标。

问题跟踪器中有票证,还有一个可能的解决方案来更改算法实现: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

如果这会影响性能,则需要尝试一下。


昨天我建立了trsp函数,看起来没有这个问题。无论如何,谢谢您的解释!
何塞·亚历杭德罗·

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.