c++ - 按动态条件/约束过滤图表

标签 c++ graph-theory boost-graph

我正在研究一种可以为机器人进行双向规划的图结构。
但不仅是双向,因此它可以从 A 到 B,也可以从 B 到 A,同时还要考虑方向。因此在某些场景下机器人只能沿着边缘向后移动。

看这个例子: example

从4开始,我可以朝着1前进。
但从 1 开始到 4,我需要采取路径 1>2>3>4,其中 3 是我可以改变方向的节点。就像一辆单向倒退的汽车,使用 parking 场来掉头。

所以我有一些限制

  • 我只能打开特定节点
  • 规划节点时需要考虑机器人方向(节点有方向)

一个想法是在规划之前使用机器人的当前方向和目标方向来过滤图形。但我还不确定这是否可能。

我的另一个想法是不过滤,而是对整个图表进行规划。

但我通常不确定我的规划器(现在是 Dijkstra)是否可以处理它,因为在规划过程中机器人的方向可以改变,就像在节点 3 中一样。

如果有人能给我一些一般性提示(如果这是一个好主意或者您可以将我推向正确的方向),我会很高兴。

最佳答案

我想说,您需要将图表分成两部分,一张包含所有前向链接,另一张包含所有后向链接。然后,这两个图可以在可以转向的节点处连接起来,并且具有零成本链接。

从您的示例图中:

Forward links

1F - 2F
2F - 4F
4F - 3F

Backwards links

1B - 2B
2B - 3B

Turning links

3F - 3B

从 1F 开始,瞄准 3F 或 3B,Dijsktra 会发现

1F - 2F - 4F - 3F - 3B

最终可以简化为

1 - 2 - 4 - 3

机器人从 1 开始面向前并前往 4 时的示例输出(机器人可以通过 2 直接到达那里)

C:\Users\James\code\unirobot\bin>unirobot.exe inforward.txt
unirobot
l 1 2 0
l 2 3 2
l 2 4 1
l 4 3 1
t 3
s 1 f
g 4
4 bidirectional links input

Forward links
1f - 2f
2f - 4f
4f - 3f

Back links
1b - 2b
2b - 3b

Turning Links
3f - 3b

Combined graph links
(1f,2f) (2f,1f) (2f,4f) (4f,2f) (4f,3f) (3f,4f) (3f,3b) (1b,2b) (2b,1b) (2b,3b) (3b,2b) (3b,3f)

Path: 1f -> 2f -> 4f ->

从 1 开始面向后并前往 4 时的示例输出(机器人需要经过节点 3,这是它唯一可以掉头的地方)

C:\Users\James\code\unirobot\bin>unirobot.exe inbackward.txt
unirobot
l 1 2 0
l 2 3 2
l 2 4 1
l 4 3 1
t 3
s 1 b
g 4
4 bidirectional links input

Forward links
1f - 2f
2f - 4f
4f - 3f

Back links
1b - 2b
2b - 3b

Turning Links
3f - 3b

Combined graph links
(1f,2f) (2f,1f) (2f,4f) (4f,2f) (4f,3f) (3f,4f) (3f,3b) (1b,2b) (2b,1b) (2b,3b) (3b,2b) (3b,3f)

Path: 1b -> 2b -> 3b -> 3f -> 4f ->

生成此输出的代码位于 https://github.com/JamesBremner/unirobot

关于c++ - 按动态条件/约束过滤图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67316885/

相关文章:

c++ - 为什么 Boost Graph Library 的 `source()` 是一个全局函数?

c++ - BGL 中顶点迭代器的度数

c++ - 编写自己的 STL 容器

c++ - 我的代码中的 return 语句不准确

c++ - Djikstra的实现似乎与理论复杂性不符

java - 图最小权重路径

c++ - 如何针对自定义 gcc 库强制 cmake 链接

使用将在派生构造函数中构造的参数调用的 C++ 基本构造函数

确定2个图是否同构的算法

c++ - 从 boost::labeled_graph 获取节点标签