|
Boost : |
From: aalness_at_[hidden]
Date: 2001-01-25 16:10:25
Hello,
I've started experimenting with the BGL visitor pattern and am scratching
my head. I am doing a dijkstra search on a graph and pass it an internal
property map of ints for the weight map (I call it edge_manual_weight_t).
I have a visitor who's event filter is on_examine_edge(). When the visitor gets
called it searches an external weight map and if it finds a value in that for
the edge it does a put(edge_manual_weights, e, i->second) (i->second being the
weight it looked up), otherwise it uses the weight in the default edge_weight
property map. When I set weights in the external map I get odd results.
Say my search yields 1, 2, 3, 4 under normal circumstances (no manual
weighting). If I increase the weight of the edge between 1 and 2 the
search will yield 1, 2, 3, 4, 4, 4, 4. When I add edges I make sure I
put(edge_weights, e, <a positive integer>). My understanding is that the
search should yield a less-costly result or 1, 1, 1, 1, 2, 3, 4, this
udnerstanding may be flawed :)
Am I not getting something here or possily making a dumb mistake?
Here's my example code:
The search:
(namespace soni is #defined as std)
int
ProximityGraph::getDistance(BGP::ASN src, BGP::ASN dst, BGP::ASNList *path)
{
Vertex root, leaf;
ASNVertexMap::iterator i;
if ((i = iMap.find(dst)) != iMap.end())
root = i->second;
else
return -1;
if ((i = iMap.find(src)) != iMap.end())
leaf = i->second;
else
return -1;
soni::vector<int> distance( num_vertices(iGraph) );
soni::vector<default_color_type> color( num_vertices(iGraph) );
soni::vector<Vertex> predecessor( num_vertices(iGraph) );
predecessor[root] = root;
dijkstra_shortest_paths(iGraph, root, &distance[0], get(edge_manual_weight_t(), iGraph),
&color[0], get(vertex_index, iGraph),
make_ucs_visitor(soni::make_pair(record_predecessors(&predecessor[0],
on_edge_relaxed()), WeightVisitor(iWeights))));
if (color[leaf] != black_color)
return -1;
if (path) {
property_map<Graph, vertex_name_t>::type asns = get(vertex_name, iGraph);
Vertex parent = predecessor[leaf];
path->push_back(src);
for (int i = 0; i < distance[leaf]; i++) {
path->push_back(get(asns, parent));
parent = predecessor[parent];
}
}
return distance[leaf];
}
The visitor:
In the .h for the visitor: typedef boost::on_examine_edge event_filter;
void
ProximityGraph::WeightVisitor::operator()(Edge e, Graph &g)
{
property_map<Graph, edge_weight_t>::type givenWeights = get(edge_weight, g);
property_map<Graph, edge_manual_weight_t>::type manualWeights
= get(edge_manual_weight_t(), g);
EdgeWeightMap::iterator i = weights.find(e);
// if no manual weight, use BGP given weight
if (i == weights.end())
put(manualWeights, e, get(givenWeights, e));
// Else use the manual weight in the map
else
put(manualWeights, e, i->second);
return;
}
Thanks in advance!
-Andy
----------------------
Andrew Alness
Software Engineer
Sonicity, Inc.
aalness_at_[hidden]
"I want my two dollars." -kid on bike
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk