C++ 正在BGL中恢复a-star搜索

C++ 正在BGL中恢复a-star搜索,c++,a-star,boost-graph,C++,A Star,Boost Graph,我在一个部分(?)隐式的图上运行一个astar算法——它是从一个大的分页数据源构建的,但是这个图是持久的。每当astar算法到达一个没有完全分页的区域时,我需要处理图的新部分中的分页—理想情况下不需要完全启动astar搜索 我尝试了一些解决方案,但遇到了一些障碍,我想知道我是否遗漏了一些明显的东西,或者只是处理问题时出错了 我目前正在使用Boost1.45,但计划升级到1.51 首先,我尝试修改astar访问者,以便当它确定需要分页新数据时,调用图形上的函数并将其加载-但是,由于图形是常量,这是

我在一个部分(?)隐式的图上运行一个astar算法——它是从一个大的分页数据源构建的,但是这个图是持久的。每当astar算法到达一个没有完全分页的区域时,我需要处理图的新部分中的分页—理想情况下不需要完全启动astar搜索

我尝试了一些解决方案,但遇到了一些障碍,我想知道我是否遗漏了一些明显的东西,或者只是处理问题时出错了

我目前正在使用Boost1.45,但计划升级到1.51

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

其次,我想当我到达一个需要分页更多数据的地方时,我可能能够退出该算法,并保存距离图、前置图和颜色图的状态,以便使用astar\u search\u no\u init“恢复”搜索。我不确定这是否有效,因为一旦我切换到使用astar_search_no_init,我会看到,虽然访问者似乎在做寻路工作,但前置映射是空的——因为我在访问者完成后使用前置映射来构建路径,我需要知道访问者是如何构建路径的

下面是我的图的定义,以及我如何调用astar_搜索,如果这有帮助的话

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
typedef邻接列表<
vecS,
vecS,
无方向的,
VertexInfo,//包含地理位置
EdgeInfo,//包含重量信息
没有财产,
设置>
助推器;
...
ColorMap cmap=get(顶点颜色,myGraph);
阿斯塔鲁搜索(
我的图表,
来源:,
距离启发式(myGraph,destination),//几何距离启发式
前置映射(&srcPredmap[0])。
距离映射(&distMap[0])。
颜色映射(cmap)。
visitor(astar\u goal\u visitor(destination,this))。//在找到目标时引发异常
权重映射(make\u function\u property\u map(//复制了boost 1.51中的make\u function\u property\u map功能,因为我还不能升级
EdgeWeightAdjulator(&myGraph,weightFactors))//基于权重因子构造修改边权重
您写道:“但是,因为图形是常量,所以这是不可能的……”那么简单的转换(事件转换为旧的C-CAST)又如何呢?您应该至少尝试一下这个选项。修改图形可能会使迭代器无效,等等。这是正确的。尽管如此,你还是应该试试


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

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