提升图形库:资源受限的最短周期

Boost Graph Library: shortest cycle with resource constraints

本文关键字:周期 图形库 资源      更新时间:2023-10-16

>问题

在具有任意弧长(行程时间、成本(的有向图中,找到最短(最快、最便宜(的循环(或没有重复顶点的闭合行走(。或者,找到通过给定顶点的最短周期。

走向解决方案

提升图库的r_c_shortest_paths解决了这个确切的问题......最短路径。 该示例清楚地演示了它的用法。

尽管尝试了几种方法,但无法有效地使用r_c_shortest_paths来解决上述问题。

问题

是否可以使用r_c_shortest_paths来解决此问题?如果是这样,如何?

另一种BGL算法?

另一个C++图库?

谢谢

如果你不想写一些东西,比如从原点到达的图的完整遍历(这可能不是那么糟糕或那么难(,这里阻力最小的路径,特别是考虑到你的图是定向的,可能是只在原点的每个邻居上使用r_c_shortest_paths(在正确方向的意义上(。假设一个实现,它将是这样的:

std::vector<Path<Nodes>> best_paths;
size_t first_step = -1;
for(auto&& [neighbor, weight] : boost::zip(origin.neighbors(), origin.weights())) {
auto paths = r_c_shortest_paths(neighbor, origin);
if(!paths.empty() && (best_paths.empty() || paths[0].cost + weight < best_paths[0].cost + first_step)) {
best_paths = paths
first_step = weight
}
}

事实证明,优秀的 Boost 库有解决方案,r_c_shortest_paths函数能够做到这一点......我猜只需要在文档上花费足够的时间。

周期

从文档中的伪代码可以看出,当资源约束或支配函数命中时,算法会停止扩展路径。在下一步中检查是否已到达终端节点。因此,使用相同的顶点作为开始和结束允许列出周期。