提升BGL Dijkstra最短路径

时间:2015-03-16 19:16:46

标签: c++ algorithm boost graph

我不熟悉boost库并试图学习。我使用了boost图形库调用dijstra的最短路径函数来查找地图中目的地的路径。顶点是交叉点,边缘是街道段。

我发现最短时间的最短路径。为此,我将边权重定义为时间,时间= st段长度*其速度/限制。这确实给了我最短的路径(按时间)。 然而,我还要考虑一个回合,并为每个回合增加15秒。我如何检测一个转弯被给出两个街道段(边缘),如果第二个的st名称不等于第一个的st名称,则它是转弯。

基本上,我想动态分配权重(不只是在开头设置权重,就像我在这里做的那样)。当程序在搜索期间访问边缘时,我希望在此阶段检查父项(或此处的前辈)。如何在可以执行此操作的参数中传递函数或其他内容?

vector<unsigned>  OurGraph::find_awesome_path(unsigned start, unsigned finish)
{

    // start and finish are intersection IDs,
    // Get the corresponding Vertices in the graph. 
    Vertex start_node = vertex_map[start]; 
    Vertex dest_node = vertex_map[finish];   

    std::vector<Vertex> predecessors(boost::num_vertices(my_graph)); // To store parents
    std::vector<float> distances(boost::num_vertices(my_graph)); // To store dijkstra distances

    IndexMap indexMap = boost::get(boost::vertex_index, my_graph);
    PredecessorMap predecessorMap(&predecessors[0], indexMap);
    DistanceMap distanceMap(&distances[0], indexMap);

    boost::dijkstra_shortest_paths(my_graph, start_node, boost::distance_map(distanceMap).predecessor_map(predecessorMap));
vector<Edge> path;

    path = get_edge_path(dest_node, predecessorMap);    // Extracts edges from edge descriptors in predecessor map
                                                    // and piles them in a vector of Edge. 
    return segment_list_from_edges(path);           // Convert edges to street segment IDs and return.
}

其中 my_graph 图形图形,Vertex,Edge,IndexMap,PredecessorMap DistanceMap 是类型定义如下:

typedef boost::property<boost::edge_weight_t, float> WeightProperty;
typedef boost::property<boost::vertex_name_t, unsigned> IntersectionProperty;  
typedef boost::adjacency_list < boost::listS, boost::vecS, boost::directedS,
  IntersectionProperty, WeightProperty > Graph;
typedef boost::graph_traits < Graph >::vertex_descriptor Vertex;
typedef boost::graph_traits < Graph >::edge_descriptor Edge;
typedef boost::property_map < Graph, boost::vertex_index_t >::type IndexMap;
typedef boost::iterator_property_map < Vertex*, IndexMap, Vertex, Vertex& > PredecessorMap;
typedef boost::iterator_property_map < float*, IndexMap, float, float& > DistanceMap;

1 个答案:

答案 0 :(得分:0)

您可以这样做的一种方法是使用差分图。在这种情况下,差分图中的每个顶点都等于当前图中的边。因此,例如,顶点将封装转弯。然后,您可以向边缘添加转弯权重,这涉及街道名称的更改(或用于确定转弯的任何机制。)