【问题标题】:Custom graph distance in Boost dijkstra_shortest_pathsBoost dijkstra_shortest_paths 中的自定义图形距离
【发布时间】:2015-04-30 18:43:32
【问题描述】:

我认识其他人have asked similar questions,但这个略有不同。

我需要将距离计算为距离根节点的权重和节点数的组合。

所以如果图表是 A->20 ft->B->10 ft->C 那么通常你会计算A->B 之间的距离为 20 英尺,A->C 之间的距离为 30 英尺,但我想放大通过另一个节点跳跃的成本。

所以假设每次你跳过另一个节点,成本加倍,所以 A->B 距离是 20 英尺,B->C 距离是 10英尺,但 A->C 是 20 英尺 + 2*10 英尺 = 40 英尺

boost 的 Dijkstra 最短路径可以实现吗?

【问题讨论】:

  • 我不认为内置的 dijkstra 算法可以处理这些类型的多重约束。不过我可能是错的。
  • 我认为这个paper 描述了一个类似的问题。它可能会给你一些想法。
  • 感谢@pbible。我对这篇论文投了赞成票,但看起来这个想法没有答案。我猜这是一个有趣的问题,只是在提升方面并不简单。
  • 没问题。还找到了this one。我不确定它是否完全相同,但表明它是 NP-Hard。您可能不得不接受一个不太理想的解决方案。你我找到敏。生成树启发式很有帮助。
  • @pbible 我正在考虑为 djikstra 编写我自己的访问者,因为 boost 允许你这样做。就像所有 BGL 一样,这似乎是一种巨大的痛苦

标签: c++ boost customization dijkstra boost-graph


【解决方案1】:

您可以通过自定义距离来做到这一点。

例如,您可以将每条边的成本加倍,但源自“源”的边除外。它可以通过具有operator[](edge_descriptor e) const 的简单内联类“即时”实现。然后,您将此类作为距离图传递给 Dijkstra 或其他最短路径算法。

对于某些应用程序,您希望每个节点都有固定成本(例如“红绿灯处的预期加权时间”)。在这里,您将这些节点权重保留在某个地方。然后定义一个内联类,在其operator[](edge e) const 中添加边权重和边源权重,除非边从 Dijkstra“源”开始。最后,您将此类的一个对象作为 Dijkstra 距离图传递给您最喜欢的 BGL 例程。

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多