【问题标题】:Resuming an a-star search in BGL在 BGL 中恢复 a-star 搜索
【发布时间】:2012-09-23 21:28:54
【问题描述】:

我在部分 (?) 隐式的图上运行 astar 算法 - 它是从大型分页数据源构建的,但图是持久的。每当 astar 算法到达未完全分页的区域时,我都需要在图表的新部分中处理分页 - 理想情况下无需完全重新开始 astar 搜索。

我尝试了几种解决方案,但遇到了一些障碍,我想知道我是否遗漏了一些明显的东西,或者只是错误地解决了问题。

我目前正在使用 boost 1.45,但计划升级到 1.51。

首先,我尝试修改 astar 访问者,以便当它确定需要在新数据中分页时,它会调用图形上的一个函数并将其加载 - 但是,由于图形是 const,这是不可能的。我环顾四周,发现另一个问题boost implicit graph and astar_search_no_init 引用了一个演示文稿,该演示文稿表明有人已经完成了使这成为可能的工作,但看起来实际代码不可用。

其次,我想当我到达需要分页更多数据的地方时,我可能能够退出算法,并保存 distance_map、previous_map 和 color_map 的状态,以便我可以使用它们来“继续”使用 astar_search_no_init 进行搜索。我不确定这是否可行,因为一旦我切换到使用 astar_search_no_init,我看到虽然访问者似乎在做寻路工作,但前任地图是空的 - 因为我使用前任地图来构建路径访问者完成后,我需要知道访问者是如何构建路径的。

这是我的图表的定义以及我如何调用 astar_search,如果有帮助的话。

typedef adjacency_list<
     vecS,         
     vecS,        
     undirectedS, 
     VertexInfo,        //contains geographic location     
     EdgeInfo,          //contains weight information             
     no_property,     
     setS>            
        BoostGraph;
...
ColorMap cmap = get(vertex_color_t, myGraph);           
astar_search(
     myGraph, 
     source,
     distance_heuristic(myGraph, destination), //geometric distance heuristic
     predecessor_map(&srcPredmap[0]).
     distance_map(&distMap[0]).
     color_map(cmap).
     visitor(astar_goal_visitor<vertex_descriptor>(destination, this)). //throws an exception when it finds the goal
     weight_map(make_function_property_map<edge_descriptor>(  //copied make_function_property_map functionality from boost 1.51 since I can't upgrade just yet
        EdgeWeightAdjuster(&myGraph, weightFactors))));       //modifies edge weights based on weightFactors construct

【问题讨论】:

  • “找到目标时抛出异常”的成语感觉很不幸。如果成功被认为是特殊的,那么这意味着失败被认为是自然的。
  • 该部分本质上是从示例中复制的,但它似乎是一种方便的方式——如果不是“正确”的话——让访问者在找到我希望它找到的顶点时退出,而不是遍历整棵树-在我的情况下这是不可能的。有没有更好的方法来做到这一点?
  • 我不知道为什么你的外部数据是这样的......但你不能为此使用内存映射文件,以便底层操作系统在必要时进行分页吗?我已经在 GraphHopper (Java) 中实现了这一点。为了提高效率,您是否还需要根据 Z 顺序或类似顺序对隐式图的节点进行排序?因为 A* 可能会在任何时候“随机”到达任何页面,并且通过排序可以减少“随机性”。
  • 如果你想要正确的 re: const-ness,你总是可以用一个非 const 引用来构造你的访问者作为成员。

标签: c++ a-star boost-graph


【解决方案1】:

您写道:“但是,由于图形是 const,这是不可能的……” 那么简单的 CAST(事件是旧的 C-cast)呢?您应该至少尝试一下这个选项。修改图可能会使迭代器等无效。这是真的。不过你还是应该试试。

“技术常数”和“概念常数”是有区别的。在你的情况下,你只会打破技术,而不是概念。

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2013-01-16
    • 2012-02-06
    • 2023-03-25
    • 2015-05-17
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多