【问题标题】:QuickGraph - How can I make A* to skip particular edges?QuickGraph - 我怎样才能让 A* 跳过特定的边缘?
【发布时间】:2013-01-13 16:29:37
【问题描述】:

我进行了一个寻路库。 QuickGraph,开放式图形库,符合我的所有要求,但我遇到了一个问题。我需要最短路径算法来跳过当前移动代理无法通过的边缘。我想要的是这样的:

Func<SEquatableEdge<VectorD3>, double> cityDistances = delegate(SEquatableEdge<VectorD3> edge)
{

    if(edge.IsPassableBy(agent))
        return edgeWeight; // Edge is passable, return its weight
    else
        return -1; // Edge is impassable, return -1, which means, that path finder should skip it

};

Func<VectorD3, double> heuristic = ...;

TryFunc<VectorD3, IEnumerable<SEquatableEdge<VectorD3>>> tryGetPath = graph2.ShortestPathsAStar(cityDistances, heuristic, sourceCity);

我可以想象通过创建一个图的副本并删除不可通过的边来解决这个问题,但这对计算机资源来说是不必要的浪费。请有人告诉我如何解决这个问题?还是没有解决办法,我应该更新源?

【问题讨论】:

  • 一个快速的技巧是让不可通过的边的权重大于真实最短路径的总权重。 A* 算法将始终将包含“不可通过”边的路径移动到优先级队列的末尾,并找到真正的最短路径。这种方法的缺点是,如果到达目标的每条路径都穿过一条“不可逾越”的边缘,那么被破解的算法将选择一条路径,而不是做正确的事情并失败
  • @EricLippert 解决该解决方法的方法可能是您检查生成的路径长度,如果它大于您的“不可通过”边缘权重,您会认为它找不到路径。
  • 如果你想指定一个自定义方法距离检索方法,像DelegateIncidenceGraph这样的东西不就是为了做你需要的吗?

标签: c# graph path-finding quickgraph


【解决方案1】:

鉴于您的权重是double 类型,您应该能够使用double.PositiveInfinity 作为不可通过边的权重。

正如 Eric Lippert 所说,高权重的失败案例是一条完整的路径,但是 double.PositiveInfinity 的任何加法或减法都应该是无限的。 double 类型有一个 IsPositiveInfinity 方法来测试。

因此,尝试将不可通过的权重设置为无穷大并测试最终路径长度。

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多